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.
To nie zadziała. Nagłówek "E-mail" nie jest "E-mailem", co powoduje, że kod nie znajduje wartości. –
Dobrze! paski klucze też, dzięki –
Dzięki, to jest praca dla mnie! – xdsemx