2014-01-12 60 views
6

我需要在解析其中的數據之前驗證CSV文件中的標頭。如何從ruby中的CSV文件中獲取標頭

# convert the data into an array of hashes 
CSV::Converters[:blank_to_nil] = lambda do |field| 
    field && field.empty? ? nil : field 
end 
csv = CSV.new(file, :headers => true, :header_converters => :symbol, :converters => [:all, :blank_to_nil]) 
csv_data = csv.to_a.map {|row| row.to_hash } 

我知道我可以使用頭文件的方法來獲得頭

headers = csv.headers 

但隨着headers method的問題是,它「返回nil,如果標題將不能使用,如果他們將真實的,但還沒有已被閱讀,或在閱讀完畢後的實際標題。「

所以,如果我把headers = csv.headers上述csv_data = csv.to_a.map {|row| row.to_hash }headerstrue,如果我把它讀取數據後,headers包含在陣列中的行頭。它對我的方法施加了一個指令順序,這是很難測試的,並且是不好的編程。

有沒有辦法在這種情況下讀取標題行而不強加順序?我使用的是Ruby 2.0。

回答

0

我不太明白這個問題。如果您使用其中一種迭代器方法,可以很容易地對標題進行驗證:

CSV.foreach('tmp.txt', headers: true) do |csv| 
    return unless csv.headers[0] != 'xyz' 
end 
3

我得到了問題!我有同一個。調用read似乎做你想要什麼(填充headers變量):

data = CSV.new(file, **flags) 
data.headers # => true 

data = CSV.new(file, **flags).read 
data.headers # => ['field1', 'field2'] 

可能有其他副作用,我不知道,但是這對我的作品,並沒有氣味太糟糕了。

9
CSV.open(file_path, &:readline)