[英]Read file and validate rows in 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']
有没有办法知道在针对行的标题验证列时哪个条件失败。 我需要知道失败的原因并打印出来
红宝石的新手。 感谢帮助
要从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) }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.