Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 а какой самый изящный способ импортировать данные из DBASE?  [new]
Nutss
Member

Откуда: Челябинск
Сообщений: 1015
здравствуйте! как считаете?
22 янв 10, 08:06    [8226353]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
Nutss
Member

Откуда: Челябинск
Сообщений: 1015
ODBC+PL SQL Developer нравится!
22 янв 10, 09:22    [8226531]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
-2-
Member

Откуда:
Сообщений: 15330
Nutss,

Для 11g на Unix
CREATE TABLE "EXT$KLADR_SOCRBASE_DBF" (
   "DELETED" VARCHAR2(1 CHAR), 
   "LEVEL" VARCHAR2(5 CHAR), 
   "SCNAME" VARCHAR2(10 CHAR), 
   "SOCRNAME" VARCHAR2(29 CHAR), 
   "KOD_T_ST" VARCHAR2(3 CHAR)
)
ORGANIZATION EXTERNAL(
   TYPE ORACLE_LOADER 
   DEFAULT DIRECTORY "KLADR_DIR" 
   ACCESS PARAMETERS ( 
      RECORDS FIXED 48
      CHARACTERSET RU8PC866 TERRITORY RUSSIA STRING SIZES ARE IN CHARACTERS 
      BADFILE 'SOCRBASEdbf.bad' LOGFILE 'SOCRBASEdbf.log' 
      PREPROCESSOR 'dbf2fix-' 
      FIELDS RTRIM ( 
         DELETED CHAR(1), 
         LEVEL CHAR(5), 
         SCNAME CHAR(10), 
         SOCRNAME CHAR(29), 
         KOD_T_ST CHAR(3) 
      ) 
   ) LOCATION ('SOCRBASE.DBF' )
);

:~> cat /oracle/loading/KLADR/dbf2fix-
#!/bin/bash
# Cut header from DBF

export PATH=/oracle/bin:/usr/local/bin:/usr/bin:/bin:$PATH

dbfile=$1
hsize=`od -t u2 -j 8 -N 2 -A n "$dbfile"`
#rsize=`od -t u2 -j 10 -N 2 -A n "$dbfile"`
#rcount=`od -t u4 -j 4 -N 4 -A n "$dbfile"`

let hsize=hsize+1
#echo "$dbfile starting @ $hsize with record length $rsize & $rcount records"
tail -c +$hsize "$dbfile" | head -c -1
22 янв 10, 10:42    [8227170]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8132
Nutss
а какой самый изящный способ импортировать данные из DBASE?
здравствуйте! как считаете?
Использовать на Windows-клиенте Oracle 8.0.5 (8.0.4) утилиту SQL*Loader v8.0.4,
которая штатно обрабатывала DBF-файлы (без memo-полей).

(+) Исходные файлы не требуют какого-либо преобразования.
(+) Используется штатная утилита Oracle
(+) ...

(-) Работает только в среде Windows
(-) Старая версия Oracle-клиента
(-) ...
22 янв 10, 11:59    [8227954]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
Nutss
Member

Откуда: Челябинск
Сообщений: 1015
-2-
Nutss,

Для 11g на Unix
CREATE TABLE "EXT$KLADR_SOCRBASE_DBF" (
   "DELETED" VARCHAR2(1 CHAR), 
   "LEVEL" VARCHAR2(5 CHAR), 
   "SCNAME" VARCHAR2(10 CHAR), 
   "SOCRNAME" VARCHAR2(29 CHAR), 
   "KOD_T_ST" VARCHAR2(3 CHAR)
)
ORGANIZATION EXTERNAL(
   TYPE ORACLE_LOADER 
   DEFAULT DIRECTORY "KLADR_DIR" 
   ACCESS PARAMETERS ( 
      RECORDS FIXED 48
      CHARACTERSET RU8PC866 TERRITORY RUSSIA STRING SIZES ARE IN CHARACTERS 
      BADFILE 'SOCRBASEdbf.bad' LOGFILE 'SOCRBASEdbf.log' 
      PREPROCESSOR 'dbf2fix-' 
      FIELDS RTRIM ( 
         DELETED CHAR(1), 
         LEVEL CHAR(5), 
         SCNAME CHAR(10), 
         SOCRNAME CHAR(29), 
         KOD_T_ST CHAR(3) 
      ) 
   ) LOCATION ('SOCRBASE.DBF' )
);

:~> cat /oracle/loading/KLADR/dbf2fix-
#!/bin/bash
# Cut header from DBF

export PATH=/oracle/bin:/usr/local/bin:/usr/bin:/bin:$PATH

dbfile=$1
hsize=`od -t u2 -j 8 -N 2 -A n "$dbfile"`
#rsize=`od -t u2 -j 10 -N 2 -A n "$dbfile"`
#rcount=`od -t u4 -j 4 -N 4 -A n "$dbfile"`

