Удаление пробелов в CSV файле
У меня есть строка с дополнительными пробелами:
First,Last,Email ,Mobile Phone ,Company,Title ,Street,City,State,Zip,Country, Birthday,Gender ,Contact Type
Я хочу проанализировать эту строку и удалить пробелы.
Мой код выглядит так:
namespace :db do
task :populate_contacts_csv => :environment do
require 'csv'
csv_text = File.read('file_upload_example.csv')
csv = CSV.parse(csv_text, :headers => true)
csv.each do |row|
puts "First Name: #{row['First']} \nLast Name: #{row['Last']} \nEmail: #{row['Email']}"
end
end
end
Ответы
Ответ 1
Вы можете strip
ваш хэш сначала:
csv.each do |unstriped_row|
row = {}
unstriped_row.each{|k, v| row[k.strip] = v.strip}
puts "First Name: #{row['First']} \nLast Name: #{row['Last']} \nEmail: #{row['Email']}"
end
Отредактировано для удаления хэш-клавиш.
Ответ 2
@prices = CSV.parse(IO.read('prices.csv'), :headers=>true,
:header_converters=> lambda {|f| f.strip},
:converters=> lambda {|f| f ? f.strip : nil})
Тест nil добавляется в строку, но не преобразователи заголовков, предполагая, что заголовки никогда не равны нулю, а данные могут быть, а nil не имеет метода полосы. Я очень удивлен, что AFAIK: полоса не является предопределенным конвертером!
Ответ 3
CSV поддерживает "конвертеры" для заголовков и fields, который позволяет вам попасть внутрь данных, прежде чем передать их в цикл 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 IO поддерживает "перечисление" по файлу, построчно. После моего кода CSV.open
файл читается, а each
читает каждую строку. Весь файл не обязательно должен находиться в памяти сразу, что не является масштабируемым (хотя на новых машинах это становится намного более разумным), и, если вы проверите, вы обнаружите, что чтение файла с помощью each
чрезвычайно быстрый, возможно, такой же быстрый, как чтение, разбор его, итерация по анализируемому файлу.