[英]Ruby: How can I read a CSV file that contains two headers in Ruby?
[英]how to get headers from a CSV file in 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方法來獲取標題
headers = csv.headers
但是header方法的問題是“如果不使用標題則返回nil,如果它們尚未被讀取則返回true,或者在讀取之后返回實際標題”。
所以如果我把headers = csv.headers
放在csv_data = csv.to_a.map {|row| row.to_hash }
csv_data = csv.to_a.map {|row| row.to_hash }
行headers
為true
,如果我在讀取數據后將其放入,則headers
包含數組中的標題行。 它對我的方法施加了一個指令順序,這個指令非常難以測試並且編程很糟糕。
有沒有辦法在這種情況下讀取標題行而不強加順序? 我正在使用ruby 2.0。
CSV.open(file_path, &:readline)
我明白了! 我有同樣的一個。 調用read
似乎做你想要的(填充headers
變量):
data = CSV.new(file, **flags)
data.headers # => true
data = CSV.new(file, **flags).read
data.headers # => ['field1', 'field2']
可能還有其他副作用我不知道,但這對我有用,並且聞起來不太糟糕。
我不太明白這個問題。 如果您使用其中一個迭代器方法,則可以很容易地對標頭進行一些驗證:
CSV.foreach('tmp.txt', headers: true) do |csv|
return unless csv.headers[0] != 'xyz'
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.