Existe alguma biblioteca de leitores / gravadores CSV em C #? [fechadas]

111

Existe alguma biblioteca de leitores / gravadores CSV em C #?

mrblah
fonte
68
Eu peço desculpa mas não concordo. Esta é definitivamente uma pergunta construtiva e o primeiro resultado no google para .net csv library. A evidência, embora anedótica, para minha afirmação é que esta pergunta foi vista mais de 22.000 vezes nos últimos seis anos.
shovavnik
5
verdade disse - primeiro acesso no google
Robetto de

Respostas:

107

Experimente o CsvHelper . É tão fácil de usar quanto FastCsvReader e também escreve. Estive muito feliz com FastCsvReader no passado, mas precisava de algo que também escrevesse e não estava feliz com FileHelpers.

Lendo:

var csv = new CsvReader( stream );
var myCustomTypeList = csv.GetRecords<MyCustomType>();

Escrevendo:

var csv = new CsvWriter( stream );
csv.WriteRecords( myCustomTypeList );

Divulgação completa: eu sou o autor desta biblioteca.

Josh Close
fonte
3
Obrigado, Josh. Eu tentei, e foi rápido e eficiente em termos de memória. Acho que a documentação poderia ser melhorada um pouco para usuários inexperientes, mas foi definitivamente suficiente.
Sam
Existe uma maneira de usar esta biblioteca sem um tipo personalizado para que eu possa apenas iterar por meio de minha grade de tabela (personalizado) e escrever o cabeçalho e, em seguida, passar cada campo de linha? Estou apenas procurando uma maneira de evitar erros nos arquivos (escapando corretamente etc).
seis,
Sim. Você pode usar WriteField. Verifique os documentos aqui joshclose.github.io/CsvHelper
Josh Close
1
@Zimano Não é verdade. Você pode ler campos individuais ou apenas obter uma matriz de string para a linha. Confira a documentação. joshclose.github.io/CsvHelper
Josh Close
@JoshClose Oh, é bom ouvir isso, obrigado! Eu apenas verifiquei o guia de primeiros passos aqui: joshclose.github.io/CsvHelper/… e ele não incluiu meu caso de uso. Eu deveria ter procurado mais, minhas desculpas. No entanto, nessa página diz que usar um mapeamento de algum tipo é a maneira recomendada de usar CsvHelper. Talvez pudesse oferecer algumas estratégias alternativas de leitura naquele local? A propósito, excluí meu comentário original, pois agora é irrelevante :-)
Zimano
21

Existem algumas opções, bem na própria estrutura.

Uma das mais fáceis é fazer referência a Microsoft.VisualBasic e, em seguida, usar TextFieldParser . É um leitor CSV totalmente funcional na estrutura principal.

Outra boa alternativa é usar conjuntos de dados para ler arquivos CSV .

Reed Copsey
fonte
6
Sempre me perguntei por que estava no assembly Microsoft.VisualBasic ... A MS achava que os desenvolvedores de C # não usavam CSV?
Thomas Levesque
4
@Thomas: especialmente porque muitos desenvolvedores C # estremecem com a ideia de incluir um assembly VisualBasic em seus projetos
2
Sim - há muitas "guloseimas" legais lá. Acho que é mais porque o VB tem algumas construções de linguagem que não foram realmente consideradas no framework originalmente, mas eles nunca seriam capazes de transmitir os usuários VB6 sem implementá-los. Os namespaces Devices e ApplicationServices têm todos os tipos de coisas úteis.
Reed Copsey
20
@Roboto, qualquer desenvolvedor C # que se encolhe ao fazer referência a Microsoft.VisualBasic em seu projeto é um esnobe de linguagem ignorante. Pior ainda, eles não entendem nada de .NET.
Cinza
3
Outra joia de montagem VB é CopyDirectory: stackoverflow.com/questions/58744/…
17

Sebastien Lorion tem um ótimo CSVleitor no CodeProject chamado A Fast CSV Reader . Provavelmente um dos melhores para C # e é grátis.

Quanto à escrita, apenas use StreamWriter.

Aqui está um código padrão para escrever um DataGridViewem um arquivo:

private void exportDGVToCSV(string filename)
{
    if (dataGridView1.Columns.Count != 0) 
    {    
        using (Stream stream = File.OpenWrite(filename))
        {
            stream.SetLength(0);
            using (StreamWriter writer = new StreamWriter(stream))
            {
                // loop through each row of our DataGridView
                foreach (DataGridViewRow row in dataGridView1.Rows) 
                {
                    string line = string.Join(",", row.Cells.Select(x => $"{x}"));
                    writer.WriteLine(line);
                }

                writer.Flush();
            }
        };
    }
}
Matze
fonte
2
Este é meu favorito. Ótima pequena biblioteca.
Alex
2
Escrever CSV é fácil - basta usar um método de saída de texto normal e separar por vírgulas. Você realmente só precisa de uma biblioteca / manipulador personalizado para leitura ...
Reed Copsey
10
@Reed: não é muito trivial se você quiser que vírgulas e aspas escapem corretamente. Não tenho certeza nem se existe uma padronização para isso, mas é muito comum fazer.
Stefan Steinegger
26
Escrever CSV é um pouco mais complexo do que isso. Se os dados que você deseja expressar no arquivo CSV contiverem vírgulas ou novas linhas, será necessário colocar os dados entre aspas. Se houver uma aspa nos dados recém-marcados com aspas, será necessário evitar a aspa com aspas duplas. Você certamente poderia codificar essa lógica sozinho, mas seria bom que uma biblioteca fizesse isso por você.
Tinister
4
A padronização é RFC 4180. tools.ietf.org/html/rfc4180
Josh Fechar
7

Sim - embora eu presuma que você está realmente pedindo detalhes?

Experimente FileHelpers

Murph
fonte
Bem, eu fiz, mas por alguma razão estranha, o FileHelpers quebrou aleatoriamente. Além disso, a biblioteca FileHelpers não está em desenvolvimento há muito tempo.
Erik Schierboom
1
FileHelpers são ativamente desenvolvidos agora, consulte o GitHub .
xmedeko de
3

Existem dezenas.

http://www.filehelpers.net/ é um dos mais comuns.

Devo dizer que acho o Filehelpers restritivo em alguns cenários e, em vez disso, uso o Fast CSV Reader . Na minha experiência, se você não souber o formato do seu arquivo CSV ou importar o mapeamento até o tempo de execução - esta é a melhor biblioteca para usar.

Alex
fonte
Também usamos filehelpers.
Tangurena
1
Descobri que FileHelpers é um incômodo de configurar. FastCsvReader era muito mais fácil de usar.
Josh Close
1 para FastCsvReader. Excelente desempenho. Mas é principalmente um leitor / analisador. Não é um escritor.
Mehdi LAMRANI