Ich schreibe eine einfache Importanwendung und muss eine CSV-Datei lesen, das Ergebnis in a DataGrid
anzeigen und beschädigte Zeilen der CSV-Datei in einem anderen Raster anzeigen. Zeigen Sie beispielsweise die Linien an, die kürzer als 5 Werte in einem anderen Raster sind. Ich versuche das so zu machen:
StreamReader sr = new StreamReader(FilePath);
importingData = new Account();
string line;
string[] row = new string [5];
while ((line = sr.ReadLine()) != null)
{
row = line.Split(',');
importingData.Add(new Transaction
{
Date = DateTime.Parse(row[0]),
Reference = row[1],
Description = row[2],
Amount = decimal.Parse(row[3]),
Category = (Category)Enum.Parse(typeof(Category), row[4])
});
}
In diesem Fall ist es jedoch sehr schwierig, Arrays zu bearbeiten. Gibt es eine bessere Möglichkeit, die Werte aufzuteilen?
Antworten:
Das Rad nicht neu erfinden. Nutzen Sie die Vorteile von .NET BCL.
Microsoft.VisualBasic
(ja, es steht VisualBasic, aber es funktioniert genauso gut in C # - denken Sie daran, dass am Ende alles nur IL ist)Microsoft.VisualBasic.FileIO.TextFieldParser
Klasse, um die CSV-Datei zu analysierenHier ist der Beispielcode:
Es funktioniert gut für mich in meinen C # -Projekten.
Hier sind einige weitere Links / Informationen:
quelle
TextFieldParser
und es hat den Trick getan. Dankeparser.TextFieldType = FieldType.Delimited;
Aufrufen keine Einstellung erforderlich istparser.SetDelimiters(",");
, da die Methode dieTextFieldType
Eigenschaft für Sie festlegt ."text with quote"", and comma"
und den richtigen Werttext with quote", and comma
anstelle von falsch getrennten Werten erhalten. Sie können sich also für String.Split entscheiden, wenn Sie csv sehr einfach ist.Ich habe die Erfahrung gemacht, dass es viele verschiedene CSV-Formate gibt. Insbesondere, wie sie mit dem Escapezeichen von Anführungszeichen und Trennzeichen innerhalb eines Felds umgehen.
Dies sind die Varianten, auf die ich gestoßen bin:
Ich habe viele der vorhandenen CSV-Parser ausprobiert, aber es gibt keinen einzigen, der die Varianten verarbeiten kann, auf die ich gestoßen bin. Es ist auch schwierig, aus der Dokumentation herauszufinden, welche Escape-Varianten die Parser unterstützen.
In meinen Projekten verwende ich jetzt entweder den VB TextFieldParser oder einen benutzerdefinierten Splitter.
quelle
Ich empfehle CsvHelper von Nuget .
(Das Hinzufügen eines Verweises auf Microsoft.VisualBasic fühlt sich einfach nicht richtig an, es ist nicht nur hässlich, es ist wahrscheinlich nicht einmal plattformübergreifend.)
quelle
CsvHelper
der Klassen-Mapper eine integrierte Zeile enthält. Es ermöglicht Variationen in den Spaltenüberschriften (falls vorhanden) und sogar anscheinend Variationen in der Spaltenreihenfolge (obwohl ich letztere selbst nicht getestet habe). Alles in allem fühlt es sich viel "High-Level" an alsTextFieldParser
.Manchmal ist die Verwendung von Bibliotheken cool, wenn Sie das Rad nicht neu erfinden möchten. In diesem Fall kann man jedoch denselben Job mit weniger Codezeilen ausführen und ist im Vergleich zur Verwendung von Bibliotheken einfacher zu lesen. Hier ist ein anderer Ansatz, den ich sehr einfach finde.
quelle
CSV kann kompliziert werden echte schnell.
Verwenden Sie etwas Robustes und Getestetes:
FileHelpers: www.filehelpers.net
quelle
Ich benutze das hier:
http://www.codeproject.com/KB/database/GenericParser.aspx
Als ich das letzte Mal nach so etwas gesucht habe, habe ich es als Antwort auf diese Frage gefunden .
quelle
Ein weiterer auf dieser Liste, Cinchoo ETL - eine Open-Source-Bibliothek zum Lesen und Schreiben von CSV-Dateien
Eine Beispiel-CSV-Datei finden Sie unten
Schnell können Sie sie mithilfe der Bibliothek wie folgt laden
Wenn Sie eine POCO-Klasse haben, die mit der CSV-Datei übereinstimmt
Sie können es verwenden, um die CSV-Datei wie folgt zu laden
Weitere Informationen zur Verwendung finden Sie in den Artikeln bei CodeProject .
Haftungsausschluss: Ich bin der Autor dieser Bibliothek
quelle
quelle
Zunächst müssen Sie verstehen, was CSV ist und wie man es schreibt.
/r/n
) ist die nächste "Tabellen" -Zeile.\t
oder,
/r/n
Sybols enthalten (Zelle muss mit dem Anführungszeichen beginnen und endet in diesem Fall mit diesem Symbol)Der einfachste Weg für C # / Visual Basic, mit CSV-Dateien zu arbeiten, ist die Verwendung einer Standardbibliothek
Microsoft.VisualBasic
. Sie müssen Ihrer Klasse nur die erforderliche Referenz und die folgende Zeichenfolge hinzufügen:Ja, Sie können es in C # verwenden, keine Sorge. Diese Bibliothek kann relativ große Dateien lesen und unterstützt alle erforderlichen Regeln, sodass Sie mit allen CSV-Dateien arbeiten können.
Vor einiger Zeit hatte ich eine einfache Klasse für CSV-Lesen / Schreiben basierend auf dieser Bibliothek geschrieben. Mit dieser einfachen Klasse können Sie mit CSV wie mit einem zweidimensionalen Array arbeiten. Sie finden meine Klasse unter folgendem Link: https://github.com/ukushu/DataExporter
Einfaches Beispiel für die Verwendung von:
quelle
Um die vorherigen Antworten zu vervollständigen, benötigt man möglicherweise eine Sammlung von Objekten aus seiner CSV-Datei, die entweder vom
TextFieldParser
oder vom analysiert werdenstring.Split
Methode und dann jede Zeile über Reflection in ein Objekt konvertiert wird. Sie müssen natürlich zuerst eine Klasse definieren, die den Zeilen der CSV-Datei entspricht.Ich habe den einfachen CSV-Serializer von Michael Kropat verwendet, der hier zu finden ist: Generische Klasse für CSV (alle Eigenschaften) und seine Methoden wiederverwendet, um die Felder und Eigenschaften der gewünschten Klasse abzurufen.
Ich deserialisiere meine CSV-Datei mit der folgenden Methode:
quelle
Ich würde dringend empfehlen, CsvHelper zu verwenden.
Hier ist ein kurzes Beispiel:
Die vollständige Dokumentation finden Sie unter: https://joshclose.github.io/CsvHelper
quelle