2013-01-21 20 views
11

Mam ciąg z dodatkowym spacji:Usuwanie spacji w pliku CSV

First,Last,Email ,Mobile Phone ,Company,Title ,Street,City,State,Zip,Country, Birthday,Gender ,Contact Type 

chcę analizować tę linię i usuń spacje.

Mój kod wygląda następująco:

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 

Odpowiedz

1

Można strip pierwszy swoją hash:

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 

Edited rozebrać klawiszy skrótu zbyt

+1

To nie zadziała. Nagłówek "E-mail" nie jest "E-mailem", co powoduje, że kod nie znajduje wartości. –

+0

Dobrze! paski klucze też, dzięki –

+0

Dzięki, to jest praca dla mnie! – xdsemx

2

CSV obsługuje "konwertery" dla headers i fields , które pozwalają ci wejść do danych zanim zostaną przekazane do twojej pętli each.

Pisanie przykładowy plik 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) 

Oto jak zrobiłbym to:

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 

które wyjścia:

First Name: 'first' 
Last Name: 'last' 
Email: 'email' 

Konwertery prostu rozebrać początkowe i końcowe spacje z każdego nagłówka i każdego pola podczas odczytywania z pliku.

Ponadto, jako wybór projektu programowanie, nie czytają plik do pamięci przy użyciu:

csv_text = File.read('file_upload_example.csv') 

następnie zanalizować go:

Następnie pętli nad nim:

csv.each do |row| 

System IO Ruby obsługuje "wyliczanie" pliku, linia po linii. Po uzyskaniu kodu CSV.open plik jest czytelny i each czyta każdą linię. Cały plik nie musi znajdować się w pamięci naraz, co nie jest skalowalne (chociaż na nowych komputerach staje się znacznie bardziej uzasadnione), a jeśli przetestujesz, okaże się, że czytanie pliku przy użyciu each jest niezwykle szybko, prawdopodobnie równie szybko, jak podczas czytania, parsuje go, a następnie wykonuje iterację nad sparsowanym plikiem.

+0

Nie wiedziałem o konwersji, fajne rzeczy –

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

NIL testowy jest dodawany do rzędu ale nie header konwertery Zakładając, że nagłówki nie są zerowe, a dane mogą być, i zero nie ma metody Gazy. Jestem bardzo zaskoczony, że AFAIK: strip nie jest predefiniowanym konwerterem!

+0

pracował dla mnie, dzięki –

+0

Świetne, dzięki! :) – ssuljic

+0

miło, to powinna być zaakceptowana odpowiedź! – Sujimichi