Node.jsでCSVデータやTSVデータを文字列化する
CSVデータ(やTSVデータ)を文字列化するストリームを作成するにはCSV for Node.js
パッケージのcsv-stringify
モジュールを利用します。
csvStringify
関数を呼び出します。
第1引数にオプションを指定します。
主なオプションには下のようなものがあります。
delimiter
・・・フィールドの区切り文字です。1文字でなければなりません。デフォルトは,
です。rowDelimiter
・・・レコードの区切り文字です。auto
、unix
、mac
、windows
、unicode
のような特別な定数を指定することもできます。デフォルトはauto
です。eof
・・・文字列の最後にrowDelimiter
を付加するかです。quote
・・・フィールドの囲み文字です。escape
・・・エスケープ文字です。columns
・・・フィールド名のリストです。headers
・・・文字列の最初の行としてフィールド名を付加するかです。
返り値としてストリームが得られます。
なお、ストリームの詳しい使い方に関しては下の記事を参照してください。
サンプルコード1
コマンドライン引数として与えられたCSVファイル(タブ区切りなので正確にはTSVファイルと言うべきかもしれません)を読み込み、変換を行い、コマンドライン引数として与えられたCSVファイルに書き込みます。
▼csv-stringify.js
var fs = require('fs');
var csvParse = require('csv-parse');
var streamTransform = require('stream-transform');
var csvStringify = require('csv-stringify');
if (process.argv.length < 4) {
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('error', function (err) {
console.error(err);
process.exit(1);
});
var transformer = streamTransform(function (data) {
var after = [];
for (var i = 0; i < data.length; i++) {
if (data[i] != '') {
after.push(data[i]);
}
}
if (after.length != 4) {
console.error('this is corrupted data.');
return null;
}
else {
after[0] = increment(after[0]);
if (after[0] == null) {
console.error('this is corrupted data.');
return null;
}
after[1] = increment(after[1]);
if (after[1] == null) {
console.error('this is corrupted data.');
return null;
}
return after;
}
});
transformer.on('error', function (err) {
console.error(err);
process.exit(1);
});
var stringifier = csvStringify({ rowDelimiter: 'windows' });
stringifier.on('error', function (err) {
console.error(err);
process.exit(1);
});
var ws = null;
try {
ws = fs.createWriteStream(process.argv[3], 'utf-8');
ws.on('finish', function (err) {
console.log('finished!!');
});
ws.on('error', function (err) {
console.error(err);
process.exit(1);
});
}
catch (err) {
console.error(err);
process.exit(1);
}
rs.pipe(parser).pipe(transformer).pipe(stringifier).pipe(ws);
function increment(level) {
if (level == `*`) {
return level;
}
else {
var n = parseInt(level, 10);
if (n == NaN) {
return null;
}
else {
return (n + 1).toString(10);
}
}
}
▼使用パッケージ
- CSV for Node.js
npm install csv
でインストールします。
▼実行結果
現在のフォルダには下のような内容の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引数、english2.csv
を第2引数としてコードを実行すると結果は下のようになりました。正しく出力されていることが分かります。
C:\work\node>node csv-stringify.js english.csv english2.csv
finished!!
C:\work\node>type english2.csv
4,2,reading,測定値
3,2,style,~と呼ぶ、様式
4,3,due,~することになっている、期限が来て、正当な
4,4,ankle,足首
5,4,discipline,訓練、規律、分野、学科
5,4,extraordinary,異常な
4,4,joint,接合(部)、関節、いかがわしい場所、共同の
5,4,virtue,美徳、効力
6,5,bundle,~を束ねる、束
5,5,deceive,~をだます
6,5,reproduce,~を複製する
7,5,rip,~を引き裂く
5,5,substitute,~を代わりに用いる、~を置換���る、代用品、代用の
7,6,cashier,現金出納係、レジ係
5,6,envy,~をうらやむ、うらやましさ
7,6,mouthful,口いっぱい、正しい言葉
7,6,reap,~を収穫する、~を得る
6,6,refresh,~の元気を回復させる
7,6,refreshment,元気回復、飲食物、軽食
7,7,deceit,詐欺
関連

スポンサーリンク