Удаление пробелов в 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 чрезвычайно быстрый, возможно, такой же быстрый, как чтение, разбор его, итерация по анализируемому файлу.