//Método LerLinha(): processa uma linha de um arquivo .csv, transformando Stream em CsvLinha public bool LerLinha(CsvLinha linha, char separator) { //tenta ler arquivo try { //se arquivo vazio, termina linha.TextoLinha = ReadLine(); if (String.IsNullOrEmpty(linha.TextoLinha)) { return(false); } int pos = 0; int linhaAtual = 0; //itera por cada caracter do arquivo while (pos < linha.TextoLinha.Length) { string valor; //trata os casos em que o elemento atual da leitura é ' " ' if (linha.TextoLinha[pos] == '"') { pos++; //marca inicio das aspas e busca final int start = pos; while (pos < linha.TextoLinha.Length) { //encontrando o par da ", termina busca if (linha.TextoLinha[pos] == '"') { pos++; //trata caso não exista par para as aspas duplas que iniciaram essa busca if (pos >= linha.TextoLinha.Length || linha.TextoLinha[pos] != '"') { pos--; break; } } pos++; } //adiciona \" no inicio e fim das aspas para que perteçam a string gerada valor = linha.TextoLinha.Substring(start, pos - start); valor = valor.Replace("\"\"", "\""); } //caso não sejam aspas else { //adiciona trecho sem aspas a string gerada int inicio = pos; while (pos < linha.TextoLinha.Length && linha.TextoLinha[pos] != separator) { pos++; } valor = linha.TextoLinha.Substring(inicio, pos - inicio); } //se nao foi a linha final, a string gerada representa esta linha, senao adiciona ao final if (linhaAtual < linha.Count) { linha[linhaAtual] = valor; } else { linha.Add(valor); } linhaAtual++; //trata espaçamento criado pelo caracter separador while (pos < linha.TextoLinha.Length && linha.TextoLinha[pos] != separator) { pos++; } if (pos < linha.TextoLinha.Length) { pos++; } } //remove linha excessiva while (linha.Count > linhaAtual) { linha.RemoveAt(linhaAtual); } return(linha.Count > 0); } catch (Exception ex) { ex.ToString(); throw; } }
public static void Main() { //le arquivo CEPs.csv using (CsvEditor leitor = new CsvEditor("../../../../../CEPs.csv")) { StringBuilder novoArquivo = new StringBuilder(); CsvLinha linha = new CsvLinha(); char separador = ';'; //trata primeira linha de rotulos leitor.LerLinha(linha, separador); string novaLinha = string.Format("{0}; {1}; {2}; {3}; {4}; {5}; {6}; {7}; {8}\n", linha[0], linha[1], linha[2], linha[3], linha[4], linha[5], linha[6], linha[7], linha[8]); novoArquivo.Append(novaLinha); //itera linha a linha while (leitor.LerLinha(linha, separador)) { //produz endereco baseado no cep contido na primeira celula da linha StringBuilder url = new StringBuilder(); url.Append("http://viacep.com.br/ws/"); string cepLido = linha[0]; url.Append(String.Format("{0}/json", cepLido)); using (WebClient client = new WebClient()) { //acessa endereco gerado try { string webData = client.DownloadString(url.ToString()); int pos = 0; bool conteudoRelevante = false; //itera sobre cada caractere do endereco, registrando conteudo relevante na string geradora do arquivo final while (pos < webData.Length) { if (webData[pos] == ':') { pos += 3; conteudoRelevante = true; } if (conteudoRelevante && webData[pos] != '"') { novoArquivo.Append(webData[pos]); } else if (conteudoRelevante) { novoArquivo.Append("; "); conteudoRelevante = false; } pos++; } novoArquivo.Append("\n"); } catch (Exception e) { //pula linha caso CEP nao esteja em formato aceito pelo site Console.WriteLine("O CEP informado não tem formato valido"); novoArquivo.Append(String.Format("{0}; ; ; ; ; ; ; \n", cepLido)); } } } //usa string gerada para produzir arquivo de resultado File.WriteAllText("../../../CEPs - cópia.csv", novoArquivo.ToString()); } }