Разбор CSV-файла с полями заголовка в качестве атрибутов для каждой строки
Я хотел бы проанализировать CSV-файл, чтобы каждая строка обрабатывалась как объект с заголовком-строкой, являющейся именами атрибутов в объекте. Я мог бы написать это, но я уверен, что это уже там.
вот мой CSV вход:
"foo","bar","baz"
1,2,3
"blah",7,"blam"
4,5,6
код будет выглядеть примерно так:
CSV.open('my_file.csv','r') do |csv_obj|
puts csv_obj.foo #prints 1 the 1st time, "blah" 2nd time, etc
puts csv.bar #prints 2 the first time, 7 the 2nd time, etc
end
с модулем CSV Ruby я считаю, что могу получить доступ только к полям по индексу. Я думаю, что приведенный выше код будет более читабельным. Есть идеи?
5 ответов:
используя Ruby 1.9 и выше, вы можете получить индексируемый объект:
CSV.foreach('my_file.csv', :headers => true) do |row| puts row['foo'] # prints 1 the 1st time, "blah" 2nd time, etc puts row['bar'] # prints 2 the first time, 7 the 2nd time, etc endэто не точечный синтаксис, но с ним гораздо приятнее работать, чем с числовыми индексами.
в сторону, для Ruby 1.8.x FasterCSV это то, что вам нужно использовать выше синтаксис.
вот пример символьного синтаксиса с использованием Ruby 1.9. В приведенных ниже примерах код считывает CSV-файл с именем data.csv из каталога Rails db.
:headers => trueобрабатывает первую строку как заголовок вместо строки данных.:header_converters => :symbolizeпараметр затем преобразует каждую ячейку в строке заголовка в символ Ruby.CSV.foreach("#{Rails.root}/db/data.csv", {:headers => true, :header_converters => :symbol}) do |row| puts "#{row[:foo]},#{row[:bar]},#{row[:baz]}" endВ Ruby 1.8:
require 'fastercsv' CSV.foreach("#{Rails.root}/db/data.csv", {:headers => true, :header_converters => :symbol}) do |row| puts "#{row[:foo]},#{row[:bar]},#{row[:baz]}" endна основе CSV, предоставленного Poul (StackOverflow asker), вывод из приведенного выше примера кода будет быть:
1,2,3 blah,7,blam 4,5,6в зависимости от символов, используемых в заголовках файла CSV, может потребоваться вывести заголовки, чтобы увидеть, как CSV (FasterCSV) преобразовал заголовки строк в символы. Вы можете вывести массив заголовков из
CSV.foreach.row.headers
хотя я довольно поздно к обсуждению, несколько месяцев назад я начал "CSV для объекта mapper" в https://github.com/vicentereig/virgola.
учитывая содержимое CSV, сопоставляя их с массивом
FooBarобъекты довольно просто:"foo","bar","baz" 1,2,3 "blah",7,"blam" 4,5,6require 'virgola' class FooBar include Virgola attribute :foo attribute :bar attribute :baz end csv = <<CSV "foo","bar","baz" 1,2,3 "blah",7,"blam" 4,5,6 CSV foo_bars = FooBar.parse(csv).all foo_bars.each { |foo_bar| puts foo_bar.foo, foo_bar.bar, foo_bar.baz }
легко получить хэш в Ruby 2.3:
CSV.foreach('my_file.csv', headers: true, header_converters: :symbol) do |row| puts row.to_h[:foo] puts row.to_h[:bar] end
Так как я ударил этот вопрос с некоторой частотой:
array_of_hashmaps = CSV.read("path/to/file.csv", headers: true) puts array_of_hashmaps.first["foo"] # 1Это не номер версии блока, когда вы хотите чавкать весь файл.
Comments