JSFiddle - React, Tailwind, and code Playground

by vvakame

JavaScript

var result = parseCsv("hoge,fuga\n\"ho\nge\",piyo");
alert(JSON.stringify(result, null, 2));
alert(result[0][0] + "&" + result[0][1] + "&" + result[1][0] + "&" + result[1][1]);

function parseCsv(csv) {
    // from http://xoihazard.blogspot.jp/2012/10/javascriptcsv.html
    var table = [];

    var rows = [];
    var cell = "";
    var quoted = false;

    // 改行コードを\nに統一
    csv = csv.replace(/\r?\n|\r/g, "\n");
    // ファイルの終端を改行にする
    if (csv.charAt(csv.length - 1) !== "\n") {
        csv += "\n";
    }

    // 一文字ずつ処理
    for (var i = 0; i < csv.length; i++) {
        switch (csv.charAt(i)) {
            case "\"":
                if (rows.length === 0 && quoted) {
                    cell += csv.charAt(i);
                }
                quoted = !quoted;
                break;
            case ",":
                if (quoted) {
                    cell += csv.charAt(i);
                } else {
                    rows.push(cell);
                    cell = "";
                }
                break;
            case "\n":
                if (quoted) {
                    cell += csv.charAt(i);
                } else {
                    rows.push(cell);
                    cell = "";
                    if (rows.length > 0) {
                        table.push(rows);
                        rows = [];
                    }
                }
                break;
            default:
                cell += csv.charAt(i);
        }
    }
    if (0 < table.length && table[table.length - 1].length === 1 && table[table.length - 1][0] === "") {
        table.pop();
    }
    return table;
}