1

有没有办法用 javascript 拆分 CSV 字符串,其中分隔符也可以作为转义值出现。其他正则表达式实现通过后视解决了这个问题,但由于 javascript 不支持后视,我想知道如何使用正则表达式以简洁的方式完成这个问题。

csv 行可能看起来像这样

"This is\, a value",Hello,4,'This is also\, possible',true

这必须拆分为(包含的字符串)

[0] => "This is\, a value"
[1] => Hello
[2] => 4
[3] => 'This is also\, possible'
[4] => true
4

4 回答 4

1

除了尝试拆分之外,您还可以尝试对所有不,具有此模式的内容进行全局匹配:

/"[^"]+"|'[^']+'|[^,]+/g
于 2013-10-06T11:14:27.997 回答
0

例如你可以使用这个正则表达式:

(.*?[^\\])(,|$)

正则表达式需要一切。*?直到第一个逗号,它前面没有 \ 或行尾

于 2013-10-06T11:05:11.827 回答
0

这是一些将 csv 更改为 json 的代码(假设它支持名称的第一行)。您可以使用第一部分(array2d)并非常轻松地用它做其他事情。

// split rows by \r\n.  Not sure if all csv has this, but mine did
const rows = rawCsvFile.split("\r\n");

// find all commas, or chunks of text in quotes.  If not in quotes, consider it a split point
const splitPointsRegex = /"(""|[^"])+?"|,/g;
const array2d = rows.map((row) => {
    let lastPoint = 0;
    const cols: string[] = [];
    let match: RegExpExecArray;
    while ((match = splitPointsRegex.exec(row)) !== null) {
        if (match[0] === ",") {
            cols.push(row.substring(lastPoint, match.index));
            lastPoint = match.index + 1;
        }
    }
    cols.push(row.slice(lastPoint));

    // remove leading commas, wrapping quotes, and unneeded \r
    return cols.map((datum) => 
        datum.replace(/^,?"?|"$/g, "")
        .replace(/""/g, `\"`)
        .replace(/\r/g, "")
    );
})

// assuming first row it props name, create an array of objects with prop names of the values given
const out = [];
const propsRow = array2d[0];
array2d.forEach((row, i) => {
    if (i === 0) { return; }
    const addMe: any = {};
    row.forEach((datum, j) => {
        let parsedData: any;
        if (isNaN(Number(datum)) === false) {
            parsedData = Number(datum);
        } else if (datum === "TRUE") {
            parsedData = true;
        } else if (datum === "FALSE") {
            parsedData = false;
        } else {
            parsedData = datum;
        }
        addMe[propsRow[j]] = parsedData;
    });
    out.push(addMe);
});

console.log(out);
于 2018-12-04T18:47:38.557 回答
0

不幸的是,这不适用于 Firefox,仅适用于 Chrome 和 Edge:

"abc\\,cde,efg".split(/(?<!\\),/)将导致["abc\,cde", "efg"].

您将需要在第二步中删除所有(未转义的)转义。

于 2019-08-08T13:28:19.533 回答