Example JavaScript code to parse CSV data

前端 未结 12 1721
梦谈多话
梦谈多话 2020-11-21 07:58

Where could I find some JavaScript code to parse CSV data?

12条回答
  •  执念已碎
    2020-11-21 08:41

    I have an implementation as part of a spreadsheet project.

    This code is not yet tested thoroughly, but anyone is welcome to use it.

    As some of the answers noted though, your implementation can be much simpler if you actually have DSV or TSV file, as they disallow the use of the record and field separators in the values. CSV, on the other hand, can actually have commas and newlines inside a field, which breaks most regular expression and split-based approaches.

    var CSV = {
        parse: function(csv, reviver) {
            reviver = reviver || function(r, c, v) { return v; };
            var chars = csv.split(''), c = 0, cc = chars.length, start, end, table = [], row;
            while (c < cc) {
                table.push(row = []);
                while (c < cc && '\r' !== chars[c] && '\n' !== chars[c]) {
                    start = end = c;
                    if ('"' === chars[c]){
                        start = end = ++c;
                        while (c < cc) {
                            if ('"' === chars[c]) {
                                if ('"' !== chars[c+1]) {
                                    break;
                                }
                                else {
                                    chars[++c] = ''; // unescape ""
                                }
                            }
                            end = ++c;
                        }
                        if ('"' === chars[c]) {
                            ++c;
                        }
                        while (c < cc && '\r' !== chars[c] && '\n' !== chars[c] && ',' !== chars[c]) {
                            ++c;
                        }
                    } else {
                        while (c < cc && '\r' !== chars[c] && '\n' !== chars[c] && ',' !== chars[c]) {
                            end = ++c;
                        }
                    }
                    row.push(reviver(table.length-1, row.length, chars.slice(start, end).join('')));
                    if (',' === chars[c]) {
                        ++c;
                    }
                }
                if ('\r' === chars[c]) {
                    ++c;
                }
                if ('\n' === chars[c]) {
                    ++c;
                }
            }
            return table;
        },
    
        stringify: function(table, replacer) {
            replacer = replacer || function(r, c, v) { return v; };
            var csv = '', c, cc, r, rr = table.length, cell;
            for (r = 0; r < rr; ++r) {
                if (r) {
                    csv += '\r\n';
                }
                for (c = 0, cc = table[r].length; c < cc; ++c) {
                    if (c) {
                        csv += ',';
                    }
                    cell = replacer(r, c, table[r][c]);
                    if (/[,\r\n"]/.test(cell)) {
                        cell = '"' + cell.replace(/"/g, '""') + '"';
                    }
                    csv += (cell || 0 === cell) ? cell : '';
                }
            }
            return csv;
        }
    };
    

提交回复
热议问题