[Node.js] JSONをCSV形式でファイルに書き込む - csv-writer

小ネタです。 csv-writerモジュールを使うとJSON的なデータをCSV形式でかんたんに保存することができます。

// CSVにしたいデータ(オブジェクト)
const data = [
  {id:1, title:"吾輩は猫である", view:123},
  {id:2, title:"坊っちゃん",     view:456},
  {id:3, title:"こころ",        view:789}
];

// 準備
const createCsvWriter = require('csv-writer').createObjectCsvWriter;
const csvWriter = createCsvWriter({
  path: '/var/tmp/data.csv',       // 保存する先のパス(すでにファイルがある場合は上書き保存)
  header: ['id', 'title', 'view']  // 出力する項目(ここにない項目はスキップされる)
});

// 書き込み
csvWriter.writeRecords(data)
  .then(() => {
    console.log('done');
  });

次のようなファイルが生成されます。

$ cat /var/tmp/data.csv
1,吾輩は猫である,123
2,坊っちゃん,456
3,こころ,789

インストール

適当なプロジェクト用のディレクトリを準備します。

$ mkdir foo && cd foo
$ npm init

したらば今回利用するモジュールをインストールします。

$ npm install csv-writer

その他の使い方

ヘッダー行を出力する

出力する項目を設定する際に、以下のようにヘッダー内容を指定します。

const csvWriter = createCsvWriter({
  path: '/var/tmp/data.csv',
  header: [
    {id:'id',    title:'ID'},
    {id:'title', title:'タイトル'},
    {id:'view',  title:'閲覧数'}
  ]
});

実行するとヘッダー付きで出力されます。

$ cat /var/tmp/data.csv
ID,タイトル,閲覧数
1,吾輩は猫である,123
2,坊っちゃん,456
3,こころ,789

区切り文字を変更する

fieldDelimiterで区切りに使いたい文字を指定します。

const csvWriter = createCsvWriter({
  path: '/var/tmp/data.csv',
  header: ['id', 'title', 'view'],
  fieldDelimiter: ";"
});

以下のようにセミコロンで区切られたファイルが出力されます。

$ cat /var/tmp/data.csv
1;吾輩は猫である;123
2;坊っちゃん;456
3;こころ;789

……が、残念ながらこのオプションはカンマかセミコロンしか指定できません。それ以外の文字を指定すると例外が発生し終了します。

改行を「\n」から「\r\n」にする

デフォルトの\nから\r\nに変更できます。

const csvWriter = createCsvWriter({
  path: '/var/tmp/data.csv',
  header: ['id', 'title', 'view'],
  recordDelimiter: "\r\n"
});

こちらもそれ以外の文字には変更できないのでご注意を。

常に引用符で囲う

alwaysQuoteにtrueを指定するとすべての項目がダブルコーテーションで囲われます。デフォルトはfalseです。

const csvWriter = createCsvWriter({
  path: '/var/tmp/data.csv',
  header: ['id', 'title', 'view'],
  alwaysQuote: true
});

以下のような結果になります。

$ cat /var/tmp/data.csv
"1","吾輩は猫である","123"
"2","坊っちゃん","456"
"3","こころ","789"

既存ファイルに追加書き込みする

通常は上書き保存されますが、appendにtrueを指定するとデータが末尾に追加されます。

const csvWriter = createCsvWriter({
  path: '/var/tmp/data.csv',
  header: ['id', 'title', 'view'],
  append: true
});

次のように2回実行すると追加書き込みされているのがわかりますね。

$ node putcsv.js
$ node putcsv.js

$ cat /var/tmp/data.csv
1,吾輩は猫である,123
2,坊っちゃん,456
3,こころ,789
1,吾輩は猫である,123
2,坊っちゃん,456
3,こころ,789

参考ページ