我有一个包含名称和数字的两列 CSV。有些人的名字使用逗号,例如 Joe Blow, CFA.
这个逗号破坏了 CSV 格式,因为它被解释为一个新列。
我已经阅读,最常见的处方似乎是用新值(例如 this|that|the, other
)替换该字符或替换分隔符。
我真的很想保留逗号分隔符(我知道 excel 支持其他分隔符,但其他解释器可能不支持)。我还想在名称中保留逗号,因为 Joe Blow| CFA
看起来很傻。
有没有办法在不破坏格式的情况下在 CSV 列中包含逗号,例如通过转义它们?
将字段括在引号中,例如
field1_value,field2_value,"field 3,value",field4, etc...
请参阅wikipedia。
更新:
要对引号进行编码,请使用 "
,字段中的一个双引号符号将编码为 ""
,整个字段将变为 """"
。因此,如果您在例如 Excel 中看到以下内容:
---------------------------------------
| regular_value |,,,"| ,"", |""" |"|
---------------------------------------
CSV 文件将包含:
regular_value,",,,""",","""",","""""""",""""
逗号只是使用引号封装,因此 ,
变为 ","
。
逗号和引号需要封装和引用,因此 ","
变为 ""","""
。
我发现某些应用程序(如 Mac 中的 Numbers)如果前面有空格,则会忽略双引号。
a, "b,c"
不起作用,而 a,"b,c"
起作用。
CSV 格式的问题在于没有一个规范,有几种公认的方法,无法区分应该使用哪种方法(用于生成/解释)。我在 another post 中讨论了所有转义字符的方法(在这种情况下为换行符,但基本前提相同)。基本上它归结为为目标用户使用 CSV 生成/转义过程,并希望其余的人不要介意。
如果你想做到你所说的,你可以使用引号。像这样的东西
$name = "Joe Blow, CFA.";
$arr[] = "\"".$name."\"";
所以现在,您可以在名称变量中使用逗号。
$whatever = "\"".$name."\"";
除了其他答案中的要点:如果您在 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)
正是这种微妙之处把我带到了这里。
您可以使用模板文字(模板字符串)
例如 -
`"${item}"`
item
字符串化并用双引号括起来,但使用模板文字与它几乎没有关系,虽然这有效,但它并不能解释潜在的问题或解决方案。
根据您的语言,可能有一个 to_json 方法可用。这将避免许多破坏 CSV 的事情。
CSV 文件实际上可以使用不同的分隔符进行格式化,逗号只是默认设置。
您可以使用 sep
标志为 CSV 文件指定所需的分隔符。
只需将行 sep=;
添加为 CSV 文件的第一行,即如果您希望分隔符为分号。您可以将其更改为任何其他字符。
https://i.stack.imgur.com/0DV1G.jpg
我遇到了同样的问题,引用 ,
并没有帮助。最终,我用 +
替换了 ,
,完成了处理,将输出保存到一个 outfile 中,并用 ,
替换了 +
。这可能看起来很难看,但它对我有用。
+
根本不存在于我的数据中。谢谢你的好意评论。
""
)来转义字符串中的双引号。这是正常的做法。
field = field.replace('"', '""')
第 2 步 - 在第 1 步之后,将字段本身括在双引号中,例如 field = '"' + field + '"'
- 我认为你是铁定的。
可能不是这里需要的,但这是一个非常古老的问题,答案可能对其他人有所帮助。我发现使用不同分隔符导入 Excel 时有用的提示是在文本编辑器中打开文件并添加第一行,例如:
九月=|
在哪里 |是您希望 Excel 使用的分隔符。或者,您可以更改 Windows 中的默认分隔符,但有点冗长:
控制面板>时钟和区域>区域>格式>附加>数字>列表分隔符[从逗号更改为您的首选替代项]。这意味着 Excel 也将默认使用所选分隔符导出 CSV。
这不是一个完美的解决方案,但您可以将所有使用的逗号替换为 ‚
或更低的引号。它看起来与逗号非常相似,并且在视觉上将起到相同的作用。不需要引号
在 JS 中,这将是
stringVal.replaceAll(',', '‚')
您需要非常小心需要直接比较该数据的情况
您可以对您的值进行编码,例如在 PHP base64_encode($str) / base64_decode($str)
IMO 这比加倍引号等更简单。
https://www.php.net/manual/en/function.base64-encode.php
编码值永远不会包含逗号,因此 CSV 中的每个逗号都是分隔符。
您可以将平面文件连接管理器中的 Text_Qualifier
字段用作 "
。这应该将您的数据包装在 quotes 中,并且仅用引号之外的逗号分隔。
首先,如果项目值有双引号字符 ("),则替换为 2 个双引号字符 ("")
item = item.ToString().Replace("""", """""")
最后,包装项目值:
左侧:带双引号字符 (")
右侧:带双引号字符 (") 和逗号字符 (,)
csv += """" & item.ToString() & ""","
双引号对我不起作用,它对我有用 \"
。如果您想放置双引号作为示例,您可以设置 \"\"
。
您可以构建公式,例如:
fprintf(strout, "\"=if(C3=1,\"\"\"\",B3)\"\n");
将在 csv 中写入:
=IF(C3=1,"",B3)
","
),引号被转义(例如"""
)