Czy są jakieś biblioteki czytników / zapisów CSV w C #? [Zamknięte]


111

Czy są jakieś biblioteki czytników / zapisów CSV w C #?


68
Pozwolę sobie być innego zdania. To zdecydowanie konstruktywne pytanie i pierwszy wynik w Google dla .net csv library. Dowody, choć anegdotyczne, są takie, że moje twierdzenie jest takie, że pytanie to było rozpatrywane ponad 22 000 razy w ciągu ostatnich sześciu lat.
shovavnik

5
prawda powiedział - pierwsze trafienie w Google
Robetto

Odpowiedzi:


107

Wypróbuj CsvHelper . Jest tak łatwy w użyciu jak FastCsvReader i również pisze. W przeszłości byłem bardzo zadowolony z FastCsvReader, ale potrzebowałem też czegoś, co umożliwia pisanie i nie byłem zadowolony z FileHelpers.

Czytanie:

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

Pisanie:

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

Pełne ujawnienie: jestem autorem tej biblioteki.


3
Dzięki, Josh. Spróbowałem i było to zarówno szybkie, jak i wydajne pod względem pamięci. Myślę, że dokumentację można by nieco poprawić dla początkujących użytkowników, ale to było zdecydowanie wystarczające.
Sam

Czy istnieje sposób na użycie tej biblioteki bez niestandardowego typu, abym mógł po prostu iterować po mojej siatce tabeli (niestandardowej) i wypisać nagłówek, a następnie przekazać każde pole wiersza? Szukam tylko sposobu, aby zapobiec błędom w plikach (poprawne ucieczki itp.).
u84six

Tak. Możesz użyć WriteField. Sprawdź dokumentację tutaj joshclose.github.io/CsvHelper
Josh Close

1
@Zimano Nie prawda. Możesz odczytać poszczególne pola lub po prostu pobrać tablicę ciągów dla wiersza. Sprawdź dokumentację. joshclose.github.io/CsvHelper
Josh Close

@JoshClose Och, dobrze to słyszeć, dzięki! Sprawdziłem tylko przewodnik dla początkujących : joshclose.github.io/CsvHelper/ ... i nie zawierał mojego przypadku użycia. Powinienem był szukać dalej, przepraszam. Jednak na tej stronie jest napisane, że użycie pewnego rodzaju mapowania jest zalecanym sposobem użycia CsvHelper. Może mógłby zaoferować alternatywne strategie czytania w tym miejscu?
Swoją drogą usunąłem

21

Istnieje kilka opcji bezpośrednio w samej strukturze.

Jednym z najłatwiejszych jest odwołanie się do Microsoft.VisualBasic, a następnie użycie TextFieldParser . Jest to w pełni funkcjonalny czytnik CSV w rdzeniu.

Inną dobrą alternatywą jest używanie zestawów danych do odczytywania plików CSV .


6
Zawsze się zastanawiałem, dlaczego to było w zestawie Microsoft.VisualBasic ... Czy MS uważało, że programiści C # nie używają CSV?
Thomas Levesque

4
@Thomas: zwłaszcza, że ​​wielu programistów C # wzdryga się na myśl o włączeniu zestawu VisualBasic do swoich projektów

2
Tak - jest tam wiele fajnych "gadżetów". Myślę, że jest to więcej, ponieważ VB ma pewne konstrukcje językowe, które pierwotnie nie były brane pod uwagę we frameworku, ale nigdy nie byłyby w stanie przenieść użytkowników VB6 bez ich implementacji. Przestrzenie nazw Devices i ApplicationServices zawierają wiele przydatnych rzeczy.
Reed Copsey

20
@ Roboto, każdy programista C #, który kuli się, odwołując się do Microsoft.VisualBasic w swoim projekcie, jest ignorantem językowym snobem. Co gorsza, w ogóle nie rozumieją .NET.
Ash

3
Kolejnym klejnotem montażowym VB jest CopyDirectory: stackoverflow.com/questions/58744/ ...

17

Sebastien Lorion ma świetnego CSVczytnika CodeProject o nazwie A Fast CSV Reader . Prawdopodobnie jeden z najlepszych dla C # i jest darmowy.

Jeśli chodzi o pisanie, po prostu użyj StreamWriter .

Oto standardowy kod do zapisywania a DataGridViewdo pliku:

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
To jest moje ulubione. Świetna mała biblioteka.
Alex

2
Pisanie CSV jest łatwe - po prostu użyj zwykłej metody tekstowej i oddziel je przecinkami. Naprawdę potrzebujesz biblioteki / niestandardowego programu obsługi do czytania ...
Reed Copsey,

10
@Reed: nie jest to zbyt trywialne, jeśli chcesz, aby przecinki i cudzysłowy zostały poprawnie zmienione. Nie jestem nawet pewien, czy istnieje w tym zakresie normalizacja, ale jest to bardzo powszechne.
Stefan Steinegger

26
Pisanie CSV jest nieco bardziej skomplikowane. Jeśli dane, które chcesz wyrazić w pliku CSV, zawierają przecinki lub nowe wiersze, musisz ująć je w cudzysłów. Jeśli w nowych danych oznaczonych cudzysłowem znajduje się cudzysłów, musisz zmienić jego znaczenie za pomocą podwójnych cudzysłowów. Z pewnością mógłbyś sam zakodować tę logikę, ale byłoby miło, gdyby biblioteka zrobiła to za Ciebie.
Tinister

4

7

Tak - chociaż zakładam, że faktycznie pytasz o szczegóły?

Wypróbuj FileHelpers


Cóż, zrobiłem, ale z jakiegoś dziwnego powodu FileHelpers zepsuło się losowo. Ponadto biblioteka FileHelpers nie była rozwijana przez długi czas.
Erik Schierboom

1
FileHelpers są teraz aktywnie rozwijane, zobacz GitHub .
xmedeko,

3

Jest ich dziesiątki.

http://www.filehelpers.net/ jest jednym z najczęstszych.

Powinienem powiedzieć, że uważam Filehelpers za restrykcyjne w niektórych scenariuszach i zamiast tego używam The Fast CSV Reader . Z mojego doświadczenia wynika, że ​​jeśli nie znasz formatu swojego pliku CSV lub importu mapowania do czasu uruchomienia - jest to lepsza biblioteka do użycia.


Używamy również pomocników plików.
Tangurena

1
Zauważyłem, że konfiguracja FileHelpers jest kłopotliwa. FastCsvReader był dużo łatwiejszy w użyciu.
Josh Close

+1 dla FastCsvReader. Doskonała wydajność. Ale jest to głównie czytnik / parser. Nie pisarz.
Mehdi LAMRANI
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.