1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

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

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

  1. Izver84

    Izver84 New Member

    Репутация:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    3
    Симпатии:
    0
    Здрасте.
    Есть lдосовский дбф (866) s_produc файл.
    мне надо перенести данные из дбф в postgres.
    кодировка базы в postgres utf8.
    Код:
    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;
    }

    выдает ошибку
    Код:
    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 Гость

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

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