Jump to content

Archived

This topic is now archived and is closed to further replies.

Jean Freitas

gerar arquivo txt de acordo com layout pré-definido em c#

Recommended Posts

olá, sou no no fórum, me perdoem se fiz coisas errada...

 

bom, sou iniciante em c#, já fiz um curso presencial e estou no meio de outro via EAD, já assimilei bastante coisa, mas o problema está sendo colocar em prática, estou precisando criar um form que gere um arquivo TXT de acordo com um layout pré-definido pelo governo (SPED), ou seja, o governo já definiu como ele quer receber o arquivo ao enviar, alguém poderia me ajudar como fazer isso ou me indicar algum tutorial, vídeo, pesquisei e não achei nada e como sou iniciante não sei por onde começar... obrigado a todos

Share this post


Link to post
Share on other sites

obrigado por responderem e me ajudarem, li todo o material que me enviaram e entendi tudo, mas confesso que não sei por onde começar estou perido ainda, rsrrsrsrsr

uma coisa, é possível extrair os dados de um arquivo txt para complementar o arquivo que quero gerar para depois importar, ou seja, eu possuo um txt com dados do tipo nome do funcionario, data de pagamento e liquido a receber e gostaria de acrescentar esses dados para gerar o novo txt completo e pronto para a importação ou só dá pra fazer isso com um banco de dados e depois digitar os campos.

 

 

mais uma vez obrigado



Provavelmente os dados desse txt vai vim do banco certo ?

 

Já ouviu falar na classe XmlDocument

http://msdn.microsoft.com/pt-br/library/system.xml.xmldocument.aspx

 

obrigado Durbano, mas preciso criar em C# e é arquivo txt, mas valeu mesmo

Share this post


Link to post
Share on other sites

Sim totalmente possível, dê uma olhada em um projeto chamado Lotus, que contém algumas classes de leitura de textos que pode te ajudar, baixe a aplicação de exemplo:

 

http://www.lotusframework.blogspot.com

 

Basta importar a dll no projeto.

 

Há outros tutoriais, mas o ideal seria você pegar os dados e juntá-los em um texto delimitado com ";" ou "-" ou qualquer outro delimitador, depois você poderia usar a classe ReadDelimited da DLL do Lotus para ler este texto e separar os campos; Jogá-los em variáveis e depois criar um outro arquivo de texto delimitado com a mesma coisa.

 

Existem também métodos de serialização de objetos que eu descrevo aqui para este tumblr onde é possível guardar informações em XML ou binário e depois ler estas informações sem precisar de bancos de dados.

Share this post


Link to post
Share on other sites

Sim totalmente possível, dê uma olhada em um projeto chamado Lotus, que contém algumas classes de leitura de textos que pode te ajudar, baixe a aplicação de exemplo:

 

http://www.lotusframework.blogspot.com

 

Basta importar a dll no projeto.

 

Há outros tutoriais, mas o ideal seria você pegar os dados e juntá-los em um texto delimitado com ";" ou "-" ou qualquer outro delimitador, depois você poderia usar a classe ReadDelimited da DLL do Lotus para ler este texto e separar os campos; Jogá-los em variáveis e depois criar um outro arquivo de texto delimitado com a mesma coisa.

 

Existem também métodos de serialização de objetos que eu descrevo aqui para este tumblr onde é possível guardar informações em XML ou binário e depois ler estas informações sem precisar de bancos de dados.

 

 

KhaosDoctor, muito obrigado pelas informações, vou baixar e tentar fazer o que me falou... valeu e que Deus o abençoe!!!

Share this post


Link to post
Share on other sites

KhaosDoctor

 

Li o artigo que me indicou sobre a serialização e achei excelente, pelo pouco conhecimento que tenho acho que isso cabe direitinho no que preciso fazer, só para ver se estou certo, com a serialização em vez de digitar o nome e o número eu pegaria os dados de outro txt (por exemplo) e tento gerar de acordo com o padrões do layout, uma dúvida ele gera em binário é a mesma coisa que txt? não tenho certeza rsrsrsrs se for essa ideia mesmo só falta aprender a criar as delimitações e ler do arquivo...

 

