[英]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.