【问题标题】:Ruby- CSV merge field valueRuby-CSV 合并字段值
【发布时间】:2016-09-19 21:50:03
【问题描述】:

我这个周末开始学习 Ruby。我正在编写一个脚本,该脚本将读取具有日期字段和时间字段的 CSV 文件,并将值合并到写入输出的新 DateTime 字段中。

我有部分工作,但我遇到的问题是日期和时间值是逗号分隔的。我想删除逗号并用空格替换它。如何删除逗号并将值合并在一起?

require 'csv'

CSV.open("output.csv", "wb", :headers => true) do |output|
  CSV.foreach("input.csv", :headers => true, :return_headers => true) do |row|
    if row.header_row?
      output << (row << 'DateTime')
    else
      output << (row << row['Date'].to_s << (row['Time'].to_s))
    end
  end
end

【问题讨论】:

  • 你能给我们看一下 CSV 标题和 CSV 中记录的第一行吗?
  • 我不应该以'wb'模式打开文件。 'b' 表示二进制,您正在创建一个文本文件,而不是二进制文件。这在 Unix 上可能没有什么不同,但它不是可移植的,而且通常是不好的做法,因为它对读者说“这将是一个二进制文件”。

标签: ruby csv


【解决方案1】:

这样的事情应该会有所帮助:

require 'csv'

CSV.open("output.csv", "wb", :headers => true) do |output|
  output << 'DateTime'

  CSV.foreach("input.csv", :headers => true, :return_headers => true, :header_converters => :symbolize) do |row|
    output << ["#{row[:date] row[:time]}"]
  end
end

此处的更改代表此功能:

  • :return_headers =&gt; true 将标头字段名称转换为符号,即使是中等长度的 CSV 文件也可以显着提高性能
  • 将标题输出移到输入 CSV 循环之外,因为标题可以安全地写入任何行数据之前
  • row[:date]row[:time] 使用高效的列引用机制
  • 将行数据写为一个数组(一个元素),由包含row[:date]row[:time] 的插值字符串组成

【讨论】:

  • @JohnnySemicolon 如果这回答了您的问题,请单击答案旁边的复选标记以接受它。复选标记将颜色变为绿色。 Upvotes 也总是受到赞赏。 :D
【解决方案2】:

您可以使用tr 替换字符串中的内容。

date = row['Date']
time = row['Time']

datetime = "#{date} #{time}".tr(',', ' ')

【讨论】:

    猜你喜欢
    • 2011-12-18
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    相关资源
    最近更新 更多