2014-01-10 6 views
6

Derzeit verwende ich Node-csv (http://www.adaltas.com/projects/node-csv/) für CSV-Dateianalyse.Wie überspringe erste Zeilen der Datei mit Node-CSV-Parser?

Gibt es eine Möglichkeit, die ersten paar Zeilen der Datei zu überspringen, bevor Sie mit der Analyse der Daten beginnen? Wie einige CSV-Berichte zum Beispiel haben Bericht Details in den ersten paar Zeilen, bevor die eigentlichen Header und Daten starten.

LOG REPORT     <- data about the report 
DATE: 1.1.1900 
DATE,EVENT,MESSAGE   <- data headers 
1.1.1900,LOG,Hello World! <- actual data stars here 
+1

Haben Sie Glück dabei? Ich benutze die gleiche Bibliothek und habe die gleiche Frage .. – ac360

Antwort

4

Sie haben zwei Möglichkeiten:

  1. Sie die Datei Zeile-für-Zeile verarbeiten kann. Ich habe ein Code-Snippet in einem answer früher veröffentlicht. Sie können verwendet werden, dass

    var rl = readline.createInterface({ 
        input: instream, 
        output: outstream, 
        terminal: false 
    }); 
    
    rl.on('line', function(line) { 
        console.log(line); 
        //Do your stuff ... 
        //Then write to outstream 
        rl.write(line); 
    }); 
    
  2. Sie können eine auf Ihre Filestream-Offset geben, die diese Bytes überspringen wird. Sie können es in der Das ist viel einfacher documentation

    fs.createReadStream('sample.txt', {start: 90, end: 99}); 
    

    sehen, wenn Sie den Offset wissen fixiert ist.

+0

+1 für das Erstellen eines neuen Streams mit dem Offset, hält alles als Stream daher node.js-ish. – booyaa

5

Sie verwenden v0.4 oder höher mit dem neuen refactor Unter der Annahme (dh csv-generieren, csv-parsen, Strom-Transformation und csv-stringify), können Sie die eingebaute in Transformation verwenden, um Überspringe die erste Zeile mit ein wenig zusätzlicher Arbeit.

var fs = require('fs'), 
    csv = require('csv'); 

var skipHeader = true; // config option 

var read = fs.createReadStream('in.csv'), 
    write = fs.createWriteStream('out.jsonish'), 
    parse = csv.parse(), 
    rowCount = 0, // to keep track of where we are 
    transform = csv.transform(function(row,cb) { 
     var result; 
     if (skipHeader && rowCount === 0) { // if the option is turned on and this is the first line 
      result = null; // pass null to cb to skip 
     } else { 
      result = JSON.stringify(row)+'\n'; // otherwise apply the transform however you want 
     } 
     rowCount++; // next time we're not at the first line anymore 
     cb(null,result); // let node-csv know we're done transforming 
    }); 

read 
    .pipe(parse) 
    .pipe(transform) 
    .pipe(write).once('finish',function() { 
     // done 
    }); 

Im Wesentlichen verfolgen wir die Anzahl der Zeilen, die transformiert wurden und wenn wir auf dem ersten ein (und wir in-fact den Header über skipHeader Bool überspringen), dann passieren null an den Rückruf als zweiter Parameter (der erste ist immer ein Fehler), ansonsten das transformierte Ergebnis übergeben.

Dies funktioniert auch mit synchronem Parsen, erfordert aber eine Änderung, da im synchronen Modus kein Rückruf erfolgt. Die gleiche Logik könnte auch auf die ältere v0.2-Bibliothek angewendet werden, da sie auch eine eingebaute Zeilenumwandlung aufweist.

Siehe http://csv.adaltas.com/transform/#skipping-and-creating-records

Dies ist sehr einfach anzuwenden und IMO hat eine ziemlich geringe Stellfläche. Normalerweise möchten Sie die Zeilen verfolgen, die für Statuszwecke verarbeitet wurden, und ich wandle fast immer die Ergebnismenge um, bevor Sie sie an Writable senden. Daher ist es sehr einfach, zusätzliche Logik hinzuzufügen, um zu überprüfen, ob die Kopfzeile übersprungen wird. Der zusätzliche Vorteil hier ist, dass wir das selbe Modul benutzen, um die Überspringlogik anzuwenden, wie wir analysieren/transformieren müssen - keine zusätzlichen Abhängigkeiten sind nötig.

Verwandte Themen