Удаление пробелов в файле 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

person xdsemx    schedule 21.01.2013    source источник


Ответы (3)


Сначала вы можете 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

Отредактировано также для удаления хэш-ключей

person Anthony Alberto    schedule 21.01.2013
comment
Это не сработает. Заголовок для электронной почты не является электронной почтой, из-за чего код не может найти значение. - person the Tin Man; 21.01.2013

@prices = CSV.parse(IO.read('prices.csv'), :headers=>true, 
   :header_converters=> lambda {|f| f.strip},
   :converters=> lambda {|f| f ? f.strip : nil})

Нулевой тест добавляется к строке, но не к преобразователям заголовков, предполагая, что заголовки никогда не равны нулю, в то время как данные могут быть такими, а у nil нет метода полосы. Я действительно удивлен, что, насколько мне известно, :strip не является предопределенным конвертером!

person Mike Blyth    schedule 07.04.2013
comment
Вместо использования синтаксиса lambda {|f| f.strip} вы можете использовать синтаксис ->, например: ->(f) {f.strip} - person Tim Banks; 24.11.2014
comment
Это было решением моей проблемы, также работает с CSV.new, а не только с CSV.parse. - person Kris Boyd; 28.08.2018
comment
тоже из рубина 2.3, ->(f) { f&.strip } - person CupawnTae; 26.02.2020

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