2016-12-06 1 views
1

Mein Anwendungsfall ist dies: Ich bin auf der Suche nach einer CSV-Datei in Node und bekomme nur die Header. Ich möchte die Ergebnisse eines Lesestreams nicht in eine Datei schreiben, sondern die Header nach dem Lesen der Datei in ein Array schieben, damit ich das Array nehmen und später etwas tun kann. ODER, noch besser, nehmen Sie den Stream und wie es gelesen wird, transformieren Sie es und senden Sie es dann an ein Array. Datei ist ein erfundener Wert. Ich bin an dieser Stelle stecken, wo die aktuelle Ausgabe von Daten-Datei ist ein leeres Array:Pipe NodeJS Stream zu einem Array

const fs = require('fs'); 
const parse = require('csv-parse'); 
const file = "my file path"; 
let dataFile = []; 

rs = fs.createReadStream(file); 
parser = parse({columns: true}, function(err, data){ 
    return getHeaders(data) 
}) 

function getHeaders(file){ 
    return file.map(function(header){ 
     return dataFile.push(Object.keys(header)) 
    }) 
} 

Was muß ich tun, um die Ergebnisse zu erhalten ich brauche? Ich erwarte, dass die Header in einem Array als Endergebnis gefunden werden.

Antwort

2

Ok, so gibt es einige verwirrende Dinge in Ihrem Code, und einen Fehler: Sie haben Ihren Code nicht wirklich nennen :)

zunächst eine Lösung, fügen Sie diese Zeile, nachdem Parser:

rs.pipe(parser).on('end', function(){ 
    console.log(dataFile); 
}); 

Und Magie, dataFile ist nicht leer. Sie streamen die Datei von der Festplatte, übergeben sie an den Parser und rufen am Ende einen Callback auf.

Für die verwirrenden Teile:

parser = parse({columns: true}, function(err, data){ 
    // You don't need to return anything from the callback, you give the impression that parser will be the result of getHeaders, it's not, it's a stream. 
    return getHeaders(data) 
}) 

function getHeaders(file){ 
    // change map to each, with no return, map returns an array of the return of the callback, you return an array with the result of each push (wich is the index of the new object). 
    return file.map(function(header){ 
     return dataFile.push(Object.keys(header)) 
    }) 
} 

Und finaly: Bitte wählen Sie mit der Linie endet mit ; oder nicht, aber nicht eine Mischung;)

Sie sollten am Ende mit etwas wie:

const fs = require('fs'); 
const parse = require('csv-parse'); 
const file = "./test.csv"; 
var dataFile = []; 

rs = fs.createReadStream(file); 
parser = parse({columns: true}, function(err, data){ 
    getHeaders(data); 
}); 

rs.pipe(parser).on('end', function(){ 
    console.log(dataFile); 
}); 

function getHeaders(file){ 
     file.each(function(header){ 
      dataFile.push(Object.keys(header)); 
     }); 
} 
+0

Schöne und zuverlässige Antwort! –