Estou escrevendo um aplicativo de importação simples e preciso ler um arquivo CSV, mostrar o resultado em um DataGrid
e mostrar linhas corrompidas do arquivo CSV em outra grade. Por exemplo, mostre as linhas com menos de 5 valores em outra grade. Estou tentando fazer isso assim:
StreamReader sr = new StreamReader(FilePath);
importingData = new Account();
string line;
string[] row = new string [5];
while ((line = sr.ReadLine()) != null)
{
row = line.Split(',');
importingData.Add(new Transaction
{
Date = DateTime.Parse(row[0]),
Reference = row[1],
Description = row[2],
Amount = decimal.Parse(row[3]),
Category = (Category)Enum.Parse(typeof(Category), row[4])
});
}
mas é muito difícil operar em matrizes nesse caso. Existe uma maneira melhor de dividir os valores?
Respostas:
Não reinvente a roda. Aproveite o que já está no .NET BCL.
Microsoft.VisualBasic
(sim, ele diz VisualBasic, mas também funciona em C # - lembre-se de que no final tudo é apenas IL)Microsoft.VisualBasic.FileIO.TextFieldParser
classe para analisar o arquivo CSVAqui está o código de exemplo:
Funciona muito bem para mim em meus projetos de C #.
Aqui estão mais alguns links / informações:
fonte
TextFieldParser
e ele fez o truque. Obrigadoparser.TextFieldType = FieldType.Delimited;
não é necessária se você ligarparser.SetDelimiters(",");
, pois o método define aTextFieldType
propriedade para você."text with quote"", and comma"
e pode obter o valor correto emtext with quote", and comma
vez de valores separados incorretamente. Portanto, você pode optar por String.Split se o CSV for muito simples.Minha experiência é que existem muitos formatos csv diferentes. Especialmente como eles lidam com o escape de aspas e delimitadores dentro de um campo.
Estas são as variantes que encontrei:
Eu tentei muitos dos analisadores csv existentes, mas não há um que possa lidar com as variantes nas quais encontrei. Também é difícil descobrir na documentação quais variantes de escape os analisadores suportam.
Nos meus projetos, agora uso o VB TextFieldParser ou um divisor personalizado.
fonte
Eu recomendo o CsvHelper da Nuget .
(Adicionar uma referência ao Microsoft.VisualBasic simplesmente não parece certo, não é apenas feio, provavelmente nem é multiplataforma.)
fonte
CsvHelper
vem com uma linha embutida no mapeador de classes; ele permite variações nos cabeçalhos das colunas (se presentes) e até aparentemente variações na ordem das colunas (embora eu não tenha testado o último eu mesmo). Em suma, parece muito mais "alto nível" do queTextFieldParser
.Às vezes, o uso de bibliotecas é legal quando você não deseja reinventar a roda, mas, nesse caso, é possível fazer o mesmo trabalho com menos linhas de código e mais fácil de ler, em comparação com o uso de bibliotecas. Aqui está uma abordagem diferente que eu acho muito fácil de usar.
fonte
CSV pode ficar complicado reais rápido.
Use algo robusto e bem testado:
FileHelpers: www.filehelpers.net
fonte
Eu uso isso aqui:
http://www.codeproject.com/KB/database/GenericParser.aspx
A última vez que eu estava procurando por algo assim, encontrei como resposta a esta pergunta .
fonte
Outro desta lista, o Cinchoo ETL - uma biblioteca de código aberto para ler e gravar arquivos CSV
Para um exemplo de arquivo CSV abaixo
Rapidamente você pode carregá-los usando a biblioteca como abaixo
Se você tiver uma classe POCO correspondente ao arquivo CSV
Você pode usá-lo para carregar o arquivo CSV como abaixo
Confira os artigos no CodeProject sobre como usá-lo.
Isenção de responsabilidade: eu sou o autor desta biblioteca
fonte
fonte
Antes de tudo, precisamos entender o que é CSV e como escrevê-lo.
/r/n
) é a próxima linha da "tabela".\t
ou,
/r/n
sybols (a célula deve começar com o símbolo de aspas e terminar com esse símbolo nesse caso)A maneira mais fácil de o C # / Visual Basic trabalhar com arquivos CSV é usar a
Microsoft.VisualBasic
biblioteca padrão . Você só precisa adicionar a referência necessária e a seguinte string à sua classe:Sim, você pode usá-lo em C #, não se preocupe. Essa biblioteca pode ler arquivos relativamente grandes e suporta todas as regras necessárias, para que você possa trabalhar com todos os arquivos CSV.
Há algum tempo, eu escrevi uma classe simples para leitura / gravação de CSV com base nessa biblioteca. Usando esta classe simples, você poderá trabalhar com CSV como na matriz de 2 dimensões. Você pode encontrar minha turma no seguinte link: https://github.com/ukushu/DataExporter
Exemplo simples de uso:
fonte
Para concluir as respostas anteriores, pode ser necessário uma coleção de objetos de seu arquivo CSV, analisados pelo método
TextFieldParser
ou pelostring.Split
método, e depois cada linha é convertida em um objeto via Reflexão. Obviamente, você primeiro precisa definir uma classe que corresponda às linhas do arquivo CSV.Usei o serializador CSV simples de Michael Kropat encontrado aqui: Classe genérica para CSV (todas as propriedades) e reutilizei seus métodos para obter os campos e propriedades da classe desejada.
Desserializei meu arquivo CSV com o seguinte método:
fonte
Eu sugiro usar o CsvHelper.
Aqui está um exemplo rápido:
A documentação completa pode ser encontrada em: https://joshclose.github.io/CsvHelper
fonte