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

  • Автор темы Izver84
  • Дата начала
I

Izver84

Здрасте.
Есть 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?
 
D

dzen

- написана на с, очень быстро работает.
вместо всего кода выше можно просто выполнить
pgdbf table.dbf | iconv -c -f CP866 -t UTF-8 | psql targetdatabase
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!