2017-08-07 3 views
-3

Ich muss Daten einer sehr großen CSV-Datei analysieren und sortieren. Bitte beachten Sie, dass die Datei aus ca. 600.000 Zeilen besteht. Ich muss es nicht irgendwo speichern oder in die DB importieren. Bitte geben Sie an, wie Sie diese Implementierung effizient durchführen können. Ich schätze deine Erfahrungsaustauscherfahrung.eine CSV-Datei lesen?

+0

Warum müssen Sie sortieren, wenn Sie nur den Medianwert benötigen? – jdweng

+0

Lesen Sie [RFC 4180] (https://tools.ietf.org/html/rfc4180), um das gesamte Bild im CSV-Format zu erhalten, und durchsuchen Sie anschließend eine Bibliothek, die CSV-Daten gemäß RFC 4180 –

+0

http: //www.filehelpers verarbeitet .net/example/Sorting/SortBigFiles/ –

Antwort

1

ich es so tun würde ...

var list = new List<float>(10000); 
using (var fs = new StreamReader(new FileStream("file.csv", FileMode.Open, FileAccess.Read, FileShare.None, 8192, FileOptions.SequentialScan))) 
{ 
    var line = fs.ReadLine(); 
    var columns = line.Split(','); 
    list.Add(Convert.ToSingle(columns[5])); 
} 
// Sort the list and do your calculations... 

Hinweis FileOptions.SequentialScan, auch mit dem spielen bufferSize (nicht sicher, ob der Standardwert 4096 oder 8192 ist) bessere Ergebnisse zu erzielen ... Auch Pre- Weisen Sie die Listengröße zu, um eine Größenanpassung der Liste zu verhindern ...

+0

Dank @Michael, kann ich gerade eine Spalte lesen? Ich brauche Daten aus einer einzigen Spalte. Ist es effizient, eine Spalte zu lesen? – user576510

+1

@ user576510 Wenn alle Spalten/Spalteninhalte eine feste Breite/Länge haben, können Sie den Dateicursor direkt vor der Spalte positionieren, den Inhalt lesen und dann n-Bytes vorwärts zur nächsten Zeilenspalte springen. Aber für normale csv-Dateien nehme ich Spalten mit variabler Länge an und dann lautet die Antwort nein, da Sie nicht wissen, wo Ihre Datenspalte beginnt und wann die aktuelle Zeile endet ... – Michael

+0

Parsen [diese csv] (http://imgur.com/a/url59). –

1

Eine Möglichkeit, die Sortierung großer Dateien mit externer Sortierung zu verarbeiten. Es gibt eine Reihe von CSV-Bibliotheken, die sie aus der Box anbieten.

Cinchoo ETL verfügt über einen CSVReader mit externer Sortierfunktion. Sie können es für Ihren Zweck nutzen

a. Definieren Sie die POCO-Klasse, um den CSV-Datensatz darzustellen. Wichtig: Markieren Sie die Klasse als serialisierbar, um sie für die externe Sortierung zu verwenden.

[Serializable] 
public class Customer 
{ 
    [ChoCSVRecordField(1)] 
    [Key] 
    public int Id { get; set; } 
    [ChoCSVRecordField(2)] 
    public string Street { get; set; } 
    [ChoCSVRecordField(4)] 
    public string City { get; set; } 
    [ChoCSVRecordField(6)] 
    public string Zip { get; set; } 
} 

b. Comparer-Klasse zum Sortieren nach einer Spalte schreiben (z. B. nach Stadt sortieren)

public class AddressCityComparer : IComparer<Customer> 
{ 
    public int Compare(Customer x, Customer y) 
    { 
     return String.Compare(x.City, y.City); 
    } 
} 

c. Zuletzt laden Sie die CSV-Datei mit ChoCSVReader. Übergeben Sie es an ExternalSorting-Methode, um sie zu sortieren

foreach (var e in new ChoCSVReader<Customer>("Test.txt").WithDelimiter("\t").ExternalSort(new AddressCityComparer())) 
    Console.WriteLine(e.City); 

Hoffe, dass dies hilft.