CSV i konwersja nr PESEL, REGON

Witajcie.

Mam pewien problem. :frowning:
Przenoszę starą aplikację do Railsów i muszę zapewnić przeniesienie bazy z Firebirda do bazy docelowej jaką ma być Postrgres (ewentualnie MySql).
Dysponuję Flamerobin (proste narzędzie do zarządzania bazą Firebird), który to program umożliwia mi wyeksportowanie tabel do plików *.csv.

Eksportuję dane i widzę, że dane w kolumnach, w których są cyfry potrafią być “dziwne”,
tzn, tam gdzie na początku np w numerze PESEL było “0” np “01251502837” mam teraz przedstawione z “zerem” na końcu, poprzedzonym "kropką. (jako “1251502837.0” )

Używam rake db:seed do ładowania tych danych, takiego kodu

CSV.foreach("db/seeds/osoba.csv", { encoding: "ISO-8859-2:utf-8", 
                                    headers: true, 
                                    header_converters: :symbol, 
                                    col_sep: ';', 
                                    converters: :all}
            ) do |row|

  @individual = Individual.create(
    id:                   row[:id_osoba], 
    first_name:           row[:imie], 
    last_name:            row[:nazwisko],
....                                  
    pesel:  correct_pesel(row[:pesel]))

i widzę, że zawartość row[:pesel] jest “z kropką”

puts row[:pesel]

pokazuje:

1251502837.0

napisałem nawet fragment:

def correct_pesel(fixnumstr)
  if (fixnumstr).to_s.last(2) == '.0'
    ('000'+ ((fixnumstr).to_s).from(0).to(-3)).last(11) 
  else
    fixnumstr.to_s
  end
end

ale, czy tędy droga?

Czy ktoś się już spotkał z takim problemem w plikach CSV?

podejrzewam, że to nie problem z plikiem csv, a z typem danych w firebird, lub sposobem w jaki zapisuje (nie prezentuje) to stara aplikacja

Tutaj chyba chodzi o sposób zapisu do pliku CSV, gdyż w Firbirdzie mam:

CREATE DOMAIN DOM_PESEL AS
CHAR(11);

CREATE TABLE OSOBA (
    ID_OSOBA      DOM_ID_OSOBA NOT NULL,
    NAZWISKO      DOM_NAZWISKO,
    ...
    PESEL         DOM_PESEL,
    ...
);

zatem w tej deklaracji “raczej” nie ma rzeczy dziwnych.

A może ktoś zna jakieś dobre narzędzie do eksportu tabel z baz Firebird do CSV (poza wspomnianym Flamerobin)?

Pokaż fragment CSV po eksporcie, bez tego ciężko będzie stwierdzić czy winę za rzutowanie na liczbę ponosi eksporter z Fireborda czy rubiowa biblioteka do CSV.

Niezależnie od wyniku, jeśli chcesz to naprawić po stronie importu w Ruby, lepiej skorzystać z wbudowanego w bibliotekę CSV wsparcia dla konwerterów: http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html#method-i-convert

Matoł ze mnie!!!

Zamiast zacząć od oglądania tego CSV, to szukam dziury w du…!

95;;CXXX;Aneta;Iława;ul.XXX;1a;34;14-200 Iława;73111204500;12.11.19XX;
96;;CXXX;Maciej;Iława;ul.XXX;1a;34;14-200;Iława;01211100536;11.01.2001;

Jasno wynika z tego, że PLIK CSV JEST DOBRY, a fragment

    CSV.foreach("db/seeds/osoba.csv", { encoding: "ISO-8859-2:utf-8", 
                                        headers: true, 
                                        header_converters: :symbol, 
                                        col_sep: ';', 
                                        converters: :all}
                ) do |row|
 pesel:  row[:pesel]

kaszani się, gdyż

puts row[:pesel] 

podaje 1211100536.0

zamiast 01211100536 !!! Dlaczego?
Da się jakoś może rzutować typ danych?
Może w deklaracji CSV.foreach( …) można zadeklarować typ danych dla określonej kolumny?

Niezależnie od wyniku, jeśli chcesz to naprawić po stronie importu w Ruby, lepiej skorzystać z wbudowanego w bibliotekę CSV wsparcia dla konwerterów: http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html#method-i-convert

Oglądałem to już wcześniej, ale przyznać muszę, że nie wiem “jak to się je” :frowning:
Możesz napisać 2-3 wiersze kodu?

converters: :all włącza konwersję do typu numerycznego

Problem polega na tym, że ja nie chcę konwertować ciągu 012345678901 na numeryczny, tylko chcę, by taki ciąg w (kolumnie [:pesel]) był interpretowany jako string.

converters: :all

nic nam nie da.

Ale usunięcie tej linijki może coś da?

:smiley: :smiley: :smiley:

I dało!!!
Faktycznie, wystarczyło usunąć

converters: :all

i numer 012345678901 jest już ładowany jako 012345678901 , a nie 12345678901.0

DZIĘKUJĘ WSZYSTKIM za sugestie wszelkie i pomoc!