none
Ler arquivo Linha a linha RRS feed

  • Pergunta

  • Galera, 

    Na verdade o que eu preciso é ler um arquivo e trazer algumas informações deste arquivo.

    Exemplo: Eu tenho um Layout que diz que da 11º posição até 15º posição eu tenho determinado campo, da 16º posição até a 23º posição eu tenho outro campo. Baseado nessas informações eu preciso ler esse arquivo e trazer somente o valor de determinada posição.

    Alguém tem ideia de como eu posso fazer isso? Algum exemplo?


    Att Allan

    quarta-feira, 25 de abril de 2012 21:13

Respostas

  • public class Layout { public IList<ItemLayout> Items = new List<ItemLayout>(); public void AddItemLayout(Byte posicaoInicio, Byte posicaoFim, String nomeCampo) { Items.Add(new ItemLayout(posicaoInicio, posicaoFim, nomeCampo)); } }

     public class ItemLayout
        {
            public byte PosicaoInicio;
            public byte Tamanho;
            public string NomeCampo;
    
            public ItemLayout(byte posicaoInicio, byte tamanho, string nomeCampo)
            {
                this.PosicaoInicio = posicaoInicio;
                this.Tamanho = tamanho;
                this.NomeCampo = nomeCampo;
            }        
        }
        public class FileReader
        {
            public FileReader(String fileName, Layout layout)
            {
                this.fileName = fileName;
                this.layout = layout;
            }
    
            public string fileName { get; set; }
            public Layout layout { get; set; }
    
            public String LerArquivo()
            {
                StringBuilder sb = new StringBuilder();
                
                var lines = File.ReadAllLines(fileName);
    
                foreach (var linha in lines)
                {
                    StringBuilder sbLine = new StringBuilder();
    
                    foreach (var itemLayout in layout.Items)
                    {
                        sbLine.Append(
                            String.Format("{0}: {1}", itemLayout.NomeCampo, GetLinha(linha, itemLayout))
                        );
                    }
    
                    sb.AppendLine(sbLine.ToString());
                }
    
                return sb.ToString();
            }
    
            private String GetLinha(String linha, ItemLayout itemLayout)
            {
                var tamanho = itemLayout.PosicaoInicio + itemLayout.Tamanho;
    
                if (tamanho > linha.Length)
                    return linha.Substring(itemLayout.PosicaoInicio);
                else
                    return linha.Substring(itemLayout.PosicaoInicio, itemLayout.Tamanho);
            }
        }
    

    Montei essas classes rapidinho. Nao tem tratamento de erro nem considera caracteres especiais mas tem o basico e é escalonavel.

    Aqui um exemplo de uso:

      [TestMethod]
            public void LerArquivoTest()
            {
                var sourceFileName = @"LerArquivo\\Source.txt";
    
                Layout layoutLeitura = new Layout();
                layoutLeitura.AddItemLayout(1, 2, "Codigo");
                layoutLeitura.AddItemLayout(3, 9, " Nome");
                layoutLeitura.AddItemLayout(12, 10, " Sobrenome");
                layoutLeitura.AddItemLayout(26, 21, " Funcao");
    
                FileReader fileReader = new FileReader(sourceFileName, layoutLeitura);
    
                Console.WriteLine(fileReader.LerArquivo());
            }

    Para um arquivo de exemplo:

    12 Gustavo     Rocha     Arquiteto de Software

    13 Fulano                Funcionario

    25 Beltrano    Silva     Gerente



    Gustavo Rocha, MCTS, MCPD, CSM, CSPO Arquiteto de Software - http://subindoaladeira.wordpress.com/

    • Sugerido como Resposta Gustavo H Rocha quinta-feira, 26 de abril de 2012 00:33
    • Marcado como Resposta Allan Moreira quinta-feira, 26 de abril de 2012 02:08
    quinta-feira, 26 de abril de 2012 00:32

