打印列数据如何给出条件? CSV Ruby

时间:2018-02-13 05:27:27

标签: ruby csv

我是编程新手。有没有办法让Ruby选择第1列和第2列的条件,而我打印第0列和第3列(在同一行的上下文中)

例如,我想打印出"描述"和"设备"当事件类型为"高"和严重性" 1"。

enter image description here

我无法打印出我的设备和描述

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

1 个答案:

答案 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。