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?

586voto

Michael M. Punkte 6186

Sie können das so machen:

using System.IO;

static void Main(string[] args)
{
    using(var reader = new StreamReader(@"C:\test.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]);
        }
    }
}

282voto

Habeeb Punkte 6775

Mein bevorzugter CSV-Parser ist ein in die .NET-Bibliothek integrierter Parser. Dies ist ein versteckter Schatz im Microsoft.VisualBasic-Namensraum. Unten finden Sie einen Beispielcode:

using Microsoft.VisualBasic.FileIO;

var path = @"C:\Person.csv"; // Habeeb, "Dubai Media City, Dubai"
using (TextFieldParser csvParser = new TextFieldParser(path))
{
 csvParser.CommentTokens = new string[] { "#" };
 csvParser.SetDelimiters(new string[] { "," });
 csvParser.HasFieldsEnclosedInQuotes = true;

 // Skip the row with the column names
 csvParser.ReadLine();

 while (!csvParser.EndOfData)
 {
  // Read current line fields, pointer moves to the next line.
  string[] fields = csvParser.ReadFields();
  string Name = fields[0];
  string Address = fields[1];
 }
}

Denken Sie daran, einen Verweis auf Microsoft.VisualBasic

Weitere Einzelheiten über den Parser finden Sie hier: http://codeskaters.blogspot.ae/2015/11/c-easiest-csv-parser-built-in-net.html

93voto

as-cii Punkte 12459

LINQ Weg:

var lines = File.ReadAllLines("test.txt").Select(a => a.Split(';'));
var csv = from line in lines
          select (from piece in line
                  select piece);

^^Falsch - Bearbeitung durch Nick

Es scheint, dass der ursprüngliche Antwortende versucht hat, die csv mit einem 2-dimensionalen Array - einem Array mit Arrays. Jedes Element im ersten Array enthält ein Array, das die Zeilennummer repräsentiert, wobei jedes Element im verschachtelten Array die Daten für diese spezifische Spalte enthält.

var csv = from line in lines
          select (line.Split(',')).ToArray();

58voto

joshb Punkte 5042

Ich bin gerade auf diese Bibliothek gestoßen: https://github.com/JoshClose/CsvHelper

Sehr intuitiv und einfach zu bedienen. Hat auch ein Nuget-Paket, das schnell zu implementieren ist: https://www.nuget.org/packages/CsvHelper/27.2.1 . Es scheint auch aktiv gewartet zu werden, was mir gefällt.

Die Konfiguration zur Verwendung eines Semikolons ist einfach: https://github.com/JoshClose/CsvHelper/wiki/Custom-Configurations

41voto

digEmAll Punkte 54672

Sie können nicht sofort ein Array erstellen, da Sie die Anzahl der Zeilen von Anfang an kennen müssen (und das würde bedeuten, dass Sie die CSV-Datei zweimal lesen müssten)

Sie können Werte auf zwei Arten speichern List<T> und verwenden sie dann oder konvertieren sie in ein Array mit List<T>.ToArray()

Ein sehr einfaches Beispiel:

var column1 = new List<string>();
var column2 = new List<string>();
using (var rd = new StreamReader("filename.csv"))
{
    while (!rd.EndOfStream)
    {
        var splits = rd.ReadLine().Split(';');
        column1.Add(splits[0]);
        column2.Add(splits[1]);
    }
}
// print column1
Console.WriteLine("Column 1:");
foreach (var element in column1)
    Console.WriteLine(element);

// print column2
Console.WriteLine("Column 2:");
foreach (var element in column2)
    Console.WriteLine(element);

N.B..

Bitte beachten Sie, dass dies nur eine sehr einfaches Beispiel . Verwendung von string.Split berücksichtigt nicht die Fälle, in denen einige Datensätze das Trennzeichen ; in ihm.
Für einen sichereren Ansatz, erwägen Sie die Verwendung einiger csv-spezifischen Bibliotheken wie CsvHelper auf nuget.

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