valeu

Share this post


Link to post
Share on other sites

Então, se você for usar serialização você pode usar tanto binário como xml, só que ai você não vai precisar criar nada delimitado, você só vai precisar criar uma classe, imagine que essa classe chame "Texto", ai dentro da classe Texto você vai criar uma propriedade para cada campo que você quer gravar.

 

Vamos supor que você tenha, nome, endereço, email, telefone e data de nascimento, ai você vai criar 5 propriedades nesta classe, todas do tipo String, ai você pode seguir o tutorial e serializar essa classe em XML (Menos seguro, porém mais amplo) ou em Binário (Mais seguro, porém mais específico).

 

O botão de serialização que está no tutorial só vai mudar mesmo no numero de propriedades de cada item.

Share this post


Link to post
Share on other sites

Então, se você for usar serialização você pode usar tanto binário como xml, só que ai você não vai precisar criar nada delimitado, você só vai precisar criar uma classe, imagine que essa classe chame "Texto", ai dentro da classe Texto você vai criar uma propriedade para cada campo que você quer gravar.

 

Vamos supor que você tenha, nome, endereço, email, telefone e data de nascimento, ai você vai criar 5 propriedades nesta classe, todas do tipo String, ai você pode seguir o tutorial e serializar essa classe em XML (Menos seguro, porém mais amplo) ou em Binário (Mais seguro, porém mais específico).

 

O botão de serialização que está no tutorial só vai mudar mesmo no numero de propriedades de cada item.

Certo, minha dúvida está em como fazer para serializar apenas alguns campos do txt que tenho, por exemplo, no txt tem nome, endereço, email, telefone e data de nascimento, quero filtrar apenas nome e endereço e serializar em txt (ou binario se for mesma coisa) eu consegui atraves do tutorial filtrar a linha toda do txt, mas preciso de alguns campos nas linhas, o sistema que vai receber o arquivo só vai importar txt... desculpe se estou sendo repetitivo e estou demorando para pegar isso, pode ser simples para alguns, mas para um iniciante é um pouco confuso, rsrsrsrsrrssr de qualquer forma estou progredindo com sua ajuda, muito obrigado!!! Que Deus o abençoe..

Share this post


Link to post
Share on other sites

Ah sim, então será necessário ler o delimitado para pegar os valores. Agora, se todos os valores sempre tem a mesma sequencia basta você jogar tudo em um array (se você usar a função do Lotus isso não é necessário) e pegar o indice correspondente. depois você joga o índice na propriedade da variável correspondente e serializa a classe toda.

Share this post


Link to post
Share on other sites

Ah sim, então será necessário ler o delimitado para pegar os valores. Agora, se todos os valores sempre tem a mesma sequencia basta você jogar tudo em um array (se você usar a função do Lotus isso não é necessário) e pegar o indice correspondente. depois você joga o índice na propriedade da variável correspondente e serializa a classe toda.

ok, vou tentar isso também... só não consegui importar a dll do lotus ainda rsrrsr

Share this post


Link to post
Share on other sites

consegui gerar criando um metodo GerarArquivo, porém, preciso incluir nesse metodo as strings nomes, data e valor do laço foreach para gerar isso tambem no arquivo, segue abaixo código fonte do projeto teste se alguém puder me ajudar fico muito agradecido:

 

