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

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

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

我真的希望保留逗号分隔符(我知道excel支持其他分隔符,但其他解释器可能不支持)。我还想在名称中保留逗号,因为Joe Blow| CFA看起来非常愚蠢。

是否有一种方法在CSV列中包含逗号而不破坏格式,例如通过转义它们?

599202 次浏览

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

要对包含逗号(,)或双引号(")字符的字段进行编码,请将字段用双引号括起来:

field1,"field, 2",field3, ...

文字双引号字符通常由双引号的一对 ("")表示。例如,只包含一个双引号字符的字段被编码为""""

例如:

Sheet: |Hello, World!|You "matter" to us.|


CSV: "Hello, World!","You ""matter"" to us."

更多示例(sheet→csv):

  • __abc0→__abc0
  • __abc0→__abc1
  • __abc0→__abc1
  • __abc0→__abc1
  • __abc0→__abc1
  • __abc0→__abc1
  • __abc0→__abc1

看到维基百科

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

参考规格文件

你可以在平面文件连接管理器中使用Text_Qualifier字段作为"。这应该将您的数据包装在报价中,并且仅由引号外的逗号分隔。

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

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

如果你想证明你所说的,你可以用引号。就像这样

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

现在,你可以在name变量中使用逗号。

我遇到了同样的问题,引用,没有帮助。最终,我用+替换了,,完成了处理,将输出保存到一个输出文件中,并用,替换了+。这可能看起来很丑,但对我来说很管用。

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

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

最后,包装项值:

左:带有双引号字符(")

右:带有双引号(")和逗号(,)

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

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

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

您可以构建公式,例如:

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

将写入csv:

=如果(C3 = 1”“B3)

你可以对你的值进行编码,例如在PHP中base64_encode($str) / base64_decode($str)

在我看来,这比双引号等更简单。

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

编码的值永远不会包含逗号,因此CSV中的每个逗号都将是分隔符。

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

9月= |

,其中|是您希望Excel使用的分隔符。 或者你也可以改变Windows中的默认分隔符,但是有点啰嗦:

控制面板>时钟&放大器;区域>区域>格式>附加>数字>列出分隔符[从逗号改为您的首选选项]。这意味着Excel也将默认使用所选分隔符导出csv。

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

a, "b,c"不工作,而a,"b,c"工作。

你可以使用模板字面值(模板字符串)

例如,

`"${item}"`

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

您可以使用sep标志为CSV文件指定分隔符。

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

Example

这不是一个完美的解决方案,但你可以用或更低的引号替换逗号的所有用法。它看起来非常非常类似于逗号,并且在视觉上具有相同的目的。不需要报价

在JS中就是这样

stringVal.replaceAll(',', '‚')

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

在列文本中转义分隔符和引号的c#方法。这应该是您所需要的,以确保您的csv没有被破坏。

private string EscapeDelimiter(string field)
{
if (field.Contains(yourEscapeCharacter))
{
field = field.Replace("\"", "\"\"");
field = $"\"{field}\"";
}


return field;
}