1

免责声明:我实际上不是在解析 CSV,而是在解析类似 CSV 的格式;我对使用预建库不感兴趣。

解析以下两行的正确方法是什么?:

a,b"c"d,e
a,"bc"d,e

即,(a)在值的中间有引号,(b)在开始处有引号,但在下一个值之前没有结束引号。

我不知道我应该如何处理这些情况(这将是最直观的)。


我的想法是 (a) 应该被解析为a, b"c"d, e(引号留在里面),并且 (b) 应该以同样的方式解析a, "bc"d, e。但是让我介绍第三种情况,a,"b,c"d,e我们是否在“b”和“c”之间拆分第二个逗号?

4

2 回答 2

1

如果您想与 Excel 保持一致,以下是解析它的方法:

输入:

a,b"c"d,e
a,"bc"d,e
a,"b,c"d,e

解析(在 JSON 中):

[
  ["a", "b\"c\"d", "e"],
  ["a", "bcd", "e"],
  ["a","b,cd", "e"]
]

解析逻辑是:

  • 如果该行的第一个字符或紧跟在逗号之后的字符是 dbl-quote,则:
    • 将其后面的所有内容视为“引用”,直到到达结束引号(当然,将两个引号视为转义的 dbl-quote)。从单元格值中删除开始和结束引号
    • 在到达“结束引号”之后,在单元格值中包含结束引号之后的任何内容作为文字值,直到到达逗号或换行符
  • 否则,将逗号后面的所有内容视为文字值,直到到达逗号或换行符

请注意,这意味着如果您在单元格分隔逗号后有一个空格,后跟一个 dbl-quote,则与逗号后没有空格(后跟一个 dbl-quote)的结果不同

于 2022-01-01T21:37:43.330 回答
0

这是我的方法 (C#) 将 csv 吐出到 html 表的一部分 - 它有这样的逗号解析:

string[] cells = line.Split(','); // empty cells needed as well
bool noComma = true;

for (int i = 0; i < cells.Length; i++)
{
    string cellI = cells[i];
    int numberOfDoubleQuote = cellI.Count(f => f == '"');
    // == 0 means comma in between quotes
    if (numberOfDoubleQuote == 1)
    {
        noComma = !noComma;
        if (!noComma)
            sLine += "<td>" + cellI;
        else
            sLine += "," + cellI + "</td>";
    }
    else
    {
        if (noComma)
            sLine += "<td>" + cellI + "</td>";
        else
            sLine += "," + cellI;
    }
}
于 2012-03-15T05:19:29.470 回答