перенос из Dbf(cp866) -> Postgres(utf8)

Тема в разделе "Perl программирование", создана пользователем Izver84, 3 ноя 2009.

  1. Izver84

    Izver84 New Member

    Регистрация:
    3 ноя 2009
    Сообщения:
    3
    Симпатии:
    0
    Здрасте.
    Есть lдосовский дбф (866) s_produc файл.
    мне надо перенести данные из дбф в postgres.
    кодировка базы в postgres utf8.
    Код (Text):
    use DBD::Xbase;
    use DBI;
    # имя базы данных
    $dbname = "sbit";
    # имя пользователя
    $username = "postgres";
    # пароль
    $password = "syrus";
    # имя или IP адрес сервера
    $dbhost = "192.168.4.30";
    # порт
    $dbport = "5432";
    # терминал
    $dbtty = "utf8";
    my $dir = "s://molds//copy";
    my $xbase_dbh = DBI->connect("DBI:XBase:$dir"   undef   undef   {RaiseError =>1});
    $dbh = DBI->connect("dbi:PgPP:dbname=$dbname;host=$dbhost;port=$dbport;tty=$dbtty"  "$username" "$password"
    {PrintError => 0});
    if ($DBI::err != 0) {
    print $DBI::errstr . "\n";
    exit($DBI::err);
    }
    my $sel = "select kg77  KGTR    KOLT    KPKG    KVP KVPR2   KZPR    KZPRN   NVPR    NVPRK   OBUPAK  SKLAD   VESB    VESN    ZAPRET  ED_IZM  PR_NDS  SXRAN   MOROZ   KODGP   KODPRZ  KODUPAK KODPR_PO   
    YES_BUGET   SKLAD_I YES_REALIZ  UZINA   NZPR    NZPRN   PZA PZAV    YES_TECI    YES_GRAMM   KVPR3   KVPR4   KGTR2   DATS    ZAIAVKA from s_produc.dbf";
    my $table = new XBase "dats.dbf" or die XBase->errstr;
    my $sel_csr = $xbase_dbh->prepare($sel);
    $sel_csr->execute();
    @st=();
    while ( @row = $sel_csr->fetchrow_array )
    {
    foreach $st(@row)
    {push(@st   $st."\t");}
    $qw="Insert into s_product_new
    (kg77   kgtr    KOLT    KPKG    KVP KVPR    KZPR    KZPRN   NVPR    NVPRK   OBUPAK  SKLAD   VESB    VESN    ZAPRET  ED_IZM  PR_NDS  SXRAN   tip KODGP   KODPRZ  KODUPAK KODPR_PO    YES_BUDGET  SKLAD_I YES_REALIZ  ceh NZPR    NZPRN   PZA PZAV    YES_TECI    YES_GRAMM   KVPR2   KVPR3   KGTR2   DATS    ZAIAVKA)
    values($st[-38] $st[-37]    $st[-36]    $st[-35]    $st[-34]    substr('$st[-33]'   1   10) substr('$st[-32]'   1   2)  substr('$st[-31]'   1   4)  substr('$st[-30]'   1   20)
    substr('$st[-29]'   1   11) $st[-28]    $st[-27]    $st[-26]    $st[-25]    $st[-24]    substr('$st[-23]'   1   3)  $st[-22]    $st[-21]    $st[-20]    $st[-19]    $st[-18]    $st[-17]   
    $st[-16]    $st[-15]    $st[-14]    $st[-13]    $st[-12]    substr('$st[-11]'   1   20) substr('$st[-10]'   1   20) $st[-9] $st[-8] $st[-7] $st[-6] substr('$st[-5]'    1   6) 
    substr('$st[-4]'    1   4)  $st[-3] substr('$st[-2]'    1   6)  $st[-1])";
    $pgb = $dbh->prepare($qw) or die "Prepare: $qw" $dbh->errstr;
    $pgb->execute or die "Executing: $qw"   $pgb->errstr;
    }

    выдает ошибку
    Код (Text):
    Executing: Insert into s_product_new
    (kg77   kgtr    KOLT    KPKG    KVP KVPR    KZPR    KZPRN   NVPR    NVPRK   OBUPAK  SKLAD   VESB    VESN    ZAPRET  ED_IZM 
    PR_NDS  SXRAN   tip KODGP   KODPRZ  KODUPAK KODPR_PO    YES_BUDGET  SKLAD_I YES_REALIZ  ceh NZPR   
    NZPRN   PZA PZAV    YES_TECI    YES_GRAMM   KVPR2   KVPR3   KGTR2   DATS    ZAIAVKA)
    values(55   99  1   1   0   substr('0065014400 '    1   10)
    substr('73 '    1   2)  substr('164 '   1   4)  substr('RГОЛУБ КАПУСТ ЛИСТ'  1   20)
    substr('ГОЛКАПЛИСТ '  1   11) 0.4     4   0.4     0.4     0   substr('BUC '   1   3)  20  2160    
    1   0   999     0   0   0   0   0   0   substr('LEVADA '    1   20)
    substr('RГОЛУБ КАПУСТ ЛИСТ ' 1   20) 1   0   0   0   substr(' '  1   6) 
    substr(' '  1   4)  0   substr('091014 '    1   6)  1 )
    ERROR: invalid byte sequence for encoding "UTF8": 0x83
    можно ли при конекте xbase указать кодировку дбф или обязательно изменить кодировку дбф на utf8?
     
  2. dzen

    dzen Гость

    http://pgdbf.sourceforge.net/ - написана на с, очень быстро работает.
    вместо всего кода выше можно просто выполнить
    pgdbf table.dbf | iconv -c -f CP866 -t UTF-8 | psql targetdatabase
     
Загрузка...

Поделиться этой страницей