let hsize=hsize+1
#echo "$dbfile starting @ $hsize with record length $rsize & $rcount records"
tail -c +$hsize "$dbfile" | head -c -1



ого! Спасибо
22 янв 10, 12:48    [8228450]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
Nutss
Member

Откуда: Челябинск
Сообщений: 1015
SQL*Plus,

спасибо :) минусы существенны весьма
22 янв 10, 12:50    [8228470]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
aeugen
Member

Откуда:
Сообщений: 3043
1. Создать таблицу для данных
2. Выгрузить данные файла в CSV:
dbf --csv DBASE_FILE.csv --separator '~' --noconv DBASE_FILE.dbf
3. Исправляем кодировку полученного файла:
piconv -f cp866 -t utf8 DBASE_FILE.csv| perl -p -e  's/\015\012/ /' >DBASE_FILE.utf8.csv
4. Делаем файл конфигурации DBASE_FILE.ctl для SQLLDR
5. Грузим данные sqlldr USER_NAME@SERVICE control=DBASE_FILE.ctl SKIP=1

PS
[*****@aeugen]$ dbf --help
dBase Reader and Converter V. 0.8.3.1, (c) 2002 - 2004 by Bjoern Berg
Usage:
        dbf [options] dbf-file
        Output the contents of the dBASE table file (.dbf).
Available options:
*       --sql   {filename} -- writes the table-creating SQL code into the file
                (default is to write to stdout in human-readable form)
        --trim  {r|l|b} -- whether to trim the string fields in the SQL output
                from right, left, or both
                (default is not to trim)
*       --csv   {filename} -- outputs the "Comma Separated Values" represenation
                of the dBASE table into the specified file
                (default is to write to stdout in human-readable form)
        --separator     {c} -- sets the separator character for the CSV format
                (default is to use ``,'')
*       --view-info     write the dBASE file's headers and stats to stdout
                (default is not to output the stats)
        --noconv        do not run each each record through charset converters
                (default is to use the experimental converters)
        --debug {0-9} -- set the debug level. 0 is the quietest
                (default is 0)
*       --version       shows the current release number
*-marked options are currently mutually exclusive.
The last specified takes precedence.
A single dash (``-'') as a filename specifies stdin or stdout
22 янв 10, 12:54    [8228515]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
Nutss
Member

Откуда: Челябинск
Сообщений: 1015
-2-,

Вы знали, что я kladr загружаю или это совпадение? )
22 янв 10, 12:56    [8228542]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
Nutss
Member

Откуда: Челябинск
Сообщений: 1015
-2-,
просто отлично, спасибо огромное
22 янв 10, 13:02    [8228596]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
Nutss
Member

Откуда: Челябинск
Сообщений: 1015
aeugen,

спасибо!
22 янв 10, 13:04    [8228624]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
pectopatop
Member

Откуда:
Сообщений: 765
-2-
Nutss,

CREATE TABLE "EXT$KLADR_SOCRBASE_DBF" (
   "DELETED" VARCHAR2(1 CHAR), 
   "LEVEL" VARCHAR2(5 CHAR), 
   "SCNAME" VARCHAR2(10 CHAR), 
   "SOCRNAME" VARCHAR2(29 CHAR), 
   "KOD_T_ST" VARCHAR2(3 CHAR)
)
ORGANIZATION EXTERNAL(
   TYPE ORACLE_LOADER 
   DEFAULT DIRECTORY "KLADR_DIR" 
   ACCESS PARAMETERS ( 
      RECORDS FIXED 48
      CHARACTERSET RU8PC866 TERRITORY RUSSIA STRING SIZES ARE IN CHARACTERS 
      BADFILE 'SOCRBASEdbf.bad' LOGFILE 'SOCRBASEdbf.log' 
      PREPROCESSOR 'dbf2fix-' 
      FIELDS RTRIM ( 
         DELETED CHAR(1), 
         LEVEL CHAR(5), 
         SCNAME CHAR(10), 
         SOCRNAME CHAR(29), 
         KOD_T_ST CHAR(3) 
      ) 
   ) LOCATION ('SOCRBASE.DBF' )
);

:~> cat /oracle/loading/KLADR/dbf2fix-
#!/bin/bash
# Cut header from DBF

export PATH=/oracle/bin:/usr/local/bin:/usr/bin:/bin:$PATH

dbfile=$1
hsize=`od -t u2 -j 8 -N 2 -A n "$dbfile"`
#rsize=`od -t u2 -j 10 -N 2 -A n "$dbfile"`
#rcount=`od -t u4 -j 4 -N 4 -A n "$dbfile"`

let hsize=hsize+1
#echo "$dbfile starting @ $hsize with record length $rsize & $rcount records"
tail -c +$hsize "$dbfile" | head -c -1


