先日、htpasswd-managerを公開しました。CSVファイルにユーザー名やパスワードを書いておき、.htpasswd や .htgroup に変換するツールです。
当初、ユーザー名やパスワードをJSONファイルに書いていました。標準のJSON.parse()ですみますし、複数の所属グループを配列で書けるので。
ほぼ完成というときになって、JSONファイルでいいのか、CSVファイルにしたほうがいいのか、悩みはじめました。
運用担当者のPCにエクセルはあるけど、テキストエディターはメモ帳しかないかもれないと思い、CSVファイルにしました。複数の所属グループは、セル内のカンマ区切りにしました。
npm の csv-parse パッケージを使いました。
末尾に’r’ がつく、csv-parser は同じ目的ですが、別の開発者のパッケージです。
csv-parse
- npm https://www.npmjs.com/package/csv-parse
- GitHub https://github.com/adaltas/node-csv-parse
- Document https://csv.js.org/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));
Code language: JavaScript (javascript)
実行結果
$ node src/sample_csvparse_1.js
[
[
"a",
"b",
"c"
],
[
"d",
"e e",
"f"
],
[
"g",
"h\nh",
"i"
]
]
Code language: JavaScript (javascript)
先頭行をキー名にして、オブジェクト配列を返す
// 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));
Code language: JavaScript (javascript)
実行結果
$ 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"
}
]
Code language: JavaScript (javascript)
オプション 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));
Code language: JavaScript (javascript)
実行結果
$ 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
Code language: JavaScript (javascript)
エラーにしたくない場合は、オプションで 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));
Code language: JavaScript (javascript)
実行結果
$ node src/sample_csvparse_3b.js
[
[
"a",
"b",
"c",
"d"
],
[
"d",
"e e",
"f"
],
[
"g",
"h\nh",
"i",
""
]
]
Code language: JavaScript (javascript)