Schnelles, einfaches CSV-Parsen in C ++

8

Ich versuche, eine einfache CSV-Datei mit Daten in folgendem Format zu parsen:

%Vor%

Also, eine sehr einfache und fest formatierte Datei. Ich speichere jede Spalte dieser Daten in einem STL-Vektor. Als solche habe ich versucht, den C ++ - Weg mit der Standardbibliothek beizubehalten, und meine Implementierung in einer Schleife sieht ungefähr so ​​aus:

%Vor%

Das Problem ist, das ist extrem langsam (es gibt über 1 Million Zeilen pro Datei), und scheint mir etwas unelegant zu sein. Gibt es einen schnelleren Ansatz mit der Standard-Bibliothek, oder sollte ich nur stdio-Funktionen verwenden? Es scheint mir, dass sich der gesamte Codeblock auf einen einzigen fscanf-Aufruf reduzieren würde.

Vielen Dank im Voraus!

    
Kyle Lynch 30.05.2012, 10:20
quelle

3 Antworten

8

Die Verwendung von 7 String-Streams, wenn Sie es mit nur einem sicheren tun können, hilft nicht. Performance. Versuchen Sie es stattdessen:

%Vor%

Wenn Sie die Anzahl der Zeilen in der Datei kennen, können Sie die Vektoren vor dem Lesen ändern und dann operator[] anstelle von at() verwenden. Auf diese Weise vermeiden Sie die Überprüfung von Grenzen und erhalten dadurch ein wenig Leistung.

    
jrok 30.05.2012, 10:30
quelle
2

Ich glaube, der größte Engpass (abgesehen von der getline () - basierten nicht gepufferten E / A) ist das String-Parsing. Da Sie das Symbol "," als Trennzeichen verwenden, können Sie einen linearen Scan über die Zeichenfolge ausführen und alle "," durch "\ 0" (das Ende der Zeichenfolge, Null-Terminator) ersetzen.

In etwa so:

%Vor%     
Viktor Latypov 30.05.2012 10:33
quelle
1

Ich weiß nicht, ob das schneller ist als die angenommene Antwort, aber ich könnte es genauso gut posten, falls Sie es versuchen wollen. Sie können den gesamten Inhalt der Datei mit einem einzigen Leseaufruf laden, indem Sie die Größe der Datei mithilfe einiger fseek magic. Dies ist viel schneller als mehrere Leseanrufe.

Sie könnten dann etwas tun, um Ihre Zeichenfolge zu analysieren:

%Vor%     
TVOHM 30.05.2012 11:58
quelle

Tags und Links