ES5 規定の JSON
と同じインターフェースを持つCSVパーサです。
使い方は JSON
と同じなので JSON
を扱った事のある人は違和感なく使えると思います。
CSV
は単純な Object
型であり、関数でもコンストラクタでもありません。
console.log(typeof CSV); // "object"
CSV(); // TypeError: CSV is not a function
new CSV(); // TypeError: CSV is not a constructor(
CSV
の @@toStringTag
は "CSV"
です。
(@@toStringTag
は ES6 規定の Symbol
値です。)
console.log(Object.prototype.toString.call(CSV)); // "[object CSV]"
第一引数に与えられたCSV文字列をパースし、二次元配列を返します。
var array = CSV.parse('"A1","B1"\r\n"A2","B2"');
console.log(array); // [["A1","B1"],["A2","B2"]]
第二引数でCSVの区切り文字を指定できます。
第二引数が省略された場合、区切り文字はカンマ('
)として扱われます。
var array = CSV.parse('"A1"|"B1"\r\n"A2"|"B2"', '|');
console.log(array); // [["A1","B1"],["A2","B2"]]
ただし、区切り文字は1文字でなければなりません。2文字以上の区切り文字が指定された場合は1文字目が区切り文字として扱われます。
(2文字以上は技術的には可能ですが、CSV.parse
の処理速度低下に繋がるのであえて1文字に制限しています。2文字以上の区切り文字は要望が多ければ検討します。)
var array = CSV.parse('A1<>B1\r\nA2<>B2', '<>');
console.log(array); // [["A1",">B1"],["A2",">B2"]]
第三引数 reviver
を指定すると、セル値を引数にとるコールバック関数 reviver
を呼び出した返り値を要素値に代入します。
var array = CSV.parse('A1,B1\r\n1,2', ',', function reviver (value) {
var number = Number(value);
return number.toString() === value ? number : value;
});
console.log(array); // [["A1","B1"],[1,2]]
- CSVのセル値はダブルクォートで括らなくても構いません。ダブルクォートで括られなかった場合、「改行、区切り文字」が後述するまで貪欲に消費してセル値として扱われます。
- CSVのセル値をダブルクォートで括ると改行や区切り文字(デフォルトではカンマ
'
)を含める事が可能です。 - CSVのセル値でダブルクォートを表現したい場合、ダブルクォートで括った上で
""
を入力する事でエスケープできます。
/**
* セル値はダブルクォートで括らなくても良い
*/
var array = CSV.parse('A1,B1\r\nA2,B2');
console.log(array); // [["A1","B1"],["A2","B2"]]
/**
* セル値をダブルクォートで括れば改行や区切り文字を含める事が出来る
*/
var array = CSV.parse('"A1-1\r\nA1-2","B1-1\r\nB1-2"\r\n"A2-1,A2-2","B2-1,B2-2"');
console.log(array); // [["A1-1\r\nA1-2","B1-1\r\nB1-2"],["A2-1,A2-2","B2-1,B2-2"]]
/**
* セル値をダブルクォートで括った場合、"" でダブルクォート1文字と見なす
*/
var array = CSV.parse('"A1""","B1"""\r\n"""A2""","""B2"""');
console.log(array); // [["A1\"","B1\""],["\"A2\"","\"B2\""]]
二次元配列をCSV文字列に変換します。
var csvString = CSV.stringify([['A1','B1'],['A2','B2']]);
console.log(csvString); // "A1","B1"\r\n"A2","B2"
第二引数でCSVの区切り文字を指定できます。
第二引数が省略された場合、区切り文字はカンマ('
)として扱われます。
var csvString = CSV.stringify([['A1','B1'],['A2','B2']], '|');
console.log(csvString); // "A1"|"B1"\r\n"A2"|"B2"
第三引数 replacer
を指定すると、CSV文字列に変換する前に配列の要素値を引数に撮るコールバック関数 replacer
が呼び出され、返り値をセル値とします。
var csvString = CSV.stringify([['A1','B1'],[1,2]], ',', function replacer (value) {
return typeof value === 'number' ? value : '"' + String(value).replace(/"/g, '""') + '"';
});
console.log(csvString); // "A1","B1"\r\n1,2
利用させていただきました。ありがとうございます。
ダブルクォートで括られていない空文字列(行頭行末のカンマ、カンマの連続など)が、無視されてしまうようです。
(console.log(CSV.parse(',,a,'))は、[["","","a",""]]となってほしいが、[["a"]]となる)
やっつけで下記のように応急処置してみました。
L35-56