有没有办法在不破坏格式的情况下在 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?