はじめに
node.jsでcsvを読み書きしたい時があったので,備忘録としてまとめようと思い,この記事を書きました。
streamを使ったやり方など,色々と方法があったのですが,今回は fs.readFileSync
と fs.writeFileSync
を用いた方法でやってみました。
大まかな流れ
- 必要なパッケージのダウンロード
- 読み込むcsvファイルの作成
- 実行ファイルの作成
- 実行
必要なパッケージのダウンロード
今回は, csv
というモジュールを使用しますので,以下コマンドを使用してダウンロードします。
$npm install--save csv
--save
: package.jsonのdependenciesに追加される
読み込むcsvファイルの作成
先頭の行に,カラム名を入れておきます。
input.csv
name,age,gender
taro,30,man
jiro,28,man
hanako,20,woman
実行ファイルの作成
実行ファイルの完成形
input.csv
というcsvファイルを読み込み,行を追加して output.csv
という名前で出力するコードになっています。
sample.js
// file system モジュールを読み込むconstfs=require('fs');// csv モジュールの内,必要な機能を読み込むconstparse=require('csv-parse/lib/sync');conststringify=require('csv-stringify/lib/sync');// csvファイルを読み込むconstinputData=fs.readFileSync('./input.csv',{encoding:'utf8'});// 先頭行をcolumnとして扱い,csvデータをparseconstparsedData=parse(inputData,{columns:true});// 行を追加parsedData.push({'name':'saburo','age':'25','gender':'man'});// オブジェクトのプロパティを先頭行に記述し,csvデータに変換constoutputData=stringify(parsedData,{header:true});// csvファイルを出力fs.writeFileSync('output.csv',outputData,{encoding:'utf8'});
以下で詳細に説明します。
モジュールの読み込み
sample.js(一部)
// file system モジュールを読み込むconstfs=require('fs');// csv モジュールの内,必要な機能を読み込むconstparse=require('csv-parse/lib/sync');conststringify=require('csv-stringify/lib/sync');
実装に必要なモジュールを読み込みます。(csv-parse と csv-stringfy については,後ほど詳しく説明します。)
csvファイルを読み込む
sample.js(一部)
// csvファイルを読み込むconstinputData=fs.readFileSync('./input.csv',{encoding:'utf8'});
fsモジュールを用いて, input.csv
を読み込みます。
今回は,オプションで文字コードを UTF-8
と指定しています。
csvファイルをオブジェクトに変換
sample.js(一部)
// 先頭行をcolumnとして扱い,csvデータをparseconstparsedData=parse(inputData,{columns:true});
fs.readFileSync
でcsvファイルを読み込むと,以下のように単なる文字列として保存されます。
inputDataの中身
name,age,gender
taro,30,man
jiro,28,man
hanako,20,woman
これを,javascriptで操作しやすくするためにオブジェクトの形式に変更するのが, csv-parseです。columns : true
というオプションをつけることによって,csvファイルの先頭行を,オブジェクト変換後のプロパティとして扱います。
parsedDataの中身
[
{ name: 'taro', age: '30', gender: 'man' },
{ name: 'jiro', age: '28', gender: 'man' },
{ name: 'hanako', age: '20', gender: 'woman' }
]
末尾に行を追加
sample.js(一部)
// 行を追加parsedData.push({'name':'saburo','age':'25','gender':'man'});
オブジェクトをcsvデータに変換
sample.js(一部)
// オブジェクトのプロパティを先頭行に記述し,csvデータに変換constoutputData=stringify(parsedData,{header:true});
csv-stringifyは, csv-parseとは逆に,javascriptのオブジェクトをcsvファイルとして出力するための文字列に変換するモジュールです。
変換されたデータは,以下のような中身になっています。
outputDataの中身
name,age,gender
taro,30,man
jiro,28,man
hanako,20,woman
saburo,25,man
csvファイルを出力
sample.js(一部)
// csvファイルを出力fs.writeFileSync('output.csv',outputData,{encoding:'utf8'});
fs
モジュールを用いて, output.csv
という名前でcsvファイルを出力します。
実行
$node sample.js
output.csv
name,age,gender
taro,30,man
jiro,28,man
hanako,20,woman
saburo,25,man