2016-08-04 17 views
1

Ich versuche, eine CSV-Datei analysieren und extrahieren die erste Zeichenfolge in jeder Zeile oder die erste Spalte, wie es in MS Excel ausgelegt ist. Ich verwende CsvParser mit der Read() Methode, die eine string[] an die row Variable zurückgibt. Das Problem ist, es ist jeden einzelnen Wert zurückgibt, so meine aus sieht wie folgt für jede Zeile:Holen Sie nur die ersten Spaltenwerte aus CSV-Zeilen mit CSVHelper

20070330 00:00 // This is the value I want to reference 
0.9312 
0.9352 
0.9298 
0.9343 

Wie kann ich nur die Werte an diesen Positionen in der Datei verweisen, ohne in einen Zähler setzen die überspringen Zwischenwerte?

enter image description here

using (TextReader reader = File.OpenText(folder)) 
     { 
      var datesInCsv = new List<string>(); 
      var parsedCsv = new CsvParser(reader); 
      while (true) 
      { 
       var row = parsedCsv.Read(); 
       if (row.IsNullOrEmpty()) 
       { 
        break; 
       } 
       foreach (var date in row) 
       { 
        Console.WriteLine(date); 
       } 

       Console.ReadLine(); 
      } 

     } 
+0

Haben Sie es geschafft, diesen Code zu kompilieren oder erhalten Sie einen Fehler direkt vom Compiler? – Steve

+0

Muss falsch eingefügt worden sein, wenn ich einen irrelevanten Abschnitt entfernt habe. Wiederholt –

+0

Noch kann ich nicht finden, eine IsNullOrEmpty-Methode auf den Rückgabewert von Read angewendet. Verwenden Sie [diese Bibliothek] (https://github.com/JoshClose/CsvHelper)? – Steve

Antwort

1

Die von Ihnen verwendete CsvHelper library erfordert, dass Sie eine CsvConfiguration-Instanz übergeben, wenn Sie die Instanz einer CsvParse-Klasse erstellen. Dies ist wichtig, damit die Bibliothek Ihre Zeile verstehen und korrekt analysieren kann.

Die wichtigste Angabe ist der Wert für die Delimiter-Eigenschaft. Mit anderen Worten, das Zeichen trennt ein Feld vom nächsten.
Sie sollten sich Ihre CSV-Datei ansehen und den entsprechenden Wert eingeben.
(Für dieses Beispiel habe ich das Semikolon verwendet, aber ändern Sie es entsprechend Ihrer Datei)

Blick auf Sie Code Ich denke auch, dass die Konfiguration SkipEmptyRecords verwendet werden könnte, um den Code zu vereinfachen.

using (TextReader reader = File.OpenText(folder)) 
{ 
    var datesInCsv = new List<string>(); 
    CsvConfiguration config = new CsvConfiguration(); 
    config.Delimiter = ";"; 
    config.SkipEmptyRecords = true; 
    var parsedCsv = new CsvParser(reader, config); 

    string[] row = null; 
    while ((row = parsedCsv.Read()) != null) 
    { 
     // This IsNullOrEmpty doesn't exist according 
     // to Intellisense and the compiler. 
     // if(row.IsNullOrEmpty) 

     // At this point the row is an array of strings where the first 
     // element is the value you are searching for. No need of loops 
     Console.WriteLine(row[0]); 
     Console.ReadLine(); 
    } 

} 

Die Read-Methode der CsvParser Instanz gibt einen Array von Strings nach der Eingabezeile entsprechend Ihren Begrenzer zu splitten. An dieser Stelle müssen Sie nur auf das erste Element des Arrays ohne Schleife verweisen.

0

Sie müssen die Aufzeichnungen zu "lesen" und das Argument der "Mapping" Sie wollen passieren. Entweder nach Index oder Name.

Sehen Sie hier an jedem Abschnitt detailliert oben:

https://joshclose.github.io/CsvHelper/

1

Sie sind explizit jeden Wert auf die Konsole hier Druck:

foreach (var date in row) 
{ 
    Console.WriteLine(date); 
} 

Diese foreach-Schleife iteriert über alle elemtens der aktuellen Zeile und drucke sie aus.

damit die Schleife ersetzen, die nur das erste Element gedruckt wird (Index 0):

Console.WriteLine(row[0]); 

Natürlich ist dies nicht kann, wenn die Zeile leer war, so dass man für das überprüfen müssen auch .