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をコピーしました