CSV文字列をJSONオブジェクトに変換

CSV文字列をJSONオブジェクトに変換するには、次のような方法で実装できます。

  • ※ 区切りではなく文字としてのカンマは考慮していません。
  • ※ 文字として使用しているダブルクォーテーションは考慮していません(エスケープされているダブルクォーテーション)。
  • ※ 数字は文字列として扱います。

関数定義

JavaScript (ES5以前)

/**
 * CSV文字列をJSONオブジェクトに変換
 * @param {string} csvStr CSV文字列
 * @param {object} userOptions ユーザー設定
 * @return {object[]} JSONに変換されたオブジェクトを返す
 * CSV文字列をJSONオブジェクトに変換
 */
var csvToJson = function(csvStr, userOptions) {
	if (typeof csvStr !== 'string') return [];

	var options = { header : 0, columnName : [], ignoreBlankLine : true };

	if (userOptions) {
		if (userOptions.header) options.header = userOptions.header;
		if (userOptions.columnName) options.columnName = userOptions.columnName;
	}

	var rows = csvStr.split('\n'),
	    json = [], line = [], row = '', data = {},
	    j, len2;

	for (var i = 0, len = rows.length; i < len; i++) {
		if (i + 1 <= options.header) continue;
		if (options.ignoreBlankLine && rows[i] === '') continue;

		line = rows[i].split(',');

		if (options.columnName.length > 0) {
			data = {};
			for (j = 0, len2 = options.columnName.length; j < len2; j++) {
				if (typeof line[j] !== 'undefined') {
					row = line[j];
					row = row.replace(/^"(.+)?"$/, '$1');
				} else {
					row = null;
				}

				data[options.columnName[j]] = row;
			}
			json.push(data);
		} else {
			json.push(line);
		}
	}

	return json;
};

JavaScript (ES6以降)

/**
 * CSV文字列をJSONオブジェクトに変換
 * @param {string} csvStr CSV文字列
 * @param {object} userOptions ユーザー設定
 * @returns {object[]} JSONに変換されたオブジェクトを返す
 * CSV文字列をJSONオブジェクトに変換
 */
const csvToJson = function(csvStr, userOptions = {}) {
	if (typeof csvStr !== 'string') return [];

	const options = Object.assign({
		header          : 0,
		columnName      : [],
		ignoreBlankLine : true
	}, userOptions);

	const json = csvStr.split('\n').reduce(function(json, row, i) {
		if (i + 1 <= options.header) return json;
		if (options.ignoreBlankLine && row === '') return json;

		const line = row.split(',');

		if (options.columnName.length > 0) {
			json.push(options.columnName.reduce(function(data, name, i) {
				data[name] = typeof line[i] !== 'undefined' ? line[i].replace(/^"(.+)?"$/, '$1') : null;

				return data;
			}, {}));
		} else {
			json.push(line);
		}

		return json;
	}, []);

	return json;
};

使い方

引数

引数名 説明
第一引数
必須
csvStr string CSV形式の文字列を指定。
第二引数 userOptions Object 様々なオプションを設定できる。
詳しくは 第二引数:オプションを参照。
第二引数:オプション
プロパティ名 初期値 説明
header number 0 除外するヘッダーの行番号を指定する。
1を指定した場合は1行目、3を指定した場合は1行目から3行目、0を指定した場合は除外しない。
columnName string[] [] CSVの列に一致するカラム名(キー)を指定する。
ignoreBlankLine boolean true 空白行を除外するかどうかを指定する。

戻り値

変換されたオブジェクトを返します。

サンプルコード

JavaScript

var csv  = 'ID,氏名,年齢\n';
    csv += '1,"佐藤 健",23\n';
    csv += '2,"鈴木 美咲",19\n';
    csv += '3,"高橋 翔",28';

var json = csvToJson(csv, {
	header     : 1,
	columnName : ['id', 'name', 'age']
});

alert(json[0].name);

JavaScript

const csv = `ID,氏名,年齢
1,"佐藤 健",23
2,"鈴木 美咲",19
3,"高橋 翔",28`;

const json = csvToJson(csv, {
	header     : 1,
	columnName : ['id', 'name', 'age']
});

console.log(json);

JavaScript逆引きリファレンス一覧へ戻る