簡體   English   中英

如何從ruby中的CSV文件中獲取標頭

[英]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 }headerstrue ,如果我在讀取數據后將其放入,則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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM