2016-10-21 3 views
0

Ich habe eine 1,4 GB CSV-Datei, die ich Zeile für Zeile durchlaufen und jede Zeile analysieren möchte. Sobald jede Zeile geparst wurde, fügen Sie diese Zeile zum Stream hinzu und schreiben Sie die Ausgabe als tsv-Datei. Ich dachte, dass der folgende Code funktioniert, aber es fügt einfach jede Zeile an das Ende der vorherigen Zeile hinzu, ohne Zeilenumbrüche hinzuzufügen, wie ich es erwartet hatte. Ich versuchte auch, .pipe(split2()) der Linie vor dem .pipe(writeStream) hinzuzufügen, um die Daten vor dem Schreiben zu teilen, aber das die Anwendung einfach einfror.Knoten Stream von CSV, Transform und Stream zu TSV

Hat jemand erfolgreich mit diesem Prozess in Knoten gelesen und geschrieben?

var fs = require('fs'), 
    _ = require('lodash'), 
    split2 = require('split2'), 
    through2 = require('through2'); 

fs.createReadStream('input_file_name.csv') 
    .pipe(split2()) 
    .pipe(through2.obj(function (chunk, enc, callback) { 

    // Process the CSV row 
    var row = _.zipObject(['header1', 'header2', 'header3'], chunk.toString().split(',')); 
    this.push(processRow(row).join('\t')); // does an action to each row 

    callback() 
})) 
.pipe(fs.createWriteStream('output_file_name.tsv')); 

Antwort

0

merkte, dass ich, wie das Hinzufügen eines guten CSV-Parser fehlt auf , sowie eine \n jeder data String am Ende anstatt einfach zu splitten.

var fs = require('fs'), 
    _ = require('lodash'), 
    parse = require('csv-parse'), 
    transform = require('stream-transform'); 

var parser = parse(); 

var transformer = transform(function (record, callback) { 
    var row = _.zipObject(['header1', 'header2', 'header3'], record); 
    callback(null, processRow(row).join('\t') + '\n'); 
}, {parallel: 10} 
); 

fs.createReadStream('input_file_name.csv') 
    .pipe(parser) 
    .pipe(transformer) 
    .pipe(fs.createWriteStream('output_file_name.tsv')); 
Verwandte Themen