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.
Questo non funzionerà. L'intestazione per "Email" non è "Email", in quanto il codice non trova un valore. –
Giusto! anche le chiavi a strisce, grazie –
Grazie, è lavoro per me! – xdsemx