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


Is there a way to include commas in CSV columns without breaking the formatting?

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

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

我很想保留逗号分隔符(我知道Excel支持其他分隔符,但其他解释程序可能不支持)。我还想保留逗号的名称,因为Joe Blow| CFA看起来很傻。

是否有一种方法可以在不破坏格式的情况下在csv列中包含逗号,例如通过转义它们?


将字段括在引号中,例如

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

参见维基百科。

更新时间:

使用"对引号进行编码,字段中的单引号符号编码为"",整个字段变为""""。因此,如果您在Excel中看到以下内容:

1
2
3
---------------------------------------
| regular_value |,,,"|  ,"", |"""   |"|
---------------------------------------

csv文件将包含:

1
regular_value,",,,""",","""",","""""""",""""

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

逗号和引号需要封装和引用,所以","成为""","""


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

参考规范文件。


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

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

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


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


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

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

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

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

正是这种微妙的感觉把我带到了这里。


我也面临同样的问题,引用,也没有帮助。最后,我用+替换了,,完成了处理,将输出保存到一个输出文件中,用,替换了+。这可能看起来很难看,但对我有用。


您可以对值进行编码,例如在php base64_encode($str)/base64_decode($str)中。

在我看来,这比加倍报价等简单。

https://www.php.net/manual/en/function.base64-encode.php

编码的值永远不会包含逗号,所以csv中的每个逗号都是分隔符。


双引号对我不起作用,它对我也起作用。如果您想以双引号为例,可以设置\"\"

您可以构建公式,例如:

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

将以csv格式写入:

=IF(C3=1,"",B3)


根据您的语言,可能有一个to-json方法可用。这将逃避许多破坏CSV的事情。


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

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

最后,包装项目值:

在左侧:带双引号字符(")

在右侧:带双引号字符(")和逗号字符(,)

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

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