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

Posted

技术标签:

【中文标题】有没有办法在不破坏格式的情况下在 CSV 列中包含逗号?【英文标题】:Is there a way to include commas in CSV columns without breaking the formatting? 【发布时间】:2011-06-04 19:31:16 【问题描述】:

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

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

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

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

【问题讨论】:

Dealing with commas in a CSV file的可能重复 对我有用的小技巧:在文本编辑器中打开 csv 文件,然后粘贴到 Excel 文档中。如果您可以大块地执行此操作,则可以使用。 @Jonas:Excel 无法猜测,相同的标记是用作分隔符还是数据的一部分。从文本编辑器粘贴不会改变这一点。 【参考方案1】:

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

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

见wikipedia。

更新

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

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

CSV 文件将包含:

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

逗号只是用引号封装,所以, 变成","

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

【讨论】:

这对我有用!我正在将一个 js 变量导出到 CSV,并在每个字符串周围加上一对额外的引号,这有助于解决问题中提到的“John Blow,CFA”的问题。 我用一些例子更新了答案——简而言之,逗号被封装在引号中(例如","),引号被转义(例如""" 现在这应该是公认的答案,因为它提出了一个很好的解决方案,可以解决 99% 的用例。 是否有 C# 库来解析带有引号转义字段的 csv 文件? 这是正确的答案,但并不是许多 csv 显示技术不尊重这一点。【参考方案2】:

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

Reference spec document.

【讨论】:

RFC 4180,逗号分隔值 (CSV) 文件的通用格式和 MIME 类型,ietf.org/rfc/rfc4180.txt;另一个“官方”规范。 包括最广泛接受的方法将使这成为一个很好的答案。就目前而言,@Ryan 的答案胜出。【参考方案3】:

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

a, "b,c" 不起作用,而 a,"b,c" 起作用。

【讨论】:

隐形字符引起的细微解析问题最好。【参考方案4】:

如果你想做到你所说的,你可以使用引号。像这样的

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

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

【讨论】:

感谢 Cloud 的提示,做到了:$whatever = "\"".$name."\""; 感谢您的解决方案。【参考方案5】:

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

【讨论】:

有多种规格,Excel 在条目周围使用引号,Linux 使用反斜杠字符。不幸的是,您需要为您的目标受众/目标系统逃脱。【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

例如-

`"$item"`

【讨论】:

工作就像一个魅力! 这只是将item 字符串化并用双引号括起来,但使用模板文字与它几乎没有关系,虽然这有效,但它并不能解释潜在的问题或解决方案。【参考方案8】:

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

【讨论】:

如果数据中包含“+”字符,你会怎么做? @AndrewMorton 是的,这是一个挑战。但就我而言,我确信+ 根本不存在于我的数据中。感谢您的友好评论。 简单而健壮的方法是将字符串括在双引号中,并通过使用其中的两个来转义字符串中的双引号,例如""。这是正常的做法。 如果它不起作用,请检查您是否没有在分隔逗号旁边生成空格:“Frog”、“yellow、green”可以使用“Frog”、“yellow、green”不会 就我个人而言,我发现@AndrewMorton 的第二条评论实际上帮助我理解了什么比接受的答案更好。第 1 步 - 在数据字段中转义双引号,例如在 Python 中:field = field.replace('"', '""') 第 2 步 - 在第 1 步之后,将字段本身括在双引号中,例如 field = '"' + field + '"' - 那么我认为你是铁定的。【参考方案9】:

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

【讨论】:

【参考方案10】:

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

IMO 这比双引号等更简单。

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

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

【讨论】:

【参考方案11】:

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

sep=|

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

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

【讨论】:

【参考方案12】:

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

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

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

【讨论】:

不错的提示,但这不是 Excel 特有的吗?【参考方案13】:

这不是一个完美的解决方案,但您可以将所有使用的逗号替换为 或更低的引号。它看起来与逗号非常相似,并且在视觉上将起到相同的作用。不需要引号

在 JS 中是这样的

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

在需要直接比较数据的情况下,您需要格外小心

【讨论】:

【参考方案14】:

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

【讨论】:

【参考方案15】:

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

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

最后,包装项目值:

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

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

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

【讨论】:

【参考方案16】:

双引号不适合我,它适合我\"。如果您想放置双引号作为示例,您可以设置\"\"

您可以构建公式,例如:

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

将写入 csv:

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

【讨论】:

以上是关于有没有办法在不破坏格式的情况下在 CSV 列中包含逗号?的主要内容,如果未能解决你的问题,请参考以下文章

在不使用 WIFI 的情况下在 WCF 服务调用中包含 SAML 2.0 令牌

如何在没有百分比编码的情况下在 Swift URL 中包含重音字符?

应该打字吗?如果不是,如何在不破坏用户的情况下在 npm install 上触发类型安装?

有没有办法在不导入 csv 的情况下从 .csv 创建 JSON?

SQL 中有没有办法将目录中包含的所有 .csv 导入我的 postgres 表? (窗口操作系统)

有没有办法在不使用画布的情况下在 JavaScript 中合并图像?