读取文件并验证Ruby中的行

时间:2015-09-06 18:16:50

标签: ruby

我有一个CSV文件,如下所示

ID      Required  -- these are headers
SD0005   Yes      -- row information

我必须针对标头验证每一行。说ID包含字母和数字,长度不应超过6。 每行中必需的标题应为yes或no。

如果我必须处理一个超过1000行并且性能良好的大文件,我怎样才能在Ruby中实现这个功能?

我正在针对每个标题阅读特定行,如下所示

CSV.foreach('file path', :headers => true) do |csv_obj| 
csv_obj['ID'] 
csv_obj['Required']

有没有办法知道哪一个条件失败,同时验证一行的标题。我需要知道它失败的条件并将其打印出来

红宝石新手。感谢帮助

1 个答案:

答案 0 :(得分:1)

要从CSV文件将数据导入Ruby,请尝试以下操作:

# This will read the data in with headers, convert the column names to symbols, 
# and then turn each resulting CSV::Row instance into a hash

data = CSV.read('temp.csv', headers: true, header_converters: :symbol).map(&:to_h)

这应该返回以下内容:

=> [{:id=>"SD0005", :required=>" yes"}, ...]

一旦您拥有可以在Ruby中使用的格式的所有信息,您就可以创建一种方法来检查每个ID的有效性。

def valid_id?(id_string)
  # uses Regular Expressions to ensure ID is 6 
  # characters that consist of only numbers/letters
  # The double-bang(!!) turn a truthy value to `true`
  # or false value to `false`

  !!id_string.match(/^[\D|\d]{6}$/)
end

如果您想测试其他列的有效性,请使用单独的方法进行测试。

def valid_required?(req_column)
  req_column.downcase == 'yes' ||   req_column.downcase == 'no'
end

创建主验证器方法

def all_valid?(row)
  valid_id?(row[:id]) && valid_required?(row[:required])
end

然后只保留ID有效的记录

# #select keeps values whose block evaluates to `true`
valid_records = data.select { |record| all_valid?(record) }