CSV поддерживает «конвертеры» для заголовки и поля , которые позволяют вам проникнуть внутрь данных до того, как они будут переданы вашему циклу each
.
Написание примера CSV-файла:
csv = "First,Last,Email ,Mobile Phone ,Company,Title ,Street,City,State,Zip,Country, Birthday,Gender ,Contact Type
first,last,email ,mobile phone ,company,title ,street,city,state,zip,country, birthday,gender ,contact type
"
File.write('file_upload_example.csv', csv)
Вот как бы я это сделал:
require 'csv'
csv = CSV.open('file_upload_example.csv', :headers => true)
[:convert, :header_convert].each { |c| csv.send(c) { |f| f.strip } }
csv.each do |row|
puts "First Name: #{row['First']} \nLast Name: #{row['Last']} \nEmail: #{row['Email']}"
end
Что выводит:
First Name: 'first'
Last Name: 'last'
Email: 'email'
Преобразователи просто удаляют начальные и конечные пробелы из каждого заголовка и каждого поля, когда они считываются из файла.
Кроме того, в качестве выбора дизайна программирования не читайте файл в память, используя:
csv_text = File.read('file_upload_example.csv')
Затем разберите его:
csv = CSV.parse(csv_text, :headers => true)
Затем переберите его:
csv.each do |row|
Система ввода-вывода Ruby поддерживает «перечисление» файла построчно. Как только мой код выполняет CSV.open
, файл становится доступным для чтения, а each
читает каждую строку. Весь файл не обязательно должен быть в памяти сразу, что не масштабируется (хотя на новых машинах это становится намного более разумным), и, если вы проверите, вы обнаружите, что чтение файла с использованием each
чрезвычайно быстро, вероятно, так же быстро, как чтение, анализ и повторение проанализированного файла.
person
the Tin Man
schedule
21.01.2013