我有一个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']
有没有办法知道哪一个条件失败,同时验证一行的标题。我需要知道它失败的条件并将其打印出来
红宝石新手。感谢帮助
答案 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) }