我建议使用CSV::header_row函数来执行检查,如果它不是您所期望的,则会引发错误。就像是:
def ReadLongFile(longFile)
CSV.foreach(longFile, :headers => true, :return_headers => true, :col_sep => '|') do |row|
if row.header_row? then
raise ArgumentError, "Bad headers" unless header_sane?(row)
end
# Otherwise do the processing
end
end
您的实现header_sane?
将执行您需要的验证,以确保文件符合您的预期。如果可以从中恢复,您的调用代码可以挽救 ArgumentError,或者只是让它失败:-)
注意:更新以反映以下评论中指出的错误。请务必在调用CSV::foreach时设置 :return_headers 选项。
如果您担心调用 header_row 的最小开销?对于每个行条目,您可以构建一个 CSV 实例并使用shift在继续之前手动检查第一行。例如:
def ReadLongFile(longFile)
File.open(longFile) do |file|
reader = CSV.new(file, {:col_sep => '|', :headers => true, :return_headers => true})
header_row = reader.shift
raise ArgumentError, "Bad file headers" unless header_sane?(header_row)
reader.each do |row|
p row
end
end
end
如上所述实现,以下行为成立:
[4] pry(main)> def header_sane? row
[4] pry(main)* true
[4] pry(main)* end
=> nil
[5] pry(main)> ReadLongFile("file.csv")
#<CSV::Row "date":"2010-01-01" "time":"07:00:00" "account":"A1">
#<CSV::Row "date":"2010-01-01" "time":"07:00:01" "account":"A2">
=> nil
[6] pry(main)> def header_sane? row
[6] pry(main)* false
[6] pry(main)* end
=> nil
[7] pry(main)> ReadLongFile("file.csv")
ArgumentError: Bad file headers
from (pry):7:in `block in ReadLongFile'