Esistono librerie di lettori / scrittori CSV in C #? [chiuso]


111

Esistono librerie di lettori / scrittori CSV in C #?


68
Mi permetto di dissentire. Questa è sicuramente una domanda costruttiva e il primo risultato su google per .net csv library. La prova, sebbene aneddotica, per la mia affermazione è che questa domanda è stata letta più di 22000 volte negli ultimi sei anni.
shovavnik

5
vero detto - primo colpo su google
Robetto

Risposte:


107

Prova CsvHelper . È facile da usare come FastCsvReader e scrive anche. Sono stato molto soddisfatto di FastCsvReader in passato, ma avevo bisogno di qualcosa che facesse anche la scrittura e non ero soddisfatto di FileHelpers.

Lettura:

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

scrittura:

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

Full Disclosure: sono l'autore di questa libreria.


3
Grazie, Josh. Ho provato, ed è stato veloce ed efficiente in termini di memoria. Penso che la documentazione potrebbe essere migliorata un po 'per i nuovi utenti, ma è stata decisamente sufficiente.
Sam

Esiste un modo per utilizzare questa libreria senza un tipo personalizzato in modo da poter scorrere semplicemente la griglia della tabella (personalizzata) e scrivere l'intestazione e quindi passare ogni campo riga? Sto solo cercando un modo per evitare errori nei file (escaping correttamente ecc.).
u84six

Sì. Puoi usare WriteField. Controlla i documenti qui joshclose.github.io/CsvHelper
Josh Close

1
@Zimano Non è vero. Puoi leggere singoli campi o anche solo ottenere un array di stringhe per la riga. Controlla la documentazione. joshclose.github.io/CsvHelper
Josh Close il

@JoshClose Oh, è bello sentirlo, grazie! Ho solo controllato la guida introduttiva qui: joshclose.github.io/CsvHelper/… e non includeva il mio caso d'uso. Avrei dovuto guardare oltre, mi scuso. Tuttavia, in quella pagina si dice che l'utilizzo di una mappatura di qualche tipo è il modo consigliato di utilizzare CsvHelper. Forse potrebbe offrire alcune strategie di lettura alternative in quel punto? A proposito, ho cancellato il mio commento originale, poiché ora è irrilevante :-)
Zimano

21

Ci sono un paio di opzioni, proprio nel framework stesso.

Uno dei più semplici è fare riferimento a Microsoft.VisualBasic, quindi utilizzare TextFieldParser . È un lettore CSV completamente funzionale nel framework principale.

Un'altra buona alternativa è utilizzare i set di dati per leggere i file CSV .


6
Mi sono sempre chiesto perché fosse nell'assembly Microsoft.VisualBasic ... MS pensava che gli sviluppatori C # non usassero CSV?
Thomas Levesque,

4
@Thomas: soprattutto perché molti sviluppatori C # rabbrividiscono al pensiero di includere un assembly VisualBasic nei loro progetti

2
Sì, ci sono molte belle "chicche" lì dentro. Penso che sia più perché VB ha alcuni costrutti linguistici che non erano stati realmente considerati nel framework originariamente, ma non sarebbero mai stati in grado di far passare gli utenti VB6 senza implementarli. Gli spazi dei nomi Devices e ApplicationServices hanno tutti i tipi di cose utili.
Reed Copsey,

20
@ Roboto, qualsiasi sviluppatore C # che si vergogna di fare riferimento a Microsoft.VisualBasic nel proprio progetto è un ignorante snob del linguaggio. Ancora peggio, non capiscono affatto .NET.
Ash il

3
Un altro gioiello di montaggio VB è CopyDirectory: stackoverflow.com/questions/58744/...

17

Sebastien Lorion ha un ottimo CSVlettore su CodeProject chiamato A Fast CSV Reader . Probabilmente uno dei migliori per C # ed è gratuito.

Per quanto riguarda la scrittura, usa StreamWriter.

Ecco del codice boilerplate per scrivere a DataGridViewin un file:

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();
            }
        };
    }
}

2
Questo è il mio preferito. Piccola biblioteca fantastica.
Alex

2
Scrivere CSV è facile: usa un normale metodo di output del testo e separalo da virgole. Hai davvero bisogno solo di una libreria / gestore personalizzato per leggere ...
Reed Copsey

10
@Reed: non è troppo banale se vuoi che le virgole e le virgolette escano correttamente. Non sono nemmeno sicuro che esista una standardizzazione per questo, ma è molto comune farlo.
Stefan Steinegger

26
Scrivere CSV è un po 'più complesso di così. Se i dati che si desidera esprimere nel file CSV contengono virgole o nuove righe, è necessario racchiudere i dati tra virgolette. Se nei dati appena contrassegnati da virgolette è presente una virgoletta, è necessario eseguire l'escape delle virgolette tra virgolette doppie. Potresti certamente codificare quella logica da solo, ma sarebbe bello che una libreria lo facesse per te.
Tinister

4
La standardizzazione è RFC 4180. tools.ietf.org/html/rfc4180
Josh Close

7

Sì, anche se presumo che tu stia effettivamente chiedendo dettagli?

Prova FileHelpers


Bene, l'ho fatto, ma per qualche strana ragione FileHelpers si è rotto in modo casuale. Inoltre, la libreria FileHelpers non è stata sviluppata per molto tempo.
Erik Schierboom

1
FileHelpers sono attivamente sviluppati ora, vedere GitHub .
xmedeko

3

Ce ne sono a dozzine.

http://www.filehelpers.net/ è uno dei più comuni.

Dovrei dire che trovo Filehelpers restrittivo in alcuni scenari e invece uso The Fast CSV Reader . Nella mia esperienza, se non conosci il formato del tuo file CSV o importi la mappatura fino al runtime, questa è la libreria migliore da usare.


Usiamo anche filehelpers.
Tangurena

1
Ho trovato FileHelpers un fastidio da configurare. FastCsvReader è stato molto più facile da usare.
Josh Close

+1 per FastCsvReader. Performance eccellente. Ma è principalmente un lettore / parser. Non uno scrittore.
Mehdi LAMRANI
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.