我是编程新手。有没有办法让Ruby选择第1列和第2列的条件,而我打印第0列和第3列(在同一行的上下文中)
例如,我想打印出"描述"和"设备"当事件类型为"高"和严重性" 1"。
我无法打印出我的设备和描述
require "csv"
equipment = []
description = []
def find_severity(event_type, severity)
alarms = CSV.read 'alarms.csv', {col_sep: ';'}
result = alarms.select do |level|
level[1] == event_type && level[2].to_i == severity.to_i
equipment[] = level[0]
description[] = level[3]
end
end
p find_severity('high', 1)
p equipment
p description
答案 0 :(得分:2)
我建议将任务分解为各自职责的方法。你在这里加载,过滤和转换。这些方法可以反映出来。 (我没有测试过这段代码,但这应该显示出一般的想法。)
我认为你会因此而变得更好:
require "csv"
def load_alarms
CSV.read 'alarms.csv', {col_sep: ';'}
end
def filter_by_event_type_and_severity(alarms, event_type, severity)
alarms.select do |alarm|
alarm[1] == event_type && alarm[2].to_i == severity.to_i
end
end
target_alarms = filter_by_event_type_and_severity(
load_alarms, 'high', 1)
equipments = target_alarms.map { |alarm| alarm[0] }
descriptions = target_alarms.map { |alarm| alarm[3] }
p target_alarms
p equipments
p descriptions
即使方法的实现非常简单,这也将为您提供将代码分离为逻辑部分的实践,每个部分都具有高度内聚性或专业性,并且对代码的其他部分具有最小的耦合(依赖性)。 / p>
初学者最大的错误之一是尝试在相同的代码块中做太多 - 高级和低级代码,以及完全不相关的主题。学习如何将问题分解为较小的问题,并在逻辑上组织它们,是您可以学习的重要技能之一。
顺便说一下,我不建议to_i
上的severity
来电。由于参数在逻辑上是一个数字,因此您不应该真正允许字符串IMO。