実際のコード
その前に、前回の投稿で書いた、Underscore.jsを使ってCSVを配列化する方法【_.reduce関数の解説付】の、CSVを配列に変換する関数「csvToArray関数」を使います。
/*
# CSVを配列に変換する関数
*/
const csvToArray = (str) => {
return _.reduce(String.prototype.split.call(str, '\n'), (table, row) => {
if (!!row) { // 空白行を除外するため、行(row)がある場合だけ処理.
table.push(_.map(row.split(','), (col) => { // 行(row)をカンマ毎に分解した配列をテーブル(table)にpush().
return col.trim(); // 列(col)をトリムして返す.
}));
}
return table;
}, []);
};
/*
# CSV(ヘッダー項目付)をJSON形式に変換する関数
*/
const csvToJson = (csv) => {
// CSVを配列形式に変換.
let csvArr = csvToArray(csv);
// ここで、任意のヘッダー行を追加したり変更してもいいんじゃないかな?
// csvArr.shift();
// csvArr.unshift(hogehoge...);
// _.rest()で、csvArrの最初の配列を除外
return _.rest(csvArr).map((row, idx, arr) => {
// _.object関数で配列をオブジェクト形式に変換
// _.first(arr)は、配列の最初の要素を返す.
return _.object(_.first(csvArr).map((__colTitle, __idx, __arr) => {
// ヘッダー行タイトル項目と同じインデックスにある各行の項目をペアにして返す.
return [__colTitle, row[__idx]];
}));
});
};
実行結果
const csv = 'title,desc\nタイトル1,デスク1\nタイトル2,デスク2';
const json = csvToJson(csv);
/*
# 結果
# [
# {title: "タイトル1", desc: "デスク1"},
# {title: "タイトル2", desc: "デスク2"}
# ]
*/
解説
うーん…コード見た方が早そうですね!笑
csvToArray関数については、Underscore.jsを使ってCSVを配列化する方法【_.reduce関数の解説付】をご覧あれ!
まとめ
まとめるほどでもないけど、一応ブログのフォーマットとして、まとめ見出し作ってるのでまとめます!
「Underscore.jsすげぇ!最高!」
一応、コードにも書いてるけど、CSVを配列形式に変換した後に、任意のヘッダー行を追加したり変更する事もできるので良いですね〜。
以上!
あと、Underscore.jsの配列系メソッドのまとめページがQiitaにあったので貼っときます♪ → 遅すぎたUnderscore.js詳述 – Arrays編 – Qiita