【问题标题】:ruby excel to csv adding .0 to zipcodesruby excel 到 csv 将 .0 添加到邮政编码
【发布时间】:2013-05-25 07:26:12
【问题描述】:

我正在使用 ruby​​ 将 excel 文件转换为 csv 文件。这是我为此编写的函数:

#!/usr/bin/ruby
require 'CSV'
require 'roo'

def xls_to_csv(file,temp_filename)
    if file =~ /\.xlsx$/
        excel = Roo::Excelx.new(file)
    else
        excel = Roo::Excel.new(file)
    end 

    output = File.open(temp_filename, "w")

    1.upto(excel.last_row) do |line|
        output.write CSV.generate_line excel.row(line)
    end 
end

它工作正常,除了在文件中的任何邮政编码之后它会添加一个“.0”。以下是输入数据的示例:

address state   zip code    name
123 Lane    TX  78705           John Smith
456 Lane    MS  39564           Smohn Jith

一旦 .xls 文件通过函数运行,这里是 CSV 输出:

address,state,zip code,name
123 Lane,TX,78705.0,John Smith
456 Lane,MS,39564.0,Smohn Jith

如您所见,邮政编码现在后面有“.0”。有没有办法避免这种情况?谢谢!

【问题讨论】:

  • 您能否将 Excel 文档中邮政编码字段的数据类型更改为非数字或至少是整数而不是十进制?应该有一个格式化选项。
  • +1 @Cyle。人们经常错误地将邮政编码字段设置为数字,因为毕竟它是一个数字......有点......直到他们意识到前导零已经消失并且他们需要输入复合邮政编码,如 00000-0000。相反,邮政编码需要是字符串。

标签: ruby csv xls export-to-csv zipcode


【解决方案1】:

Roo 从 Excel 单元格类型中获取数据类型。如果您控制电子表格,我建议您将单元格类型更改为文本。 否则,您可以将其转换为脚本中的字符串。例如(请注意,我没有在本地测试过,所以可能是错误的):

1.upto(excel.last_row) do |line|
    data = excel.row(line)
    data[2] = data[2].to_s
    output.write CSV.generate_line data
end

【讨论】:

  • 您能举个例子说明我如何在脚本中将其转换为字符串吗?
  • 太棒了!完美运行。谢谢:)
  • 除了 @the Tin Man 指出的那样,您已经丢失了前导零,因此您需要将它们 sprintf 重新输入:data[2] = '%05d' % data[2]
  • 好点pguardiario。我不是来自美国,所以没有意识到拉链可以从零开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多