Draqun
October 31, 2014, 10:57am
1
Witam.
Mam dość niespotykany problem. Mianowicie wczytuję sobie plik CSV
CSV.foreach( "#{directory}/article_groups.csv" , { :col_sep => ';', headers: true } ) do |row|
STDERR.puts row.inspect
STDERR.puts row["article_group_id"]
STDERR.puts Article.create!( id: row["article_group_id"], name: row["desc_de"] ).inspect, ""
end
Plik mam w dwóch wersjach. Pełen (~200K elementów) i jego wersja skrócona do ~20 elementów dla testów i teraz jak odpalam na testowym to otrzymuję to czego się spodziewam.
#<CSV::Row "article_group_id":"241" "owner_group_id":"NULL" "level":"1" "desc_de":"Radlager" "complex_desc_de":"Radlager" "row_date":"2014-10-15 10:41:47.663">
241
#<ContextItemGroup id: 241, name: "Radlager", created_at: "2014-10-31 10:49:22", updated_at: "2014-10-31 10:49:22">
Tymczasem gdy odpalę na pełnym pliku otrzymuję
#<CSV::Row "<U+FEFF>article_group_id":"241" "owner_group_id":"NULL" "level":"1" "desc_de":"Radlager" "complex_desc_de":"Radlager" "row_date":"2014-10-15 10:41:47.663">
#<ContextItemGroup id: 1, name: "Radlager", created_at: "2014-10-31 10:40:56", updated_at: "2014-10-31 10:40:56">
Dane wejściowe oczywiście są takie same. Pliki różnią się tylko ilością danych.
Oczywiście jest to bardzo ważne dla mnie aby otrzymywać te dane. Inne dane oczywiście się się wyświetlają. Problem zawsze jest z 1 kolumną pliku CSV.
Draqun
October 31, 2014, 11:12am
2
Po wywołaniu w VIM
:set nobomb
plik wczytuje się poprawnie. Niestety nie będę miał zawsze możliwości przeglądania tych plików. Da się jakoś to zrobić programowo?
Spróbuj dodać:
‘r:bom|utf-8’
po przecinku za lokalizacją pliku, który wczytujesz. Powinno zadziałać ale nie mam jak sprawdzić obecnie pisząc z tel.
Draqun
October 31, 2014, 1:22pm
4
Uzycie
Draqun:
CSV.foreach( “#{directory}/article_groups.csv”, "r:bom|utf-8’ , { :col_sep => ‘;’, headers: true } ) do |row|
powoduje
rake aborted!
ArgumentError: wrong number of arguments (3 for 1..2)
/home/damian/.rvm/rubies/ruby-2.1.3/lib/ruby/2.1.0/csv.rb:1119:in `foreach'
Draqun
October 31, 2014, 1:51pm
5
Ok działa. Zajrzałem w implementacje foreach i zaminiełem kod na
CSV.open( "#{directory}/article_groups.csv", "r:bom|utf-8" , { :col_sep => ';', headers: true } ) do |csv|
csv.each do |row|
STDERR.puts row.inspect
STDERR.puts row["article_group_id"]
STDERR.puts Article.create!( id: row["article_group_id"], name: row["desc_de"] ).inspect, ""
end
end
Wielkie dzięki.
Właśnie chciałem to zasugerować, ale cieszę się że moja sugestia znalazła zastosowanie
Draqun
October 31, 2014, 3:01pm
7
Najbardziej mnie cieszy to, że powoli zaglądam do kodu railsów i zaczynam rozumieć ten miszmasz Kod Django był dla mnie bardziej zrozumiały, ale python to python
wafcio
October 31, 2014, 3:09pm
8
w django wiele rzeczy trzeba napisać samemu, w railsach wiele rzeczy robionych jest za programiste automatycznie
Draqun
November 3, 2014, 6:06am
9
Tak, ale programista ma większą kontrolę nad tym co robi Nie można powiedzieć, że któryś z tych frameworków jest lepszy bo oba są dobre.