【问题标题】:Unable to execute a search for a specific column in a csv file using Ruby无法使用 Ruby 搜索 csv 文件中的特定列
【发布时间】:2018-02-06 08:43:48
【问题描述】:

如何在 excel 的特定列中选择一个变量并使用 Ruby 打印整行

我可以在 csv 文件中搜索某个单词。我还可以打印出整行。问题是我无法在 csv 文件中搜索特定列并打印出整行。

我需要帮助 - 选择优先级(在 excel 中的第 4 列)并使用 ruby​​ 放置整行

Equipment,Station,Status,Priority
floor,13,low,3
windows,2,medium,2
doors,14,high,1
lights,5,medium,2
lift,2,high,1


require "csv" 

alarms = CSV.read('alarms.csv')
highest = alarms.select { |level| level[0] =~ /high/}
puts highest.inspect

如果我要查找 /high/,则此代码有效 但如果我想寻找优先级 2,

highest = alarms.select { |level| level[0] =~ /2/}

它也会读取站列。

我应该如何限制我的代码只能从优先级列中读取?谢谢!和 有人可以解释一下这是做什么的吗? => |等级|等级[0]

~~~更新~~~

这是我的代码和文件路径

这就是我执行程序的方式。

很抱歉,如果有明显错误,但我无法得到结果。

如果您能指出谢谢,将不胜感激!

【问题讨论】:

  • 我已经更新了我的答案。希望有效!

标签: ruby csv


【解决方案1】:

我会为它制定一个方法:

require 'csv'

def find_status_with_priority(status, priority)
  alarms = CSV.read 'alarms.csv'
  result = alarms.select do |level|
    level[2].downcase == status.downcase && level[3].to_i == priority.to_i
  end
  result
end

p find_status_with_priority('high', 1)
p find_status_with_priority('MEDIUM', '2')

这将为您提供具有已定义状态和优先级的所有警报:

[["doors", "14", "high", "1"], ["lift", "2", "high", "1"]]
[["windows", "2", "medium", "2"], ["lights", "5", "medium", "2"]]

说明

select 是 Array 类的 Ruby 方法,您将向其传递一个块(花括号中的内容)。

|level| 是您在该块的生命周期内实例化的局部变量。这意味着选择所有level,其中level 具有此行为。

level[0] 是数组的第一列。 level[1] 是第二列,依此类推。

.to_i 将字符串“1”、“2”或“3”转换为整数值123。然后您检查是否相等(即==)与您正在寻找的优先级,在您的情况下,2

更新

要从控制台运行脚本,请运行:

ruby alarms.rb

当您与您尝试执行的 ruby​​ 文件位于同一目录时。

【讨论】:

  • 我已按照您的建议进行了更改,结果是 [ ]。它一直发生在我身上。我不明白为什么每当我弄乱 level[3] 数组时我总是有一个空的 []
  • 发布您正在运行的确切步骤。另外,确保文件alarms.csv 正是您在上面发布的那个。如果不是,那么您将得到一个空数组。
  • 我的其他答案能否获得支持?我显然需要代表发布图片
  • 这并不是 StackOverflow 的工作原理。通常,当人们帮助您时,您会用复选标记标记有帮助的问题。
  • alarms = CSV.read 'alarms.csv'行替换为alarms = CSV.read 'alarms.csv', {col_sep: ';'}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
相关资源
最近更新 更多