Wczytywanie plików CSV - CSV::Row traci dane[SOLVED]

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.

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.

Uzycie

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'

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 :smile:

Najbardziej mnie cieszy to, że powoli zaglądam do kodu railsów i zaczynam rozumieć ten miszmasz :smile: Kod Django był dla mnie bardziej zrozumiały, ale python to python :smile:

w django wiele rzeczy trzeba napisać samemu, w railsach wiele rzeczy robionych jest za programiste automatycznie

Tak, ale programista ma większą kontrolę nad tym co robi :slight_smile: Nie można powiedzieć, że któryś z tych frameworków jest lepszy bo oba są dobre.