有没有办法在不破坏格式的情况下在CSV列中包含逗号?

bul*_*ley 219 csv

我有一个带有名称和数字的两列CSV.有些人的名字使用逗号,例如,Joe Blow, CFA.这个逗号会破坏CSV格式,因为它被解释为新列.

我已经阅读过,最常见的处方似乎是用新值替换该字符或替换分隔符(例如this|that|the, other).

我真的想保留逗号分隔符(我知道excel支持其他分隔符,但其他解释器可能不支持).我也想把逗号放在名字里,Joe Blow| CFA看起来很傻.

有没有办法在不破坏格式的情况下在CSV列中包含逗号,例如通过转义它们?

Rya*_*yan 280

将该字段括在引号中,例如

field1_value,field2_value,"field 3,value",field4, etc...
Run Code Online (Sandbox Code Playgroud)

维基百科.

更新:

要编码引号,请使用",字段中的单引号符号将被编码为"",整个字段将变为"""".因此,如果您在Excel中看到以下内容:

---------------------------------------
| regular_value |,,,"|  ,"", |"""   |"|
---------------------------------------
Run Code Online (Sandbox Code Playgroud)

CSV文件将包含:

regular_value,",,,""",","""",","""""""",""""
Run Code Online (Sandbox Code Playgroud)

逗号只是使用引号封装,因此,变为",".

逗号和引号需要封装和引用,因此","变为""",""".

  • 现在这应该是公认的答案,因为它提出了一个很好的解决方案,可能解决了99%的用例. (5认同)
  • 这对我有用!我正在将一个js变量导出为CSV,并在每个字符串周围添加一对引号,这有助于解决问题中提到的"John Blow,CFA"问题. (4认同)
  • 我用一些例子更新了答案——简而言之,逗号被封装在引号中(例如`","`),引号被转义(例如`"""`) (2认同)

Rud*_*udu 32

CSV格式的问题是,没有一个规范,有几种可接受的方法,无法区分哪些应该使用(用于生成/解释).我在另一篇文章中讨论了转义字符的所有方法(在这种情况下换行,但基本前提相同).基本上,它归结为为目标用户使用CSV生成/转义过程,并希望其他人不介意.

参考规范文件.

  • 这不应该是公认的答案 (10认同)
  • RFC 4180,逗号分隔值(CSV)文件的通用格式和MIME类型,https://www.ietf.org/rfc/rfc4180.txt; 另一个"官方"规范. (9认同)
  • 包括最广泛接受的方法将是一个很好的答案。就目前而言,@ Ryan的答案胜出。 (2认同)

mud*_*din 28

我发现某些应用程序(如 Mac 中的 Numbers)会忽略双引号,如果它前面有空格。

a, "b,c"工作时不起作用a,"b,c"

  • 您可能刚刚节省了我一个小时的工作时间...谢谢! (7认同)
  • 由不可见字符引起的微妙解析问题是最好的。 (3认同)
  • 天啊,我几个小时以来一直在寻找这个问题的解决方案,我可以找到任何解决方案。你救了我。谢谢。 (3认同)
  • 同意!将 .number 文件中的全部内容复制到谷歌电子表格并将其导出为 .csv 后,一切正常。 (2认同)

Clo*_*oud 14

如果你想说,你可以使用引号.像这样的东西

$name = "Joe Blow, CFA.";
$arr[] = "\"".$name."\"";
Run Code Online (Sandbox Code Playgroud)

现在,您可以在名称变量中使用逗号.


SLa*_*aks 10

你需要引用这些值.
是一个更详细的规范.

  • 有多个规格,Excel使用条目周围的引号,Linux使用反斜杠字符.不幸的是,您需要为目标受众/目标系统逃脱. (2认同)

Ahm*_*med 10

CSV 文件实际上可以使用不同的分隔符进行格式化,逗号只是默认分隔符。

您可以使用该sep标志来指定 CSV 文件所需的分隔符。

只需将该行添加sep=;为 CSV 文件中的第一行,即如果您希望分隔符为分号。您可以将其更改为任何其他字符。

例子


kri*_*hna 8

您可以使用模板文字(模板字符串)

例如-

`"${item}"`
Run Code Online (Sandbox Code Playgroud)

  • 效果非常好! (2认同)

hlo*_*ore 7

除了其他答案中的要点之外:如果您在Excel中使用引号,则需要注意的一点是空格的位置.如果您有一行代码如下:

print '%s, "%s", "%s", "%s"' % (value_1, value_2, value_3, value_4)
Run Code Online (Sandbox Code Playgroud)

Excel会将初始引用视为文字引用,而不是使用它来转义逗号.您的代码需要更改为

print '%s,"%s","%s","%s"' % (value_1, value_2, value_3, value_4)
Run Code Online (Sandbox Code Playgroud)

正是这种微妙之处将我带到了这里.


Ras*_*yer 6

这不是一个完美的解决方案,但您可以将所有使用的逗号替换为\xe2\x80\x9a或更小的引号。它看起来与逗号非常相似,并且在视觉上具有相同的目的。无需报价

\n

在 JS 中这将是

\n
stringVal.replaceAll(',', '\xe2\x80\x9a')\n
Run Code Online (Sandbox Code Playgroud)\n

不过,您需要非常小心需要直接比较数据的情况

\n