Todas as Respostas

  • que tipo de aplicao e esta, web?


    Se o amor fosse pecado, quem seria INOCENTE?

    quarta-feira, 25 de abril de 2012 21:16
    Moderador
  • É uma aplicação do tipo Windows Service.

    Att Allan

    quarta-feira, 25 de abril de 2012 21:18
  • Boa noite.

    Esse arquivo, é controlado por si? Não pode utilizar um xml em vez disso?

    quarta-feira, 25 de abril de 2012 22:16
  • Aiui, 

    É por que eu preciso ler um arquivo que é desta forma, eu tenho que ler este arquivo e gravar em outro arquivo.


    Att Allan

    quarta-feira, 25 de abril de 2012 22:22
  • public class Layout { public IList<ItemLayout> Items = new List<ItemLayout>(); public void AddItemLayout(Byte posicaoInicio, Byte posicaoFim, String nomeCampo) { Items.Add(new ItemLayout(posicaoInicio, posicaoFim, nomeCampo)); } }

     public class ItemLayout
        {
            public byte PosicaoInicio;
            public byte Tamanho;
            public string NomeCampo;
    
            public ItemLayout(byte posicaoInicio, byte tamanho, string nomeCampo)
            {
                this.PosicaoInicio = posicaoInicio;
                this.Tamanho = tamanho;
                this.NomeCampo = nomeCampo;
            }        
        }
        public class FileReader
        {
            public FileReader(String fileName, Layout layout)
            {
                this.fileName = fileName;
                this.layout = layout;
            }
    
            public string fileName { get; set; }
            public Layout layout { get; set; }
    
            public String LerArquivo()
            {
                StringBuilder sb = new StringBuilder();
                
                var lines = File.ReadAllLines(fileName);
    
                foreach (var linha in lines)
                {
                    StringBuilder sbLine = new StringBuilder();
    
                    foreach (var itemLayout in layout.Items)
                    {
                        sbLine.Append(
                            String.Format("{0}: {1}", itemLayout.NomeCampo, GetLinha(linha, itemLayout))
                        );
                    }
    
                    sb.AppendLine(sbLine.ToString());
                }
    
                return sb.ToString();
            }
    
            private String GetLinha(String linha, ItemLayout itemLayout)
            {
                var tamanho = itemLayout.PosicaoInicio + itemLayout.Tamanho;
    
                if (tamanho > linha.Length)
                    return linha.Substring(itemLayout.PosicaoInicio);
                else
                    return linha.Substring(itemLayout.PosicaoInicio, itemLayout.Tamanho);
            }
        }
    

    Montei essas classes rapidinho. Nao tem tratamento de erro nem considera caracteres especiais mas tem o basico e é escalonavel.

    Aqui um exemplo de uso:

      [TestMethod]
            public void LerArquivoTest()
            {
                var sourceFileName = @"LerArquivo\\Source.txt";
    
                Layout layoutLeitura = new Layout();
                layoutLeitura.AddItemLayout(1, 2, "Codigo");
                layoutLeitura.AddItemLayout(3, 9, " Nome");
                layoutLeitura.AddItemLayout(12, 10, " Sobrenome");
                layoutLeitura.AddItemLayout(26, 21, " Funcao");
    
                FileReader fileReader = new FileReader(sourceFileName, layoutLeitura);
    
                Console.WriteLine(fileReader.LerArquivo());
            }

    Para um arquivo de exemplo:

    12 Gustavo     Rocha     Arquiteto de Software

    13 Fulano                Funcionario

    25 Beltrano    Silva     Gerente



    Gustavo Rocha, MCTS, MCPD, CSM, CSPO Arquiteto de Software - http://subindoaladeira.wordpress.com/

    • Sugerido como Resposta Gustavo H Rocha quinta-feira, 26 de abril de 2012 00:33
    • Marcado como Resposta Allan Moreira quinta-feira, 26 de abril de 2012 02:08
    quinta-feira, 26 de abril de 2012 00:32
  • Gustavo,

    Sem palavras para agradecer pela força, ainda não implementei mais acho que você já me deu o caminho das pedras, muito obrigado mesmo pela força.

    Por falar nisso você pode poderia me dar um toque de algum artigo que eu possa ler a respeito de mais informações, algum site ou blog que recomenda para que eu possa aumentar o meu conhecimento em C#?

    Obrigado.


    Att Allan

    quinta-feira, 26 de abril de 2012 02:08

  •     public class FileReader
        {
            public FileReader(String fileName, Layout layout)
            {
                this.fileName = fileName;
                this.layout = layout;
            }
    
            public string fileName { get; set; }
            public Layout layout { get; set; }
    
            public String LerArquivo()
            {
                StringBuilder sb = new StringBuilder();
                
                var lines = File.ReadAllLines(fileName);
    
                foreach (var linha in lines)
                {
                    StringBuilder sbLine = new StringBuilder();
    
                    foreach (var itemLayout in layout.Items)
                    {
                        sbLine.Append(
                            String.Format("{0}: {1}", itemLayout.NomeCampo, GetLinha(linha, itemLayout))
                        );
                    }
    
                    sb.AppendLine(sbLine.ToString());
                }
    
                return sb.ToString();
            }
    
            private String GetLinha(String linha, ItemLayout itemLayout)
            {
                var tamanho = itemLayout.PosicaoInicio + itemLayout.Tamanho;
    
                if (tamanho > linha.Length)
                    return linha.Substring(itemLayout.PosicaoInicio);
                else
                    return linha.Substring(itemLayout.PosicaoInicio, itemLayout.Tamanho);
            }
        }

    Aproveitando o tópico.

    O que esse código faz na aplicação? Usei o restando do código e adaptei no meu projeto, mas esta parte eu não entendi.

    Não teria um modo mais pratico?

    sábado, 19 de maio de 2012 01:21
  • Leonardo, 

    Essa aplicação lê posição especificas de um arquivo texto, essa parte em especial verifica o parâmetros que eu coloquei no meu Layout e busca no arquivo.

    Esse método você pode usar em diversas situações caso queira lê um arquivo.

    Abrçs..


    Att Allan

    sábado, 19 de maio de 2012 01:34
  • A sim fiquei a noite toda analisando.

    Mas que formato isso está montando:

    foreach (var itemLayout in layout.Items)
                    {
                        sbLine.Append(
                            String.Format("{0}: {1}", itemLayout.NomeCampo, GetLinha(linha, itemLayout))
                        );
                    }

     

    Também tenho duvida de como executar o código em determinada linha Ex:


    Bloco1 123456789

    Bloco1 987654321

    Bloco1 654851784

    Bloco2 Nome Sobrenome

    Bloco2 Nome Sobrenome

    Bloco2 Nome Sobrenome

    Bloco3 Endereco

    Bloco3 Endereco

    Bloco3 Endereco

    Assim na estrutura de ler as linhas tenho que montar uma para cada bloco, mas não sei como faço para localizar o bloco e efetuar a leitura somente nele.

    Existe um método fácil para isso?


    sábado, 19 de maio de 2012 12:41
  • Leonardo, o arquivo .txt pode estar em qualquer formato, basta que você defina no método abaixo, as posições do arquivo que você quer ler

     public void LerArquivoTest()
            {
                var sourceFileName = @"LerArquivo\\Source.txt";
    
                Layout layoutLeitura = new Layout();
                layoutLeitura.AddItemLayout(1, 2, "Codigo");
                layoutLeitura.AddItemLayout(3, 9, " Nome");
                layoutLeitura.AddItemLayout(12, 10, " Sobrenome");
                layoutLeitura.AddItemLayout(26, 21, " Funcao");
    
                FileReader fileReader = new FileReader(sourceFileName, layoutLeitura);
    
                Console.WriteLine(fileReader.LerArquivo());
            }


    Att Allan

    sábado, 19 de maio de 2012 12:54
  • Acho que não expliquei direito. xD

    Essa parte eu entendi e até já mudei ela, mas o que precisava era ler somente o bloco que quero Ex txt:

     

    Bloco1 123456789

    Bloco1 987654321

    Bloco1 654851784

    Bloco2 Nome Sobrenome

    Bloco2 Nome Sobrenome

    Bloco2 Nome Sobrenome

    Bloco3 Endereco

    Bloco3 Endereco

    Bloco3 Endereco

     

    Preciso que o programa leia somente a linha 4, 5 e 6. Pois o restando dos blocos não tem as mesmas informação que o Bloco2, ou seja, a estrutura das linhas é diferente.

    Para isso eu tenho que saber onde começa o bloco2 e onde ele termina, porque cada txt vai ter a posição dos blocos diferente. Esses txt que estou lendo é os arquivos Cat52 da NFP.

     

    Desculpe se a pergunta foi besta, mas eu trabalho num escritório e queria montar um modulo para ajudar no meu serviço.

    sábado, 19 de maio de 2012 15:24