2013-01-21 21 views
11

Ho una stringa con spazi in più:Rimozione di spazi bianchi in un file CSV

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

Voglio analizzare questa linea e rimuovere gli spazi bianchi.

mio codice è simile:

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 

risposta

1

È possibile strip tuo hash prima:

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 

cura per mettere a nudo le chiavi di hash troppo

+1

Questo non funzionerà. L'intestazione per "Email" non è "Email", in quanto il codice non trova un valore. –

+0

Giusto! anche le chiavi a strisce, grazie –

+0

Grazie, è lavoro per me! – xdsemx

2

CSV sostiene "convertitori" per la headers e fields , che ti consente di accedere ai dati prima che siano passati al tuo ciclo each.

Scrivi file CSV di esempio:

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) 

Ecco come lo farei:

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 

quali uscite:

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

I convertitori semplice striscia spazi iniziali e finali da ogni intestazione e ogni campo mentre vengono letti dal file.

Inoltre, come una scelta di design di programmazione, non leggere il file in memoria utilizzando:

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

Poi analizzarlo:

Poi ciclo su di esso:

csv.each do |row| 

Il sistema IO di Ruby supporta "enumerare" su un file, riga per riga. Una volta che il mio codice è CSV.open il file è leggibile e il each legge ogni riga. L'intero file non ha bisogno di essere in memoria in una volta, che non è scalabile (anche se sulle nuove macchine sta diventando molto più ragionevole), e, se testerai, scoprirai che leggere un file usando each è estremamente veloce, probabilmente ugualmente veloce come leggerlo, analizzandolo e ripetendo il file analizzato.

+0

Non sapevo di convert, roba interessante –

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

Il test nil viene aggiunto alla fila ma non intestazione convertitori assumendo che le intestazioni non sono mai nullo, mentre i dati possono essere, e nil non avere un metodo striscia. Sono davvero sorpreso che, AFAIK,: strip non sia un convertitore predefinito!

+0

ha funzionato per me, grazie –

+0

Grande, grazie! :) – ssuljic

+0

carino, questa dovrebbe essere la risposta accettata! – Sujimichi

Problemi correlati