【问题标题】:Only string (not number) quoting when generating CSV生成 CSV 时仅引用字符串(不是数字)
【发布时间】:2015-02-18 14:33:52
【问题描述】:

我生成CSV数据如下:

require 'csv'
CSV.generate do |csv|
  csv << ['a', 123, 1.5, '0123']
end

这会返回这个结果:

"a,123,1.5,0123\n"

问题在于 Excel 会将0123 解释为整数。另一方面,当使用force_quotes: true 时,值1231.5 将不再被解释为数字。

如何只引用字符串而不是数字来获得以下结果?

"\"a\",123,1.5,\"0123\"\n"

【问题讨论】:

标签: ruby csv


【解决方案1】:
require 'csv'
test = CSV.generate do |csv|
  csv << ['a', 123, 1.5, '0123'].map{|e|e.class == String ? "\"#{e}\"" : e}
end
puts test # => """a""",123,1.5,"""0123"""

此输出是有效的 CSV,并以如下形式导入电子表格:

A1: "a"
B1: 123
C1: 1.5
D1: "0123"

这是你要找的吗?


编辑:

如果不是很明显,我在这里所做的是在将每个值传递到 csv 之前检查它。如果它是一个字符串,请用引号将其括起来(\" 是转义的引号),然后让 CSV 转义它们,但它需要以使其有效。

无论您使用哪种方法将内容传递到您的 csv 对象,您都应该能够进行相同的检查并以这种方式修改字符串。

或者,如果您有权访问源数据,请在此处添加引号。

【讨论】:

  • 好吧,你必须手动转义这些字符串中的引号,因为它可能是'a "b" c'。也许还可以更好地使用is_a? 来比较课程?
  • 您不需要手动转义内部引号,csv 会为您完成。是的,is_a? 更适合班级检查,我只是没想到。
  • 所以确认一下,csv &lt;&lt; ['a "b" c'] 如果你通过上面的测试,就会以"a "b" c" 的形式导入到excel中
  • 还有一个问题,因为我不想在 Excel 行中有引号。现在,用三个引号,字符串值在单元格中显示为"a"
  • 然后,您需要指定 Excel 如何读取值。如果不向 CSV 添加字符,则无法对 0123 是字符串而不是数字这一事实进行编码。我上面链接的超级用户帖子向您展示了如何在文件打开期间指定数据类型。
猜你喜欢
  • 2021-07-20
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多