情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでCSVデータやTSVデータをパースする

2016/04/04

CSVデータ(やTSVデータ)をパースするストリームを作成するにはCSV for Node.jsパッケージのcsv-parseモジュールを利用します。


csvParse関数を呼び出します。

第1引数にオプションを指定します。

主なオプションには下のようなものがあります。

  • delimiter・・・フィールドの区切り文字です。1文字でなければなりません。デフォルトは,です。
  • rowDelimiter・・・レコードの区切り文字です。autounixmacwindowsunicodeのような特別な定数を指定することもできます。デフォルトはautoです。
  • quote・・・フィールドの囲み文字です。1文字でなければなりません。デフォルトは"です。
  • escape・・・エスケープ文字です。1文字でなければなりません。デフォルトは"です。
  • columns・・・フィールド名です。trueを指定するとCSVデータの1行目がフィールド名となります。デフォルトはnullです。
  • comment・・・コメント文字です。行の中でこの文字以降にある文字列はコメントとなります。デフォルトは#です。
  • skip_empty_line・・・空行を空のレコードとするかです。
  • trim・・・フィールドの両端にある空白を除去するかです。デフォルトはfalseです。

返り値としてストリームが得られます。

ストリームにCSVデータのレコードが読み込まれるとdataイベントが発生します。このイベントのイベントハンドラの第1引数は読み込まれたレコードです。レコードはオプションでフィールド名が指定されている場合にはオブジェクトで表され、指定されていない場合には配列で表されます。


なお、ストリームの詳しい使い方に関しては下の記事を参照してください。

サンプルコード1

コマンドライン引数として与えられたCSVファイル(タブ区切りなので正確にはTSVファイルと言うべきかもしれません)を読み込み、標準出力に出力します。

csv-parse.js

var fs = require('fs');
var csvParse = require('csv-parse');

if (process.argv.length < 3) {
    console.error('lack argument.');
    process.exit(1);
}

var rs = null;
try {
    rs = fs.createReadStream(process.argv[2], 'utf-8');
    rs.on('error', function (err) {
        console.error(err);
        process.exit(1);
    });
}
catch (err) {
    console.error(err);
    process.exit(1);
}

var parser = csvParse({ delimiter: '\t' });
parser.on('data', function (data) {
    console.log(data);
});
parser.on('error', function (err) {
    console.error(err);
    process.exit(1);
});

rs.pipe(parser);

使用パッケージ

実行結果

現在のフォルダには下のような内容のenglish.csvという名称のTSVファイルが存在しています。

3       1       reading                 測定値
2       1       style                   ~と呼ぶ、様式
3       2       due                     ~することになっている、期限が来て、正当な
3       3       ankle                   足首
4       3       discipline              訓練、規律、分野、学科
4       3       extraordinary           異常な
3       3       joint                   接合(部)、関節、いかがわしい場所、共同の
4       3       virtue                  美徳、効力
5       4       bundle                  ~を束ねる、束
4       4       deceive                 ~をだます
5       4       reproduce               ~を複製する
6       4       rip                     ~を引き裂く
4       4       substitute              ~を代わりに用いる、~を置換する、代用品、代用の
6       5       cashier                 現金出納係、レジ係
4       5       envy                    ~をうらやむ、うらやましさ
6       5       mouthful                口いっぱい、正しい言葉
6       5       reap                    ~を収穫する、~を得る
5       5       refresh                 ~の元気を回復させる
6       5       refreshment             元気回復、飲食物、軽食
6       6       deceit                  詐欺

english.csvを第1引数としてコードを実行すると結果は下のようになりました。TSVデータが正しくパースされていることが分かります。

C:\work\node>node csv-parse.js english.csv
[ '3', '1', 'reading', '', '', '測定値' ]
[ '2', '1', 'style', '', '', '~と呼ぶ、様式' ]
[ '3', '2', 'due', '', '', '~することになっている、期限が来て、正当な' ]
[ '3', '3', 'ankle', '', '', '足首' ]
[ '4', '3', 'discipline', '', '訓練、規律、分野、学科' ]
[ '4', '3', 'extraordinary', '', '異常な' ]
[ '3', '3', 'joint', '', '', '接合(部)、関節、いかがわしい場所、共同の' ]
[ '4', '3', 'virtue', '', '', '美徳、効力' ]
[ '5', '4', 'bundle', '', '', '~を束ねる、束' ]
[ '4', '4', 'deceive', '', '', '~をだます' ]
[ '5', '4', 'reproduce', '', '~を複製する' ]
[ '6', '4', 'rip', '', '', '~を引き裂く' ]
[ '4', '4', 'substitute', '', '~を代わりに用いる、~を置換する、代用品、代用の' ]
[ '6', '5', 'cashier', '', '', '現金出納係、レジ係' ]
[ '4', '5', 'envy', '', '', '~をうらやむ、うらやましさ' ]
[ '6', '5', 'mouthful', '', '口いっぱい、正しい言葉' ]
[ '6', '5', 'reap', '', '', '~を収穫する、~を得る' ]
[ '5', '5', 'refresh', '', '', '~の元気を回復させる' ]
[ '6', '5', 'refreshment', '', '元気回復、飲食物、軽食' ]
[ '6', '6', 'deceit', '', '', '詐欺' ]

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js