ChatGPT解决这个技术问题 Extra ChatGPT

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

csv

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

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

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

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

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

S
Stefan

将字段括在引号中,例如

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 显示技术不尊重这一点。
m
mudin

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

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


由不可见字符引起的细微解析问题是最好的。
同意!在我将整个内容从 .number 文件复制到 google 电子表格并将其导出为 .csv 之后,一切正常。
C
Community

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

Reference spec document


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

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

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

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


感谢 Cloud 的提示,做到了:$whatever = "\"".$name."\"";
谢谢你的解决方案。
S
Sylvain Rodrigue

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


有多种规范,Excel 在条目周围使用引号,Linux 使用反斜杠字符。不幸的是,您需要为您的目标受众/目标系统逃脱。
M
Mogsdad

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

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


K
Krishna

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

例如 -

`"${item}"`

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

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


M
Mohammed Ahmed

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

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

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

https://i.stack.imgur.com/0DV1G.jpg


不错的提示,但这不是 Excel 特有的吗?
M
Mohammed

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


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

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

九月=|

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

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


R
RasTheDestroyer

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

在 JS 中,这将是

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

您需要非常小心需要直接比较该数据的情况


K
Kevin

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

IMO 这比加倍引号等更简单。

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

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


m
maxshuty

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


L
LifeiSHot

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

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

最后,包装项目值:

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

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

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

S
Stevoisiak

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

您可以构建公式,例如:

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

将在 csv 中写入:

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


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