none
Ler Arquivo, pesquisando uma palavra dele e gerando outro arquivo com classificação - por ordem de CEP RRS feed

  • Pergunta

  • Olá,

    preciso tirar algumas dúvidas em relação a pesquisa de arquivo e geração 
    de outro arquivo.

    Minha intenção é fazer leitura de arquivos à partir do C#
    Eu criei um programa que faz leituras e exporta as informações para outro 
    arquivo. O que eu preciso a princípio é o seguinte.:

    Eu preciso ler um arquivo, onde neste arquivo constam informações de
    Nome, Endereço, Bairro, CEP, Cidade, Estado, Valor do Documento, etc....
    acontece que eu preciso fazer a leitura deste arquivo tendo uma espécie 
    de filtro e esse filtro considerar algumas imposições para poder gerar 
    outro arquivo já higienizado, com registros válidos e por ordem de CEP.

    por exemplo:
    eu preciso ler o arquivo todo, mas eu preciso indicar ao leitor que a 
    linha que começa com o número 0 é o Header do arquivo e que as linhas 
    que começam com o número 1, 2, 3... até o número 9 são do mesmo registro, 
    quando volta a ser o número 1 ele já é outro registro, portanto eu
    preciso determinar que este número começa na coluna 1.

    Em cada registro eu preciso por exemplo ler na posição exata onde fica o 
    CEP e esta leitura deverá satisfazer a condição de CEPs válidos 
    (SERIA UM RANGE COM A NUMERAÇÂO INICIAL E FINAL DE CEP) e na sequência
    eu preciso classificar os registros em outro arquivo por ordem crescente 
    de CEP e assim por diante, ou seja, eu preciso de um empurrãozinho para 
    mim saber em C# Ler, Filtrar, Classificar e Gerar Arquivos.

    Muito agradecido

    David 


    domingo, 26 de janeiro de 2014 14:55

Respostas

  • Use essa classe:

    public class Leitura: IDisposable
    {
    	public int Id { get; set; }
    	public string Nome { get; set; }
    	public string Logradouro { get; set; }
    	public string Instrucoes { get; set; }
    	public string Cedente { get; set; }
    	public DateTime Vencimento { get; set; }
    	public decimal Valor { get; set; }
    	public string Header { get; set; }
    
    	public void Dispose()
    	{
    		GC.SuppressFinalize(this);
    	}
    }
    public class Leituras : ICollection<Leitura>, IDisposable
    {
    	private ICollection<Leitura> leituras;
    	public Leituras()
    	{
    		this.leituras = new List<Leitura>();
    	}           
    	public void Add(Leitura item)
    	{
    		this.leituras.Add(item);
    	}
    
    	public void Clear()
    	{
    		this.leituras.Clear();
    	}
    
    	public bool Contains(Leitura item)
    	{
    		return this.leituras.Contains(item);
    	}
    
    	public void CopyTo(Leitura[] array, int arrayIndex)
    	{
    		this.leituras.CopyTo(array, arrayIndex);
    	}
    
    	public int Count
    	{
    		get { return this.leituras.Count; }
    	}
    
    	public bool IsReadOnly
    	{
    		get { return false; }
    	}
    
    	public bool Remove(Leitura item)
    	{
    		return this.leituras.Remove(item);
    	}
    
    	public IEnumerator<Leitura> GetEnumerator()
    	{
    		return this.leituras.GetEnumerator();
    	}
    
    	System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    	{
    		return this.leituras.GetEnumerator();
    	}
    	public void Dispose()
    	{               
    		GC.SuppressFinalize(this);
    	}
    }

    No código execute dessa forma

    private void button3_Click(object sender, EventArgs e)
    {
    	Leituras leituras = new Leituras();
    	StreamReader strReader = new StreamReader(".\\Leitura.txt");
    	if (strReader != null)
    	{
    		String Linha = string.Empty;
    		String Header = string.Empty;
    		Leitura leitura = null;
    		int pos = 0;
    		while (strReader.Peek() != -1)
    		{
    			Linha = strReader.ReadLine();
    			if (!string.IsNullOrEmpty(Linha) && !string.IsNullOrWhiteSpace(Linha))
    			{
    				switch (Linha[0])
    				{
    					case '0': //Cabeçalho
    						{
    							Header = Linha.Substring(1).TrimStart().TrimEnd().Trim();                                    
    							break;
    						}
    					case '1': //Nome
    						{
    							leitura = new Leitura();
    							leitura.Id = ++pos;
    							leitura.Header = Header;
    							leitura.Nome = Linha.Substring(1, 50).TrimStart().TrimEnd().Trim();
    							leitura.Logradouro = Linha.Substring(51).TrimStart().TrimEnd().Trim();
    							break;
    						}
    					case '2':
    						{
    							leitura.Instrucoes = Linha.Substring(1).Trim().TrimEnd().TrimStart();
    							break;
    						}
    					case '3':
    						{
    							leitura.Cedente = Linha.Substring(1).Trim().TrimEnd().TrimStart();
    							break;
    						}
    					case '4':
    						{
    							DateTime _Venc;
    							if (DateTime.TryParse(Linha.Substring(4, 13), out _Venc))
    							{
    								leitura.Vencimento = _Venc;
    							}
    							Decimal _Val;
    							if (Decimal.TryParse(Linha.Substring(19).Trim().TrimEnd().TrimStart(), out _Val))
    							{
    								leitura.Valor = _Val;
    							}
    							leituras.Add(leitura);
    							break;
    						}                            
    				}
    			}
    		}
    	}
    }

    No Caso ele leu três itens e gerou por aquele formato a passado, se todos forem assim funciona essa rotina!

    Agora acredito que por suas pernas você consiga continuar, e é muito importante que continue!!!


    Fulvio Cezar Canducci Dias

    • Sugerido como Resposta Lucas D Santos segunda-feira, 27 de janeiro de 2014 14:29
    • Marcado como Resposta Giovani Cr sexta-feira, 31 de janeiro de 2014 14:26
    segunda-feira, 27 de janeiro de 2014 12:37

