Help us understand the problem. What is going on with this article?

nodeでcsvの読み書き

More than 1 year has passed since last update.

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とか読むならゴニョゴニョする必要があるらしい。

zaburo
こんにちは。自分用のメモをだらだら公開しています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away