node.jsでcsvの入出力をする機会があったのでメモ。
やりたいこ
csvを読み込み、csvの特定のカラムに処理を加え、再度csvとして出力したい。
例えば下記のような感じ。
1,aaa,hoge
↓
1,AAA,hoge
2カラム目を大文字に変換して出力。
方針と準備
node-csvというモジュールがあるみたいなので、とりあえずそれを使ってみる。
npm install --save csv
テスト用のCSVファイルをindex.jsと同じ階層に作成。
test.csv
1,aaaa,hoge
2,bbbb,foo
実装
なんか独特の書き方。
index.js
const fs = require('fs');
const csv = require('csv');
//処理(跡でpipeに食べさせる)
const parser = csv.parse((error, data) => {
//内容出力
console.log('初期データ');
console.log(data);
//変換後の配列を格納
let newData = [];
//ループしながら1行ずつ処理
data.forEach((element, index, array) => {
let row = [];
row.push(element[0]);
row.push(element[1].toUpperCase()); //2カラム目を大文字へ
row.push(element[2]);
//新たに1行分の配列(row)を作成し、新配列(newData)に追加。
newData.push(row);
})
console.log('処理データ');
console.log(newData);
//write
csv.stringify(newData,(error,output)=>{
fs.writeFile('out.csv',output,(error)=>{
console.log('処理データをCSV出力しました。');
})
})
})
//読み込みと処理を実行
fs.createReadStream('test.csv').pipe(parser);
header行を読み飛ばすには下記のように、csv.parse()において、from_lineオプションを設定すればよい。
csv.parse({ from_line: 2 }, (error, data) => {})
実行してみる。
node index.js
出力結果。
out.csv
1,AAAA,hoge
2,BBBB,foo
その他
SJISとか読むならゴニョゴニョする必要があるらしい。