namespace projeto
{
public partial class Form1 : Form
{


public Form1()
{
InitializeComponent();
}

//private void btnsalvar_Click(object sender, System.EventArgs e)
//{
// GerarArquivo("exemploexporta.txt");

//}

public void GerarArquivo(string arquivo)
{
DirectoryInfo di = new DirectoryInfo(".");
string path = di.FullName + "\\" + arquivo;


StreamWriter sw = File.AppendText(path);

string novacoluna = "";
novacoluna += "LC1".PadRight(11);
novacoluna += "00000".PadRight(19);
novacoluna += "1".PadRight(3);
novacoluna += "35000CPR".PadRight(5);
novacoluna += "00201212".PadRight(14);
novacoluna += "0000002040".PadRight(5);
novacoluna += "00000".PadLeft(16);
novacoluna += "PAGO SALARIO REF. ".PadRight(240);

//novalinha += txtsequencia.Text + ";";
//novalinha += txtsequencia.Text + ";";



sw.WriteLine(novacoluna);

sw.Close();
}

public void btnlerarquivo_Click(object sender, EventArgs e)
{
DirectoryInfo di = new DirectoryInfo(".");
string path = di.FullName + "\\folha.txt";

string textocompleto = File.ReadAllText(path);

string[] colunas = File.ReadAllLines(path);

List<Funcionarios> listafuncionarios=new List<Funcionarios>();




int i = 0;
foreach (string coluna in colunas)
{
if (i>2)
{
string nome = coluna.Substring(25, 54).Trim();
string valor = coluna.Substring(120, 11).Trim();
string data = coluna.Substring(79, 11).Trim();


Funcionarios funcionarios=new Funcionarios();
funcionarios.Nome = nome;
funcionarios.Valor = valor;
funcionarios.Data = data;


listafuncionarios.Add(funcionarios);

GerarArquivo("exemploexporta.txt");

}

i++;
}



gridfuncionarios.DataSource = listafuncionarios;



}

 

obrigado

Share this post


Link to post
Share on other sites

Não entendi, você quer um foreach pra que?

Então, na verdade eu já tenho um foreach que faz o seguinte: vai no arquivo texto onde tenho os dados que quero filtrar como nome, valor e data e isso tá aparecendo no grid que criei para visualizar os dados da lista funcionários, porém, quero que isso gere dentro do meu arquivo com o método gerar. Exemplo: novacoluna += aí aqui colocaria as strings que estão no foreach ou então crio alguma coisa para ir no arquivo e filtrar os dados que já tenho como nome, valor e data...

 

Então, na verdade eu já tenho um foreach que faz o seguinte: vai no arquivo texto onde tenho os dados que quero filtrar como nome, valor e data e isso tá aparecendo no grid que criei para visualizar os dados da lista funcionários, porém, quero que isso gere dentro do meu arquivo com o método gerar. Exemplo: novacoluna += aí aqui colocaria as strings que estão no foreach ou então crio alguma coisa para ir no arquivo e filtrar os dados que já tenho como nome, valor e data...

ou então eu faria todos os campos aparecerem no grid e depois levo para o metodo, mas não estou conseguindo fazer o conteudo do grid ser gerado

Share this post


Link to post
Share on other sites

Caro KhaosDoctor, acho que consegui, deixei o metodo GerarArquivo da seguinte forma:

public void GerarArquivo(string arquivo)
{

DirectoryInfo dir = new DirectoryInfo(".");
string path1 = dir.FullName + "\\folha.txt";
//string textocompleto = File.ReadAllText(path1);

string[] colunas = File.ReadAllLines(path1);

Funcionarios funcionarios = new Funcionarios();

int i = 0;
foreach (string coluna in colunas)
{
if (i > 2)
{
string nome = coluna.Substring(25, 54).Trim();
string valor = coluna.Substring(120, 11).Trim();
string dia = coluna.Substring(79, 2).Trim();
string mes = coluna.Substring(82, 2).Trim();
string ano = coluna.Substring(85, 4).Trim();


funcionarios.Nome = nome;
funcionarios.Valor = valor;
funcionarios.Dia = dia;
funcionarios.Mes = mes;
funcionarios.Ano = ano;

}

i++;
}


DirectoryInfo di = new DirectoryInfo(".");
string path = di.FullName + "\\" + arquivo;


StreamWriter sw = File.AppendText(path);

string novacoluna = "";
novacoluna += "LC1".PadRight(3); //tipo
novacoluna += "00000".PadRight(5); //ordem
novacoluna += "1".PadLeft(4); //modo
novacoluna += funcionarios.Dia.PadRight(2);
novacoluna += funcionarios.Mes.PadRight(2);
novacoluna += funcionarios.Ano.PadRight(4);
novacoluna += "35000CPR".PadLeft(18); //lote
novacoluna += "00201212".PadLeft(35); //conta1
novacoluna += "0000002040".PadLeft(24); //conta2
novacoluna += "00000".PadLeft(19); //conta3
novacoluna += funcionarios.Valor.PadLeft(16);
novacoluna += "PAGO SALARIO A REF. " + txtReferencia.Text + ' ' + funcionarios.Nome.PadRight(240);


//novalinha += txtsequencia.Text + ";";
//novalinha += txtsequencia.Text + ";";



sw.WriteLine(novacoluna);

sw.Close();
}

 

só que agora está gerando tudo igual a ultima linha do arquivo que esta pegando a substring, não conseguiu identificar ainda o meu erro, parece que o sistema lê todas as linhas mas gera todas com os dados da ultima... obrigado pela atenção dispensanda

Share this post


Link to post
Share on other sites

Veja se a classe de funcionários está com as propriedades com os valores certos, coloque breakpoints nestas linhas e veja o resultado no monitor:

 

string nome = coluna.Substring(25, 54).Trim();
string valor = coluna.Substring(120, 11).Trim();
string dia = coluna.Substring(79, 2).Trim();
string mes = coluna.Substring(82, 2).Trim();
string ano = coluna.Substring(85, 4).Trim();


funcionarios.Nome = nome;
funcionarios.Valor = valor;
funcionarios.Dia = dia;
funcionarios.Mes = mes;
funcionarios.Ano = ano;

Share this post


Link to post
Share on other sites

fiz o que aconselhou e percebi que o programa agora não para no foreach dentro do metodo e aí agora cria varias linhas e todas repetidas, por exemplo, tenho 68 linhas para filtrar aí ele crias as 68 num loop sem fim, já tentei colocar um break no final mas aí não funciona a geração, acho que estou quase lá, só ta faltando acertar isso agora, segue abaixo fonte do local que o não para de executar:

 

int i = 0;
foreach (string coluna in linhas)
{
if (i > 2)
{
string nome = coluna.Substring(25, 54).Trim();
string valor = coluna.Substring(120, 11).Trim();
string dia = coluna.Substring(79, 2).Trim();
string mes = coluna.Substring(82, 2).Trim();
string ano = coluna.Substring(85, 4).Trim();

funcionarios.Nome = nome;
funcionarios.Valor = valor;
funcionarios.Dia = dia;
funcionarios.Mes = mes;
funcionarios.Ano = ano;


DirectoryInfo di = new DirectoryInfo(".");
string path = di.FullName + "\\" + arquivo;

StreamWriter sw = File.AppendText(path1);

string novacoluna = "";
novacoluna += "LC1".PadRight(3); //tipo
novacoluna += "00001".PadRight(5); //ordem
novacoluna += "1".PadLeft(4); //modo
novacoluna += funcionarios.Dia.PadRight(2);
novacoluna += funcionarios.Mes.PadRight(2);
novacoluna += funcionarios.Ano.PadRight(4);
novacoluna += "35000CPR".PadLeft(18); //lote
novacoluna += "00201212".PadLeft(35); //conta1
novacoluna += "0000002040".PadLeft(24); //conta2
novacoluna += "00000".PadLeft(19); //conta3
novacoluna += funcionarios.Valor.PadLeft(16);
novacoluna += "PAGO SALARIO REF. " + txtReferencia.Text + ' ' + funcionarios.Nome.PadRight(240);

sw.WriteLine(novacoluna);

sw.Close();

}

i++;

}

 

 

obrigado pela ajuda, que Deus o abençoe...

Share this post


Link to post
Share on other sites

Consegui gerar mudando o tirando o metodo GerarArquivo de dentro do foreach na leitura do arquivo, agora está gerando apenas as linhas que existem para o novo arquivo, ufaaa suei mas consegui, graças a ajuda KhaosDoctor, por ser novato demorei um pouco, mas chego lá.... devagar e sempre!!! Agora só preciso deixar o número de ordem 00001 em seguência, ou seja, para cada linha criada um numero de ordem (00001, 00002, 00003...)

novacoluna += "00001".PadRight(5); //ordem

 

vou contunuar tentando alinhar isso.

KhaosDoctor muito obrigado e se souber como faço para criar um número sequencial e usar na linha que quero e puder me ajudar de novo fico muito agradecido... obrigado mesmo

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.