Todas as Respostas

  • //Para Ler um Arquivo
    StreamReader Lendo = new StreamReader(".\\Dado.txt");
    if (Lendo != null){
    	String Linha = string.Empty;
    	while (Lendo.Peek() != -1)
    	{
    		Linha = Lendo.ReadLine();
    	}
    	Lendo.Close();
    	Lendo.Dispose();
    }                               
    //
    //Para Gravar um Arquivo
    StreamWriter Gravar = new StreamWriter(".\\Gravar.txt");
    Gravar.WriteLine("-------------------------"); //Gravando arquivo
    Gravar.Close();
    Gravar.Dispose();

    Se eu fosse você eu criaria uma classe Base

    public class Dados
    {
    	public int Id { get; set; }
    	public string Nome { get; set; }
    	public String Endereco { get; set; }
    }

    Lógico que a sua classe base pode conter todos os campos pertinentes a sua pesquisa

    e cria no primeiro momento de leitura um Lista desses itens assim

    IList<Dados> ListaDados = new List<Dados>();
    ListaDados.Add(new Dados()
    {
    	Id = 1,
    	Nome = "Nome 1",
    	Endereco = "Endereco 1"
    });

    Ai você poderia trabalhar com o linq para filtrar e impor suas regras!!!

    http://msdn.microsoft.com/pt-br/library/jj128159.aspx

    http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

    Bom seria, essa um das lógica de processo!!!

    Como você não colocou a Regra de negocio nem a cópia do arquivo com alguns exemplos fica dificil ir a diante!

    !


    Fulvio Cezar Canducci Dias

    domingo, 26 de janeiro de 2014 20:31
  • Olá Fúlvio,
    gostaria de agradecer muito por me ajudar nesta questão.
    Abaixo eu colei uma parte do arquivo de massa de dados onde eu devo fazer a leitura e depois exportar para outro arquivo.
    veja que logo na primeira linha, ele vem com o número 0 e na sequencia o nome da empresa.
    Na linha abaixo ele começa com o número 1 e o nome da pessoa, na linha de baixo o número 2 e as instruções do caixa e assim por diante.
    O que eu preciso fazer é, informar ao programa que neste caso de arquivo, eu preciso ler uma única vez a linha que começa com o número 0 pois essa é a empresa que está cobrando todos os clientes.
    E as linhas que começam com os números 1, 2, 3 e 4 representam os dados de 1 cliente, e eu preciso que o programa busque dentro destas linhas 1, 2, 3 e 4 informações que eu preciso exportar para outro arquivo.
    Porém o mais importante, e é isto que eu não estou conseguindo é informar ao programa que eu quero pegar por exemplo:
    Da Linha que começa com o número 1, na Posição 2 até a Posição 51 - Fazer que o programa leia o que está nesta posição e tamanho e jogue para uma variável NOME.
    Da Linha que começa com o número 1, na posição 52 até a posição 111 - Fazer que o programa leia o que está nesta posição e tamanho e jogue para uma variável LOGRADOURO.
    Da Linha que começa com o número 2, na posição 2 até a posição 51 - Fazer que o programa leia o que está nesta posição e tamanho e jogue para uma variável INSTRUCOES.
    Da Linha que começa com o número 3, na posição 2 até a posição 51 - Fazer que o programa leia o que está nesta posição e tamanho e jogue para uma variável CEDENTE.
    Da Linha que começa com o número 4, na posição 5 até a posição 14 - Fazer que o programa leia o que está nesta posição e tamanho e jogue para uma variável VENCIMENTO.
    Da Linha que começa com o número 4, na posição 21 até a posição 30 - Fazer que o programa leia o que está nesta posição e tamanho e jogue para uma variável VALOR_DOCTO.
    É esse tipo de ordem ao programa que eu não sei como executar um programa que faça a leitura em locais determinados com a POSIÇÃO INICIAL E FINAL.



    0Systemcred-Soluções em Rec. Ativos e Telemarketing04.629.140/0001-84    12082013                                                              
    1PATRICIA DIAS DO NASCIMENTO                       R U QD 37 CS  37 CS 09  09                                  JD BRASIL                CUIABA 
    2SR. CAIXA NÃO RECEBER APÓS O VENCIMENTO.                                                                                                    Ap
    3SystemCred - Soluções em rec. de ativos e telem.
    401 14/03/2013      331,70                                                                                                                     
    1LEONORA BATISTA DOS SANTOS                        R CEREJERAS   75                                            RETIRO                   ESMERAL
    2SR. CAIXA NÃO RECEBER APÓS O VENCIMENTO.                                                                                                    Ap
    3SystemCred - Soluções em rec. de ativos e telem.
    401 30/09/2012      615,95                                                                                                                     
    1JOAO DE OLIVEIRA DA ROCHA                         RUA CLEMENTE BONIFACIO    175 CS 74                         VILA ORATORIO            SAO PAU
    2SR. CAIXA NÃO RECEBER APÓS O VENCIMENTO.                                                                                                    Ap
    3SystemCred - Soluções em rec. de ativos e telem.
    401 09/05/2013     2064,29                                                                                                                     

    grato,

    segunda-feira, 27 de janeiro de 2014 09:32
  • Use essa classe:

    public class Leitura: IDisposable
    {
    	public int Id { get; set; }
    	public string Nome { get; set; }
    	public string Logradouro { get; set; }
    	public string Instrucoes { get; set; }
    	public string Cedente { get; set; }
    	public DateTime Vencimento { get; set; }
    	public decimal Valor { get; set; }
    	public string Header { get; set; }
    
    	public void Dispose()
    	{
    		GC.SuppressFinalize(this);
    	}
    }
    public class Leituras : ICollection<Leitura>, IDisposable
    {
    	private ICollection<Leitura> leituras;
    	public Leituras()
    	{
    		this.leituras = new List<Leitura>();
    	}           
    	public void Add(Leitura item)
    	{
    		this.leituras.Add(item);
    	}
    
    	public void Clear()
    	{
    		this.leituras.Clear();
    	}
    
    	public bool Contains(Leitura item)
    	{
    		return this.leituras.Contains(item);
    	}
    
    	public void CopyTo(Leitura[] array, int arrayIndex)
    	{
    		this.leituras.CopyTo(array, arrayIndex);
    	}
    
    	public int Count
    	{
    		get { return this.leituras.Count; }
    	}
    
    	public bool IsReadOnly
    	{
    		get { return false; }
    	}
    
    	public bool Remove(Leitura item)
    	{
    		return this.leituras.Remove(item);
    	}
    
    	public IEnumerator<Leitura> GetEnumerator()
    	{
    		return this.leituras.GetEnumerator();
    	}
    
    	System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    	{
    		return this.leituras.GetEnumerator();
    	}
    	public void Dispose()
    	{               
    		GC.SuppressFinalize(this);
    	}
    }

    No código execute dessa forma

    private void button3_Click(object sender, EventArgs e)
    {
    	Leituras leituras = new Leituras();
    	StreamReader strReader = new StreamReader(".\\Leitura.txt");
    	if (strReader != null)
    	{
    		String Linha = string.Empty;
    		String Header = string.Empty;
    		Leitura leitura = null;
    		int pos = 0;
    		while (strReader.Peek() != -1)
    		{
    			Linha = strReader.ReadLine();
    			if (!string.IsNullOrEmpty(Linha) && !string.IsNullOrWhiteSpace(Linha))
    			{
    				switch (Linha[0])
    				{
    					case '0': //Cabeçalho
    						{
    							Header = Linha.Substring(1).TrimStart().TrimEnd().Trim();                                    
    							break;
    						}
    					case '1': //Nome
    						{
    							leitura = new Leitura();
    							leitura.Id = ++pos;
    							leitura.Header = Header;
    							leitura.Nome = Linha.Substring(1, 50).TrimStart().TrimEnd().Trim();
    							leitura.Logradouro = Linha.Substring(51).TrimStart().TrimEnd().Trim();
    							break;
    						}
    					case '2':
    						{
    							leitura.Instrucoes = Linha.Substring(1).Trim().TrimEnd().TrimStart();
    							break;
    						}
    					case '3':
    						{
    							leitura.Cedente = Linha.Substring(1).Trim().TrimEnd().TrimStart();
    							break;
    						}
    					case '4':
    						{
    							DateTime _Venc;
    							if (DateTime.TryParse(Linha.Substring(4, 13), out _Venc))
    							{
    								leitura.Vencimento = _Venc;
    							}
    							Decimal _Val;
    							if (Decimal.TryParse(Linha.Substring(19).Trim().TrimEnd().TrimStart(), out _Val))
    							{
    								leitura.Valor = _Val;
    							}
    							leituras.Add(leitura);
    							break;
    						}                            
    				}
    			}
    		}
    	}
    }

    No Caso ele leu três itens e gerou por aquele formato a passado, se todos forem assim funciona essa rotina!

    Agora acredito que por suas pernas você consiga continuar, e é muito importante que continue!!!


    Fulvio Cezar Canducci Dias

    • Sugerido como Resposta Lucas D Santos segunda-feira, 27 de janeiro de 2014 14:29
    • Marcado como Resposta Giovani Cr sexta-feira, 31 de janeiro de 2014 14:26
    segunda-feira, 27 de janeiro de 2014 12:37
  • Fúlvio,

    Você é demais.....

    Acertou em cheio o que eu queria. Pode deixar que vou dar continuidade daqui por diante.

    Agradeço demais por ter me ajudado

    David

    segunda-feira, 27 de janeiro de 2014 14:24
  • Olá David, boa tarde!

    Você consegui "ordenar" o seu arquivo ?


    Gilberto Herminio Analista de Desenvolvimento de Sistemas Mogi das Cruzes-SP desenvolvedor.ti@r7.com / gil_haf@ig.com.br

    segunda-feira, 27 de janeiro de 2014 15:14