Но это ж только на сервере если запускать?
Если доступ только с клиента, то не пойдет?
23 дек 11, 07:40    [11812599]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
А на клиенте есть SQL*Loader
23 дек 11, 07:43    [11812601]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
pectopatop
Member

Откуда:
Сообщений: 765
Клиент Виндовый, и имею ввиду - стоит ло копать аналоги для Винды, если доступ только с клиента.
На сервере нет расшаренных каталогов.
А на клиенте всяких раз разные каталоги, да и клиентские компы разные
23 дек 11, 07:45    [11812605]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
pectopatop
Member

Откуда:
Сообщений: 765
Вячеслав Любомудров
А на клиенте есть SQL*Loader

Нет
23 дек 11, 07:46    [11812606]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Ну так поставь
23 дек 11, 07:47    [11812607]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
pectopatop
Member

Откуда:
Сообщений: 765
Вячеслав Любомудров
Ну так поставь

Если б все было так просто..
(это не претензия к вам, просто констатация фактов)
23 дек 11, 08:55    [11812695]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
123йй
Guest
pectopatop,

PL/SQL Developer?
23 дек 11, 09:06    [11812720]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
Vladimir Baskakov
Member

Откуда:
Сообщений: 2006
отрезать заголовок dbf-файла по самый текст, и скормить хвост sql-loader-у. Дбф - он же состоит из заголовочного блока=32 байта, блоков описания полей - по 32 байта на поле, один байт про запас (код не помню) - дальше - чистый текст, и в конце - еще байтег....
никаких odbc не нужно. распилить можно перлом, который ставится с оракл-клиентом. ну или джавой - оттуда же...
(склеить его можно в обратном порядке, тоже - чем угодно)))) )
23 дек 11, 10:22    [11813022]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
AlexJm
Member

Откуда:
Сообщений: 679
Nutss
а какой самый изящный способ импортировать данные из DBASE?

Установить в базу JDBF как java source (4 .java файла), загрузить dbf в temporary blob и скормить классу DBFReader в качестве InputStream.
23 дек 11, 11:38    [11813563]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
pectopatop
Member

Откуда:
Сообщений: 765
123йй
pectopatop,

PL/SQL Developer?

Это есть (единственное по сути на клиенте)
23 дек 11, 12:55    [11814379]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
pectopatop
Member

Откуда:
Сообщений: 765
Vladimir Baskakov
отрезать заголовок dbf-файла по самый текст, и скормить хвост sql-loader-у. Дбф - он же состоит из заголовочного блока=32 байта, блоков описания полей - по 32 байта на поле, один байт про запас (код не помню) - дальше - чистый текст, и в конце - еще байтег....
никаких odbc не нужно. распилить можно перлом, который ставится с оракл-клиентом. ну или джавой - оттуда же...
(склеить его можно в обратном порядке, тоже - чем угодно)))) )

Посмотрел - не по 32 байта на поле. Разной ширины поля. Но вот NULL-записи все равно вроде как столько же места занимают - это радует: значит да, можно наверно распарсить будет из BLOB-а
23 дек 11, 12:57    [11814397]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
123йй
Guest
pectopatop,

ну тогда и тяни им. odbc importer
23 дек 11, 13:33    [11814743]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
pectopatop
Member

Откуда:
Сообщений: 765
123йй
pectopatop,

ну тогда и тяни им. odbc importer

Эээ... извините, сбил с толку.
имелось ввиду - есть доступ на выполнение sql / pl\sql процедур / пакетов / джобов и т.п.
Устанавливать софт (в том числе и Developer) нет возможности - безопасность типа...
23 дек 11, 14:06    [11815052]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
123йй
Guest
pectopatop,
автор
есть доступ на выполнение

автор
Устанавливать софт (в том числе и Developer) нет возможности

Путаетесь в показаниях или что-то уже стоит (всмысле софт)? Тогда - что это?
23 дек 11, 14:31    [11815368]     Ответить | Цитировать Сообщить модератору
 Re: а какой самый изящный способ импортировать данные из DBASE?  [new]
pectopatop
Member

Откуда:
Сообщений: 765
123йй
pectopatop,
автор
есть доступ на выполнение

автор
Устанавливать софт (в том числе и Developer) нет возможности

Путаетесь в показаниях или что-то уже стоит (всмысле софт)? Тогда - что это?

Скажем так - стороннее ПО, имеющее (да!) в своем составе "ETL", но такой корявый...... что DBF-ки грузятся со скоростью 1Мб/мин, занимая при этом 100% CPU (комп обычный юзерский, не сервер, но и не древний)

Собственно вопрос получается: можно ли на клиентском месте выполнить загрузку методом -2- ?
Java же вроде как на клиентском машине выполняется? Доступа к файловой системе м/у сервером / клиентом нет (ни туда, ни обратно т.е.)
23 дек 11, 17:13    [11817002]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить