HOWTO · Csharp
C# eine CSV-Datei lesen und ihre Werte in einem Array speichern
Dieser How-To-Artikel zeigt verschiedene Methoden zum Lesen einer CSV-Datei und zum Speichern ihrer Werte in einem Array in C#. Er stellt Methoden wie OpenRead(), ReadLine() und TextFieldParser
Auf dieser Seite
Eine CSV-Datei ist eine kommagetrennte Datei, die verwendet wird, um Daten organisiert zu speichern. Sie speichert Daten üblicherweise in Tabellenform. Die meisten Unternehmen speichern ihre Daten in CSV-Dateien.
In C# können wir verschiedene Operationen mit einer CSV-Datei ausführen. Wir können eine CSV-Datei lesen, schreiben und verändern. Dieser Artikel konzentriert sich auf zwei Methoden, eine CSV-Datei zu lesen und ihre Werte in einem Array zu speichern: das Lesen von Zeilen mit StreamReader und das Parsen von Feldern mit TextFieldParser.
Beide Beispiele verwenden dieselbe Beispiel-Datei Data.csv:
Name,Age
Alice,30
Bob,25
Eine CSV-Datei mit StreamReader lesen
Die Klasse StreamReader liest eine Datei als Textstrom. File.OpenRead() öffnet die Datei, und ReadLine() gibt eine Zeile nach der anderen zurück, bis EndOfStream erreicht ist. Das Aufteilen jeder Zeile am Komma ergibt die einzelnen Werte, die das Beispiel in einer Liste pro Spalte speichert.
Die korrekte Syntax zur Verwendung der Methoden OpenRead() und ReadLine() lautet wie folgt:
// OpenRead() Syntax
File.OpenRead(@"FilePath");
// ReadLine() Syntax
StreamReaderObject.ReadLine();
Beispielcode:
using System.IO;
using System.Collections.Generic;
using System;
class ReadingCSV {
static void Main(string[] args) {
var reader = new StreamReader(File.OpenRead(@"D:\New folder\Data.csv"));
List<string> listA = new List<string>();
List<string> listB = new List<string>();
while (!reader.EndOfStream) {
var line = reader.ReadLine();
var values = line.Split(',');
listA.Add(values[0]);
listB.Add(values[1]);
}
foreach (var column1 in listA) {
Console.WriteLine(column1);
}
foreach (var column2 in listB) {
Console.WriteLine(column2);
}
}
}
Ausgabe:
Name
Alice
Bob
Age
30
25
Das Aufteilen am Komma funktioniert, wenn kein Feld selbst ein Komma enthält. Ein in Anführungszeichen gesetztes Feld wie "Smith, John" würde an der falschen Stelle geteilt; verwenden Sie für solche Dateien TextFieldParser.
CSV-Felder mit TextFieldParser parsen
Die Klasse TextFieldParser ist im Namespace Microsoft.VisualBasic.FileIO definiert. Sie parst eine Datei mit Trennzeichen Feld für Feld und versteht in Anführungszeichen gesetzte Felder. Legen Sie die Trennzeichen mit SetDelimiters() fest und rufen Sie dann ReadFields() auf, um die Felder der aktuellen Zeile als String-Array zu erhalten; der Parser wechselt bei jedem Aufruf zur nächsten Zeile. Fügen Sie in einem .NET-Framework-Projekt einen Verweis auf Microsoft.VisualBasic hinzu, bevor Sie das folgende Programm ausführen; im modernen .NET ist der Namespace Teil des Shared Framework.
Die korrekte Syntax zur Verwendung dieses Parsers lautet wie folgt:
TextFieldParser ParserName = new TextFieldParser(PathString);
Beispielcode:
using System;
using System.Collections.Generic;
using Microsoft.VisualBasic.FileIO;
class ReadingCSV {
public static void Main() {
var path = @"D:\New folder\Data.csv";
List<string> listA = new List<string>();
List<string> listB = new List<string>();
using (TextFieldParser csvReader = new TextFieldParser(path)) {
csvReader.CommentTokens = new string[] { "#" };
csvReader.SetDelimiters(new string[] { "," });
csvReader.HasFieldsEnclosedInQuotes = true;
// Skip the row with the column names
csvReader.ReadLine();
while (!csvReader.EndOfData) {
// Read current line fields, pointer moves to the next line.
string[] fields = csvReader.ReadFields();
listA.Add(fields[0]);
listB.Add(fields[1]);
}
}
foreach (var column1 in listA) {
Console.WriteLine(column1);
}
foreach (var column2 in listB) {
Console.WriteLine(column2);
}
}
}
Ausgabe:
Alice
Bob
30
25
Diesmal wird die Kopfzeile mit dem anfänglichen ReadLine() übersprungen, und der Parser, nicht eine manuelle Aufteilung, entscheidet, wo jedes Feld endet, sodass ein in Anführungszeichen gesetztes Komma innerhalb eines Feldes intakt bleibt.