【问题标题】:Ruby: Write to CSV if condition metRuby:如果条件满足,则写入 CSV
【发布时间】:2016-02-01 04:12:56
【问题描述】:

我是 Ruby 的新手,我用它来尝试读/写 csv。到目前为止,我有一个执行以下操作的脚本:

  1. 从 CSV 文件导入数据,将选择的列存储为单独的数组(我不需要每一列的数据)
  2. 对数据执行计算,将结果存储在新创建的数组中
  3. 将数组转置为表格行,以输出到 csv

    table = [Result1, Result2, Result3].transpose
    

目前,我可以使用以下方式输出表格:

     CSV.open(resultsFile, "wb",
    :write_headers=> true,
    :headers => ["Result1", "Result2", "Result3"]
      ) do |csv|
      table.each do |row|
         csv << row 
      end

我的问题是,如何在其中一个结果等于某个文本字符串的情况下仅向输出行添加条件。例如,如果 result2 中的值等于“Apple”,我希望将该行中的数据写入 csv 文件。如果不是,则跳过该行。

我尝试将 if/else 放在几个不同的区域,但没有任何成功。

感谢您的帮助

【问题讨论】:

  • 单独存储列有什么好处?
  • @Tilo csv 有大约 40 列,我只对其中 3 列感兴趣(我已经编辑了我的帖子以使那篇文章更清晰)。不过,我愿意接受任何建议 - 这是我第一次尝试 Ruby,所以不确定我是否做对了。
  • 如果您使用smarter_csv gem,您可以使用key_mapping 选项仅保留您感兴趣的列,然后根据需要将数据写入新的 CSV 文件

标签: ruby csv


【解决方案1】:

您可以执行以下操作:

header = ["Result1", "Result2", "Result3"]
CSV.open(resultsFile, "wb", :write_headers=> true, :headers => header) do |csv|
    table.each do |row|
        csv << row if header.zip(row).to_h["Result2"] == "Apple"
    end
end

zip 合并两个数组并生成数组数组,其中每个子数组在相同索引处具有来自输入数组的元素,to_h 可以将任何 2 元素数组数组转换为哈希。例如:

row = ["Orange", "Apple", "Guava"]
header = ["Result1", "Result2", "Result3"]

header.zip(row).to_h
=> {"Result1"=>"Orange", "Result2"=>"Apple", "Result3"=>"Guava"}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-13
    • 2019-03-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多