2009-05-25 9 views
88

Czy istnieje dobra i darmowa implementacja parsera CSV dostępna na niektórych liberalnych licencjach? Jakiś odpowiednik SuperCSV dla Javy, może port?Parser/czytnik CSV dla C#?

+2

http://stackoverflow.com/questions/3507498/reading-csv-file –

+5

przy użyciu Microsoft.VisualBasic.FileIO.TextFieldParser; –

+1

[Najważniejsze 6 sposobów analizowania pliku .CSV? Wysoka wydajność!] (Http://izlooite.blogspot.com/2011/06/top-6-ways-to-parse-csv-high.html) –

Odpowiedz

70
+23

FileHelpers (przynajmniej dla CSV) wymaga "zdefiniowania klasy odwzorowującej rekord w źródle (plik)", "musisz zadeklarować klasę Record Mapping" itd., A to nie jest takie gorące. Chciałbym przekonwertować CSV na DataTable, nie wiedząc z góry, ile kolumn należy się spodziewać. –

53

Jest ładny realizacja na CodeProject:

Aby dać bardziej w dół do liczby ziemnych, z 45 MB pliku CSV zawierającym 145 pól i 50.000 rekordów, czytelnik przetwarzał około 30 MB/sek. W sumie zajęło to 1,5 sekundy! Specyfikacja maszyny to P4 3.0 GHz, 1024 MB.

+0

(odbierając moje +1): Właśnie zepsułem program lumenworks Szybki odczyt CSV na pliku 53 MB. Wygląda na to, że buforowanie linii zakończyło się niepowodzeniem po 43 000 wierszy i zablokowało bufor. Wypróbowałem 'Microsoft.VisualBasic.FileIO.TextFieldParse' i udało się. –

7

spróbuj filehelpers Działa zadziwiająco dobrze. Używam go do analizowania pliku 100 MB każdego dnia.

3

zacząłem użyciu CSV Parser, który jest częścią CommonLibrary.NET.

Używa .NET 3.5, ma łatwe API i wygodne przeciążenia/metody & lamda dla iteracji.

Nie mam żadnych benchmarków dla tego jak wyżej, ale miłą rzeczą jest to, że jest to tylko jeden składnik biblioteki podobny do Javy. Dostaję też między innymi parser wiersza poleceń, implementację repozytorium.

10

Możesz załadować plik CSV do DataTable.

Przykładowy kod -

static DataTable CsvToDataTable(string strFileName) 
{ 
    DataTable dataTable = new DataTable("DataTable Name"); 

    using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Directory.GetCurrentDirectory() + "; Extended Properties = \"Text;HDR=YES;FMT=Delimited\"")) 
    { 
     conn.Open(); 
     string strQuery = "SELECT * FROM [" + strFileName + "]"; 
     OleDbDataAdapter adapter = 
      new System.Data.OleDb.OleDbDataAdapter(strQuery, conn); 
     adapter.Fill(dataTable); 
    } 
    return dataTable; 
} 

Upewnij się skompilować projekt z procesorem x86. To nie działa na x64.

+1

to działało całkiem dobrze, ponieważ chciałem pozostać z wbudowanymi bibliotekami ODBC lub OLEDB. Btw, poniższe ma dodatkowe próbki kodu zarówno dla OLEDB i ODBC: http://www.csvreader.com/csv_benchmarks.php – Meringros

+5

To nie działa na 64 bit, niestety. – DenNukem

+0

Dwa linki, które mogą być przydatne w odniesieniu do tej odpowiedzi: 1. [C# Samouczek - Korzystanie z wbudowanego parsera OLEDB CSV] (http://tech.pro/tutorial/803/csharp-tutorial-using-the-upilt- in-oledb-csv-parser) 2. [Jak odzyskać schemat kolumny za pomocą metody DataReader GetSchemaTable i Visual C# .NET] (http://support.microsoft.com/kb/310107) – shawad