有没有一种方法可以在CSV列中包含逗号而不破坏格式?


282

我有两列的CSV,其中包含名称和数字。某些人的名字使用逗号,例如,Joe Blow, CFA.该逗号打破了CSV格式,因为它被解释为新列。

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

我真的很想保留逗号分隔符(我知道excel支持其他定界符,但其他解释器可能不支持)。我还想保留逗号,因为Joe Blow| CFA看起来很傻。

有没有一种方法可以在CSV列中包含逗号而不破坏格式,例如通过转义?



对我有用的小技巧:在文本编辑器中打开csv文件,然后粘贴到excel文档中。如果可以做到这一点,则可以工作。
乔纳斯(Jonas)

@Jonas:Excel无法猜测是将同一标记用作分隔符还是数据的一部分。从文本编辑器粘贴不会改变它。
IInspectable '17

Answers:


370

用引号将字段括起来,例如

field1_value,field2_value,"field 3,value",field4, etc...

参见维基百科

更新时间

要对报价进行编码,请使用",将字段中的一个双引号符号编码为"",整个字段将变为""""。因此,如果您在例如Excel中看到以下内容:

---------------------------------------
| regular_value |,,,"|  ,"", |"""   |"|
---------------------------------------

CSV文件将包含:

regular_value,",,,""",","""",","""""""",""""

逗号只是用引号引起来,所以,变成","

逗号和引号需要封装和引号,因此","成为""","""


4
这对我有用!我正在将js变量导出为CSV,并在每个字符串周围加上了一对引号,这有助于解决问题中提到的“ John Blow,CFA”的问题。
Madhulika Mukherjee

如果每个单元格中都有引号和逗号怎么办?
Speedplane '16

2
我用一些示例更新了答案-简而言之,逗号被括在引号中(例如","),引号被转义了(例如"""
Ryan

6
现在,这应该被接受,因为它提出了一个很好的解决方案,可以解决99%的用例。
BuZz

是否存在C#库来解析带有引号转义字段的csv文件?
Minh Tran

34

CSV格式的问题是,没有一个规范,有几种公认的方法,没有办法区分应使用哪种(生成/解释)。我在另一篇文章中讨论了所有用于转义字符的方法(在这种情况下为换行符,但基本前提相同)。基本上,归结为针对目标用户使用CSV生成/转义过程,希望其余的人不在乎。

参考规格文件


10
RFC 4180,逗号分隔值(CSV)文件的通用格式和MIME类型,ietf.org / rfc / rfc4180.txt;另一种“官方”规范。

3
包括最广泛接受的方法将是一个很好的答案。就目前而言,@ Ryan的答案胜出。
rinogo

16

如果您想说的话,可以使用引号。像这样

$name = "Joe Blow, CFA.";
$arr[] = "\"".$name."\"";

因此,现在,您可以在名称变量中使用逗号。


感谢Cloud的提示,它做到了: $whatever = "\"".$name."\"";
washere

谢谢您的解决方案。
Bhavin Thummar

10

您需要引用该值。
是更详细的规格。


2
有多种规格,Excel在条目周围使用引号,Linux使用反斜杠字符。不幸的是,您需要逃脱预期的受众/目标系统。
Rudu 2011年

7

除了其他答案中的要点外:如果在Excel中使用引号,要注意的一件事是空格的位置。如果您有这样的代码行:

print '%s, "%s", "%s", "%s"' % (value_1, value_2, value_3, value_4)

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

print '%s,"%s","%s","%s"' % (value_1, value_2, value_3, value_4)

正是这种微妙之处使我来到了这里。


3

我遇到了同样的问题,引用,并没有帮助。最后,我取代了,+,完成了加工,保存,输出到OUTFILE和替换+,。这看起来很难看,但是对我有用。


2
如果数据包含“ +”字符,您将怎么办?
安德鲁·莫顿

1
@AndrewMorton是的,这是一个挑战。但就我而言,我确信数据中+根本不存在该数据。谢谢您的评论。
穆罕默德

4
一种简单而健壮的方法是将字符串括在双引号中,并通过使用两个类似的字符在字符串中对双引号进行转义""。这是正常的做法。
Andrew Morton

1
如果它不起作用,请检查您是否没有在定界逗号旁边生成空格:“青蛙”,“黄色,绿色”将起作用“青蛙”,“黄色,绿色”将不起作用
Dazbert

我个人发现@AndrewMorton在这里的第二条评论实际上帮助我理解了什么比接受的答案更好。第1步-在数据字段中转义双引号,例如在Python中:field = field.replace('"', '""')第2步-在第1步之后,将字段本身括在双引号中,例如field = '"' + field + '"'-那么我认为您是铁定的。
克罗克斯福德

3

根据您的语言,可能有to_json方法可用。这样可以避免许多破坏CSV的事情。


3

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

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


1
您可能只为我节省了一个小时的工作……谢谢!
Shaun314



0

您可以Text_Qualifier将平面文件连接管理器中的字段用作"。这应将您的数据用引号引起来,并且只能用引号外的逗号分隔。


0

首先,如果项目值具有双引号字符(“),则替换为2双引号字符(”“)

item = item.ToString().Replace("""", """""")

最后,包装项目值:

左:带双引号(“)

右上:带有双引号字符(“)和逗号字符(,)

csv += """" & item.ToString() & ""","

0

双引号对我不起作用,对我有用 \"。如果您想放置双引号作为示例,则可以设置\"\"

您可以构建公式,例如:

fprintf(strout, "\"=if(C3=1,\"\"\"\",B3)\"\n");

将用csv编写:

= IF(C3 = 1,“”,B3)


0

此处可能并不需要,但这是一个非常古老的问题,答案可能会对其他人有所帮助。我发现使用不同的分隔符导入Excel有用的技巧是在文本编辑器中打开文件并添加第一行,例如:

sep = |

在哪里 是您希望Excel使用的分隔符。或者,您可以更改Windows中的默认分隔符,但有点麻烦:

控制面板>时钟和区域>区域>格式>其他>数字>列表分隔符[从逗号更改为您的首选替代项]。这意味着Excel还将默认使用选定的分隔符导出CSV。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.