有没有办法在CSV列中包含逗号而不打破格式?

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

我已经读了,最常见的处方似乎是用一个新的值(例如this|that|the, other )replace那个字符,或者用分隔符代替分隔符。

我真的想保留逗号分隔符(我知道Excel支持其他分隔符,但其他解释器可能不)。 我也想用这个名字来保留这个逗号,就像Joe Blow| CFA Joe Blow| CFA看起来非常愚蠢。

有没有办法在CSV列中包含逗号而不打破格式,例如通过转义格式?

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

参考规格文件 。

用引号括起来,例如

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

看维基百科 。

更新

为了编码一个引号,使用" ,一个字段中的单引号符号将被编码为"" ,并且整个字段将变成"""" ,所以如果你在例如Excel中看到以下内容:

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

CSV文件将包含:

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

逗号简单地用引号封装,所以成为","

一个命令和报价需要封装和引用,所以","变成""","""

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

如果你想让你说,你可以使用报价。 像这样的东西

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

所以现在,你可以在你的名字variables中使用逗号。

除了其他答案中的要点:如果您在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) 

正是这个微妙把我带到了这里。

我面对同样的问题,引用了,没有帮助。 最后,我用+replace了,完成了处理,将输出保存到outfile中,并用+replace了+ 。 这可能看起来很丑,但它对我有用。

您可以使用Flat文件连接pipe理器中的Text_Qualifier字段作为" 。这应该将您的数据用引号括起来,并且只能用引号之外的逗号分隔。

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

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

最后,包装项目值:

左边:用双引号字符(“)

右上:用双引号(“)和逗号(,)

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

根据你的语言,可能有一个to_json方法可用。 这将会逃脱许多破坏CSV的事情。