2016-10-13 3 views
0

node-csvを使用してノードを持つCSVファイルの束を解析しています。何百ものファイルを解析する必要がありますが、パーサの 'columns'オプションを利用するために各ファイルにヘッダ行を追加する必要があります。 columnsオプションは各行をオブジェクトとして解析し、ヘッダー行はオブジェクトキーとして機能しますが、このオプションを機能させるにはヘッダー行が必要です。node-csvを使用してCSVファイルにヘッダー行を追加するにはどうすればよいですか?

ドキュメントを見ると、私のノードストリームは、行を追加する変換関数を介してノードストリームをパイプすることができるはずですが、現在のデータを変更せずにこの作業を行うのは困難です。ファイル。

ここで私は考えていますが、どのように '0'列に行を書きますか?

let createStream = function() { 
    let stream = fs.createReadStream(transPath+'/'+file, {encoding: 'utf8'}); 
    let parser = csv.parse({columns: true}); 
    let transform = csv.transform(function(record, doneTransform){ 
          //check if first zero row, 
          //Add header column. 
          doneTransform(); 
        }); 
    return stream.pipe(transform).pipe(parser); 
}; 

    createStream().on('data', function(transaction){ 
     //do stuff with object data 
    }); 

答えて

2

真の解決策:このソリューションを追加するための

let createStream = function() { 
    let stream = fs.createReadStream(transPath+'/'+file, {encoding: 'utf8'}); 
    let parser = csv.parse({skip_empty_lines: false, auto_parse: true, columns: header}); 
    return stream.pipe(parser); 
}; 

createStream().on('data', function(transaction){ 
     q.push(transaction); 
}); 
+0

感謝。私はあなたに同意します、これはよりよい解決策です。 – calbear47

0

私は、この問題を少し違って見て解決しました。私に説明させてください。

まず、TransformとParseパッケージを誤って使用したため、上記の私の最初の試みは機能しませんでした。あなたはパッケージが示唆しているようにそれらを独立して使うことができますが、それらを一緒に使用することに決めた場合は、CSVをまず解析してから変換する必要があります。

第2に、ヘッダーを使用する必要がなくなると、正しいキーと値のペアを持つオブジェクトが本当に欲しかったことに気付きました。これは、自分でデータを変換することにつながりました。私のためにこれを行うには 'カラム'オプションに頼っています。

これは私の結果につながりました:もし私が順序と各レコードの列の数を保証できるならば、変換関数内の対応するデータを持つ2つの配列からオブジェクトを作ることができます。ここ

コードである:

let createStream = function() { 
    let stream = fs.createReadStream(transPath+'/'+file, {encoding: 'utf8'}); 
    let parser = csv.parse({skip_empty_lines: false, auto_parse: true}); 
    let transform = csv.transform(function(record, doneTransform){ 
        let newObject = _.zipObject(header, record); 
        doneTransform(null, newObject); 
        }); 
    return stream.pipe(parser).pipe(transform); 
}; 

createStream().on('data', function(transaction){ 
     q.push(transaction); 
}); 

「ヘッダ」私はCSVからパース対応する値と最大ペアしたいキーの配列です。

私は2つの配列からObjectを作成するlodashのzipObject関数を利用しています。あなたはここにそれを見つけることができます:zipObject

これは、CSVファイルにヘッダーがない場合でも、解決策を見つけるのに役立ちます。

関連する問題