Node.jsでCSVファイルを読み込むには

先日、htpasswd-managerを公開しました。CSVファイルにユーザー名やパスワードを書いておき、.htpasswd や .htgroup に変換するツールです。

当初、ユーザー名やパスワードをJSONファイルに書いていました。標準のJSON.parse()ですみますし、複数の所属グループを配列で書けるので。

ほぼ完成というときになって、JSONファイルでいいのか、CSVファイルにしたほうがいいのか、悩みはじめました。

運用担当者のPCにエクセルはあるけど、テキストエディターはメモ帳しかないかもれないと思い、CSVファイルにしました。複数の所属グループは、セル内のカンマ区切りにしました。

npm の csv-parse パッケージを使いました。

末尾に’r’ がつく、csv-parser は同じ目的ですが、別の開発者のパッケージです。

csv-parse

$ npm install csv-parse

2次元配列を返す

// sample_csvparse_1.ts import csvParse from 'csv-parse/lib/sync'; const content = `a,b,c d,"e e",f g,"h h",i `; const value_arr_arr:string[][] = csvParse(content); console.log(JSON.stringify(value_arr_arr, null, 4));

実行結果

$ node src/sample_csvparse_1.js [ [ "a", "b", "c" ], [ "d", "e e", "f" ], [ "g", "h\nh", "i" ] ]

先頭行をキー名にして、オブジェクト配列を返す

// sample_csvparse_2.ts import csvParse from 'csv-parse/lib/sync'; const content = `Field_1,Field_2,Field_3 d,"e e",f g,"h h",i `; const vars_arr:any[] = csvParse(content, {columns: true}); console.log(JSON.stringify(vars_arr, null, 4));

実行結果

$ node src/sample_csvparse_2.js [ { "Field_1": "d", "Field_2": "e e", "Field_3": "f" }, { "Field_1": "g", "Field_2": "h\nh", "Field_3": "i" } ]

オプション relax_column_count

CSVファイルの各行の列数が揃っていないと、エラーが発生します。

// sample_csvparse_3.ts import csvParse from 'csv-parse/lib/sync'; // 先頭行だけ、4列 const content = `a,b,c,d d,"e e",f g,"h h",i `; const value_arr_arr:string[][] = csvParse(content); console.log(JSON.stringify(value_arr_arr, null, 4));

実行結果

$ node src/sample_csvparse_3.js /home/aoki/xxx/yyy/node_modules/csv-parse/lib/sync.js:18 if(err1 !== undefined) throw err1 ^ Error: Invalid Record Length: expect 4, got 3 on line 2

エラーにしたくない場合は、オプションで relax_column_count:trueを指定します。

// sample_csvparse_3b.ts import csvParse from 'csv-parse/lib/sync'; // 先頭行だけ、4列 const content = `a,b,c,d d,"e e",f g,"h h",i `; const value_arr_arr:string[][] = csvParse(content, {relax_column_count: true}); console.log(JSON.stringify(value_arr_arr, null, 4));

実行結果

$ node src/sample_csvparse_3b.js [ [ "a", "b", "c", "d" ], [ "d", "e e", "f" ], [ "g", "h\nh", "i", "" ] ]
タイトルとURLをコピーしました