444 Stimmen

CSV-Datei lesen und Werte in einem Array speichern

Ich versuche, eine *.csv -Datei.

En *.csv -Datei besteht aus zwei durch Semikolon getrennten Spalten (" ; ").

Ich bin in der Lage, die *.csv -Datei mit StreamReader und der Möglichkeit, jede Zeile mit dem Split() Funktion. Ich möchte jede Spalte in einem separaten Array speichern und dann anzeigen.

Ist das möglich?

36voto

Paul Punkte 34419

Normalerweise verwende ich diese Parser von codeproject da es eine Reihe von Zeichensprüngen und Ähnliches gibt, die es für mich erledigt.

34voto

tomsv Punkte 7007

Hier ist meine Variante der am häufigsten gewählten Antwort:

var contents = File.ReadAllText(filename).Split('\n');
var csv = from line in contents
          select line.Split(',').ToArray();

En csv kann dann wie im folgenden Beispiel verwendet werden:

int headerRows = 5;
foreach (var row in csv.Skip(headerRows)
    .TakeWhile(r => r.Length > 1 && r.Last().Trim().Length > 0))
{
    String zerothColumnValue = row[0]; // leftmost column
    var firstColumnValue = row[1];
}

12voto

Matt Punkte 23047

Wenn Sie (Kopf-)Zeilen und/oder Spalten überspringen müssen, können Sie auf diese Weise ein 2-dimensionales Array erstellen:

    var lines = File.ReadAllLines(path).Select(a => a.Split(';'));
    var csv = (from line in lines               
               select (from col in line
               select col).Skip(1).ToArray() // skip the first column
              ).Skip(2).ToArray(); // skip 2 headlines

Dies ist sehr nützlich, wenn Sie die Daten formen müssen, bevor Sie sie weiterverarbeiten (unter der Annahme, dass die ersten beiden Zeilen aus der Überschrift bestehen und die erste Spalte ein Zeilentitel ist - den Sie nicht im Array haben müssen, weil Sie nur die Daten betrachten wollen).

N.B.. Sie können die Überschriften und die 1. Spalte ganz einfach mit dem folgenden Code abrufen:

    var coltitle = (from line in lines 
                    select line.Skip(1).ToArray() // skip 1st column
                   ).Skip(1).Take(1).FirstOrDefault().ToArray(); // take the 2nd row
    var rowtitle = (from line in lines select line[0] // take 1st column
                   ).Skip(2).ToArray(); // skip 2 headlines

Dieses Codebeispiel geht von der folgenden Struktur Ihrer *.csv Datei:

CSV Matrix

Anmerkung: Wenn Sie leere Zeilen überspringen müssen - was manchmal praktisch sein kann -, können Sie dies durch Einfügen von

    where line.Any(a=>!string.IsNullOrWhiteSpace(a))

zwischen den from et le select Anweisung in der LINQ Code-Beispiele oben.

11voto

kombsh Punkte 5248

Für eine bessere Leistung können Sie Microsoft.VisualBasic.FileIO.TextFieldParser dll in C# verwenden.

Das folgende Code-Beispiel stammt aus dem obigen Artikel

static void Main()
{
    string csv_file_path=@"C:\Users\Administrator\Desktop\test.csv";

    DataTable csvData = GetDataTabletFromCSVFile(csv_file_path);

    Console.WriteLine("Rows count:" + csvData.Rows.Count);

    Console.ReadLine();
}

private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
{
    DataTable csvData = new DataTable();

    try
    {

    using(TextFieldParser csvReader = new TextFieldParser(csv_file_path))
        {
            csvReader.SetDelimiters(new string[] { "," });
            csvReader.HasFieldsEnclosedInQuotes = true;
            string[] colFields = csvReader.ReadFields();
            foreach (string column in colFields)
            {
                DataColumn datecolumn = new DataColumn(column);
                datecolumn.AllowDBNull = true;
                csvData.Columns.Add(datecolumn);
            }

            while (!csvReader.EndOfData)
            {
                string[] fieldData = csvReader.ReadFields();
                //Making empty value as null
                for (int i = 0; i < fieldData.Length; i++)
                {
                    if (fieldData[i] == "")
                    {
                        fieldData[i] = null;
                    }
                }
                csvData.Rows.Add(fieldData);
            }
        }
    }
    catch (Exception ex)
    {
    }
    return csvData;
}

8voto

Zbyszek Swirski Punkte 199

Ich habe einige Stunden mit der Suche nach einer geeigneten Bibliothek verbracht, aber schließlich habe ich meinen eigenen Code geschrieben :) Sie können die Datei (oder die Datenbank) mit jedem beliebigen Tool lesen und dann die folgende Routine auf jede Zeile anwenden:

private static string[] SmartSplit(string line, char separator = ',')
{
    var inQuotes = false;
    var token = "";
    var lines = new List<string>();
    for (var i = 0; i < line.Length; i++) {
        var ch = line[i];
        if (inQuotes) // process string in quotes, 
        {
            if (ch == '"') {
                if (i<line.Length-1 && line[i + 1] == '"') {
                    i++;
                    token += '"';
                }
                else inQuotes = false;
            } else token += ch;
        } else {
            if (ch == '"') inQuotes = true;
            else if (ch == separator) {
                lines.Add(token);
                token = "";
                } else token += ch;
            }
    }
    lines.Add(token);
    return lines.ToArray();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X