Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> добавление данных из dbf в postgresql xbase, кодировка 866-utf8 
:(
    Опции темы
izver84
Дата 3.11.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 5.11.2007

Репутация: нет
Всего: 1



Здрасте.
Есть lдосовский дбф (866) dats файл.
мне надо перенести данные из дбф в 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,ZAPRE
T,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,ZAI
AVKA)
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?



--------------------
Если новая программа с первого раза компилируется без ошибок, значит, она написана принципиально неправильно. 
PM MAIL   Вверх
shamber
Дата 3.11.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Есть еще модуль Encode...

Но запросы вы жестко пишете...
Код

$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;

Это жесть
Зачем каждый раз делать prepare в цикле? 
Может быть лучше:
Код

$qw="Insert into s_product_new(kg77,kgtr,KOLT,KPKG,...,ZAIAVKA) values(?,?,?,?,?.....?)";
$pgb = $dbh->prepare($qw) or die "Prepare: $qw", $dbh->errstr;
while ( @row = $sel_csr->fetchrow_array )
{
 foreach $st(@row)
{push(@st,$st."\t");}
$pgb->execute($st[-38],$st[-37],...,$st[-1]) or die "Executing: $qw", $pgb->errstr;
}

И так далее...

Это сообщение отредактировал(а) shamber - 3.11.2009, 14:47
PM MAIL Jabber   Вверх
izver84
Дата 3.11.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 5.11.2007

Репутация: нет
Всего: 1



shamber, пишу
Код

$qw = encode("utf8", $qw);

ошибки не выдаёт, но вместо 
RГОЛУБЦЫ формируется R[][][][[][][][]




--------------------
Если новая программа с первого раза компилируется без ошибок, значит, она написана принципиально неправильно. 
PM MAIL   Вверх
krypt3r
Дата 3.11.2009, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 2
Всего: 16



Код

use Encode qw /from_to/;
from_to ($mystr, 'cp866', 'utf8');

PM MAIL   Вверх
izver84
Дата 4.11.2009, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 5.11.2007

Репутация: нет
Всего: 1



krypt3r, заработало, спасибо.

сейчас надо обратно из postgresql->dbf
Код

use DBD::Xbase;
use DBI;
use Encode qw /from_to/;
# имя базы данных
$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,...,ZAIAVKA from s_product_new where kvpr='0583014400'";
$sth = $dbh->prepare( $sel);
$rv = $sth->execute();
my $table = new XBase "dats.dbf" or die XBase->errstr; 
$qw="Insert into e (kg77,KGTR,...,ZAIAVKA) values(?,?,...,?");
@st=();
while (  @row = $sth->fetchrow_array)
{
 foreach $st(@row)
{push(@st,$st."\t");}
Encode::from_to ($qw, 'utf8', 'cp866');
$sel_csr->execute($st[-38],$st[-37],...,$st[-1]) or die "Executing: $qw", $xbase_dbh->errstr;
}


выдаёт ошибку
user posted image

69 строка
Код

my $sel_csr = $xbase_dbh->prepare($qw);



в чем причина не понятна?

причину нашел

допустим 
есть поле продукт с размером 6 символов
значение поля в базе - 'яблоко'
значение массива '$st[3]' ='яблоко        '
если я пишу
Код

substr('$st[3]',1,6)

или
Код

trim('$st[3]')


выдаёт ошибку 
Код

DBD::Xbase::db prepare failed: Unknown SQL command near  'trim('яблоко        ')'

вопрос в следующем как избавиться от пробелов?
 

Это сообщение отредактировал(а) izver84 - 4.11.2009, 18:59


--------------------
Если новая программа с первого раза компилируется без ошибок, значит, она написана принципиально неправильно. 
PM MAIL   Вверх
krypt3r
Дата 4.11.2009, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 2
Всего: 16



Если мне не изменяет память, функции trim нет в реализации DBF, а есть alltrim, rtrim, ltrim. То же самое о substr - ее нет там. Посмотрите в сторону subs

Это сообщение отредактировал(а) krypt3r - 4.11.2009, 21:01
PM MAIL   Вверх
izver84
Дата 5.11.2009, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 5.11.2007

Репутация: нет
Всего: 1



нашел это

команды xbase sql

там есть такое
Код

 SUBSTRING()
This is similar to the dBASE SUBSTR() function in that you must give a starting place and an ending place, but in SQL the ending location is not optional.

SQL Syntax:

  SUBSTRING( <fieldname> FROM <nStart> FOR <nEnd> )

If you wanted to get the first three characters of the "NAME" field, you could use:

  // this will return the name field in one column, and
  // the first three characters in the next, with the 
  // second column name being: "name substring 1"
  SELECT name, SUBSTRING( name FROM 1 FOR 3 ) from :dB2KSample:fish

As above, this will return a read-only query, as we are creating a calculated field. 


как его подключить?



--------------------
Если новая программа с первого раза компилируется без ошибок, значит, она написана принципиально неправильно. 
PM MAIL   Вверх
krypt3r
Дата 5.11.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 2
Всего: 16



заменить свой код
Код

substr('mytext', 1, 10)

на
Код

substring('mytext' from 1 for 10)

PM MAIL   Вверх
izver84
Дата 6.11.2009, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 5.11.2007

Репутация: нет
Всего: 1



krypt3r, 
без разницы.


--------------------
Если новая программа с первого раза компилируется без ошибок, значит, она написана принципиально неправильно. 
PM MAIL   Вверх
izver84
Дата 6.11.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 5.11.2007

Репутация: нет
Всего: 1



если делаю так

Код

$sel_csr->execute($st[-38],'$st[-37]',...,$st[-1]) 


то значение элемента $st[-37]  добавляются,но в конце программа добавляет символ конца строки.
Можно ли как-то избавиться от этого?



--------------------
Если новая программа с первого раза компилируется без ошибок, значит, она написана принципиально неправильно. 
PM MAIL   Вверх
izver84
Дата 10.11.2009, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 5.11.2007

Репутация: нет
Всего: 1



Такой вопрос 

возвращаюсь в импорт


Код

$qw="Insert into s_product_new(kg77,kgtr,KOLT,KPKG,nvpr,...,ZAIAVKA) values(?,?,?,?,?.....?)";
$pgb = $dbh->prepare($qw) or die "Prepare: $qw", $dbh->errstr;
while ( @row = $sel_csr->fetchrow_array )
{
 foreach $st(@row)
{push(@st,$st."\t");}
$pgb->execute($st[-38],$st[-37],.,'$st[-34]',..,$st[-1]) or die "Executing: $qw", $pgb->errstr;
}


есть поле nvpr - наименование продукции
в дбф поле имеет значение- 
'мороженое' "август" '
Программа понимает только - мороженое 

как сделать так, что бы прога понимала - мороженое' "август" 



--------------------
Если новая программа с первого раза компилируется без ошибок, значит, она написана принципиально неправильно. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0518 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.