CSV sicher einlesen

17/10/2007 - 16:06 von Christoph Schneegans | Report spam
Hallo allerseits!

Auf den ersten Blick erscheint es naheliegend, die Zeilen einer .csv-Datei mit
der Methode String.Split() zu zerlegen. Für eine Zeile

foo;bar

würde man dann wie gewünscht ein Array {"foo", "bar"} erhalten. Nun können die
Werte (bspw. in einer Excel-Tabelle) aber durchaus auch so aussehen:

Spalte 1 | Spalte 2 | Spalte 3

foo | "; | bar

Es ist klar, daß diese Daten nicht naiv als

foo;";;bar

exportiert werden können. Excel geht hier offenbar folgendermaßen vor:

· Wenn das Trennzeichen (hier das Zeichen ";") in einem Wert vorkommt, wird der
ganze Wert in Textbegrenzungszeichen (hier das Zeichen '"') eingeschlossen.

· Wenn der Wert das Textbegrenzungszeichen enthàlt, wird es verdoppelt.

Obige Tabelle würde Excel also als

foo;""";";bar

in einer .csv-Datei speichern; diese Datei kann dann auch zuverlàssig
wiederhergestellt werden.

Ich würde in einem .NET-Programm auch gerne derartige Dateien einlesen. Ich
gehe davon aus, daß man das Problem mit einem regulàren Ausdruck erschlagen
kann. Hat sich dazu schon mal jemand Gedanken gemacht?

Und gibt es noch andere gebràuchliche Techniken, um Werte in .csv-Dateien zu
maskieren? Daß man jeweils andere Trennzeichen und Textbegrenzungszeichen
verwenden kann, ist klar.

<http://schneegans.de/web/xhtml/> · Klare Antworten zu XHTML
 

Lesen sie die antworten

#1 Frank Dzaebel
17/10/2007 - 20:46 | Warnen spam
Hallo Christoph,

in einer .csv-Datei speichern; diese Datei kann dann
auch zuverlàssig wiederhergestellt werden.

Ich würde in einem .NET-Programm auch gerne
derartige Dateien einlesen.



Naja, ganz am Anfang natürlich, XML ist da angesagter,
aber man kann es sich ja ggf. nicht aussuchen.

Mit LINQ heutzutage sicher am elegantesten:
(aktueller DotNetPro-Artikel darüber:
[Mit LINQ CSV-Dateien verarbeiten, Ausgabe 11/2007])

Klassisch sind die OleDb-Methode (selten Regex, teilweise
kann das aber schneller sein als OleDb) wohl am verbreitesten,
aber es gibt - je nach Szenario - auch performantere:

[A Fast CSV Reader - The Code Project - C# Database]
http://www.codeproject.com/cs/datab...Reader.asp

OleDb: Beispiel ...

OleDbConnection conn = new OleDbConnection(
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path +
";Extended Properties=\"text;HDR=Yes;IMEX=1;Format=Delimited\"");
OleDbCommand cmd = new OleDbCommand(
"SELECT * FROM Personen.csv", conn);

[Initializing the Text Data Source Driver [Access 2007 Developer Reference]]
http://msdn2.microsoft.com/en-us/li...77651.aspx

[Schema.ini File (Text File Driver)]
http://msdn2.microsoft.com/en-us/li...09353.aspx

Aber! OleDB hat hier IMHO àhnliche Verhaltensweisen,
die Du geschildert hast, also nicht haben möchtest.
Quintessenz, es geht also in Deinem Fall eher in Richtung
"Fast CSV Reader" oder Regex.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen