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

Откуда:
Сообщений: 55
+ Oracle version

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for 64-bit Windows: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production

Так. Вот сейчас в меня какашками не кидаться. Это не парсинг CSV или XML! :-)
В какую сторону моргать, чтобы реализовать парсинг файла средствами PL/SQL следующего формата:

PARAM1=TEXT|PARAM2=TEXT|PARAM3=TEXT|
PARAM1=TEXT|PAPAM3=TEXT|PARAM4=TEXT|
PARAM2=TEXT|PARAM3=TEXT|PARAM4=TEXT|
PARAM1=TEXT|PARAM2=TEXT|PARAM3=TEXT|PARAM4=TEXT|

Чтобы результат выглядел следующим образом:

PARAM1|PARAM2|PARAM3|PARAM4|
----------------------------
TEXT |TEXT |TEXT | |
TEXT | |TEXT |TEXT |
|TEXT |TEXT |TEXT |
TEXT |TEXT |TEXT |TEXT |
7 окт 17, 13:35    [20850739]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг файла  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 8624
Файл-то где? На клиенте или на срвере базы?

SY.
7 окт 17, 14:38    [20850809]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг файла  [new]
Рустамка
Member

Откуда:
Сообщений: 55
SY
Файл-то где? На клиенте или на срвере базы?

SY.

В принципе, в идеале, буду обрабатывать с сервера.
Т.е. на сервере создам DIRECTORY "FILE_DIR" а из нее можно подбирать тот файл "file.txt" в external table.
Проблема в том, что если этот файл парсить как csv, то в поля вносятся данные следующим образом:

C1 |C2 |C3 |C4|
----------------------------
PARAM1=TEXT|PARAM2=TEXT|PARAM3=TEXT| |
А мне так не надо.
Подозреваю, что надо указывать параметры при создании external table, но какие - не могу найти. Возможно не прав, и проблема решается по-другому.
7 окт 17, 14:47    [20850818]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг файла  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 8624
Число PARAM всегда 4 или может быть любое и заранее неизвестно?

SY.
7 окт 17, 14:56    [20850831]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг файла  [new]
Рустамка
Member

Откуда:
Сообщений: 55
SY
Число PARAM всегда 4 или может быть любое и заранее неизвестно?

SY.


Максимально возможное число PARAM известно заранее.
7 окт 17, 15:01    [20850837]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг файла  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 8624
Рустамка
Максимально возможное число PARAM известно заранее.


SET SERVEROUTPUT ON FORMAT WRAPPED
DECLARE
    v_file utl_file.file_type;
    v_line varchar2(200);
    v_param varchar2(15);
    v_param_count number := 4;
    v_out_line varchar2(100);
BEGIN
    v_file := utl_file.fopen('TEMP','pldr.txt','R');
    FOR v_i in 1..v_param_count LOOP
      v_out_line := v_out_line || RPAD('PARAM' || v_i,15) || '|';
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(v_out_line);
    DBMS_OUTPUT.PUT_LINE(RPAD('-',16 * v_param_count,'-'));
    LOOP
      utl_file.get_line(v_file,v_line);
      v_line := v_line || 'PARAM1= |PARAM2= |PARAM3= |PARAM4= |';
      v_out_line := NULL;
      FOR v_i in 1..v_param_count LOOP
        v_line := v_line || 'PARAM' || v_i || '=|';
        v_out_line := v_out_line || RPAD(
                                         SUBSTR(
                                                v_line,
                                                INSTR(
                                                      v_line,
                                                      'PARAM' || v_i || '='
                                                     ) + 7,
                                                INSTR(
                                                      v_line,
                                                      '|',
                                                      INSTR(
                                                            v_line,
                                                            'PARAM' || v_i || '='
                                                           ) + 7
                                                     ) - INSTR(
                                                               v_line,
                                                               'PARAM' || v_i || '='
                                                              ) - 7
                                               ),
                                         15
                                        ) || '|';
      END LOOP;
      DBMS_OUTPUT.PUT_LINE(v_out_line);
    end loop;
    utl_file.fclose(v_file);
  EXCEPTION
    WHEN NO_DATA_FOUND
      THEN
        utl_file.fclose(v_file);
END;
/
PARAM1         |PARAM2         |PARAM3         |PARAM4         |
----------------------------------------------------------------
TEXT           |TEXT           |TEXT           |               |
TEXT           |               |TEXT           |TEXT           |
               |TEXT           |TEXT           |TEXT           |
TEXT           |TEXT           |TEXT           |TEXT           |

PL/SQL procedure successfully completed.

SQL> 


SY.
7 окт 17, 15:29    [20850890]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг файла  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 8624
A можно и через external table + view:

SQL> CREATE TABLE PARAMS(
  2                      PARAM1  VARCHAR2(100),
  3                      PARAM2  VARCHAR2(100),
  4                      PARAM3  VARCHAR2(100),
  5                      PARAM4  VARCHAR2(100)
  6                     )
  7    ORGANIZATION EXTERNAL(
  8                          TYPE ORACLE_LOADER
  9                          DEFAULT DIRECTORY TEMP
 10                          ACCESS PARAMETERS(
 11                                            FIELDS TERMINATED BY "|"
 12                                            MISSING FIELD VALUES ARE NULL
 13                                            (
 14                                             PARAM1,
 15                                             PARAM2,
 16                                             PARAM3,
 17                                             PARAM4
 18                                            )
 19                                           )
 20                          LOCATION('pldr.txt')
 21                         )
 22  /

Table created.

SQL> CREATE OR REPLACE
  2    VIEW PARAMS_VW
  3      AS
  4        SELECT  CASE
  5                  WHEN PARAM1 LIKE 'PARAM1=%' THEN SUBSTR(PARAM1,INSTR(PARAM1,'=') + 1)
  6                  WHEN PARAM2 LIKE 'PARAM1=%' THEN SUBSTR(PARAM2,INSTR(PARAM2,'=') + 1)
  7                  WHEN PARAM3 LIKE 'PARAM1=%' THEN SUBSTR(PARAM3,INSTR(PARAM3,'=') + 1)
  8                  ELSE SUBSTR(PARAM4,INSTR(PARAM4,'=') + 1)
  9                END PARAM1,
 10                CASE
 11                  WHEN PARAM1 LIKE 'PARAM2=%' THEN SUBSTR(PARAM1,INSTR(PARAM1,'=') + 1)
 12                  WHEN PARAM2 LIKE 'PARAM2=%' THEN SUBSTR(PARAM2,INSTR(PARAM2,'=') + 1)
 13                  WHEN PARAM3 LIKE 'PARAM2=%' THEN SUBSTR(PARAM3,INSTR(PARAM3,'=') + 1)
 14                  ELSE SUBSTR(PARAM4,INSTR(PARAM4,'=') + 1)
 15                END PARAM2,
 16                CASE
 17                  WHEN PARAM1 LIKE 'PARAM3=%' THEN SUBSTR(PARAM1,INSTR(PARAM1,'=') + 1)
 18                  WHEN PARAM2 LIKE 'PARAM3=%' THEN SUBSTR(PARAM2,INSTR(PARAM2,'=') + 1)
 19                  WHEN PARAM3 LIKE 'PARAM3=%' THEN SUBSTR(PARAM3,INSTR(PARAM3,'=') + 1)
 20                  ELSE SUBSTR(PARAM4,INSTR(PARAM4,'=') + 1)
 21                END PARAM3,
 22                CASE
 23                  WHEN PARAM1 LIKE 'PARAM4=%' THEN SUBSTR(PARAM1,INSTR(PARAM1,'=') + 1)
 24                  WHEN PARAM2 LIKE 'PARAM4=%' THEN SUBSTR(PARAM2,INSTR(PARAM2,'=') + 1)
 25                  WHEN PARAM3 LIKE 'PARAM4=%' THEN SUBSTR(PARAM3,INSTR(PARAM3,'=') + 1)
 26                  ELSE SUBSTR(PARAM4,INSTR(PARAM4,'=') + 1)
 27                END PARAM4
 28          FROM  PARAMS
 29  /

View created.

SQL> COLUMN PARAM1 FORMAT A10
SQL> COLUMN PARAM2 FORMAT A10
SQL> COLUMN PARAM3 FORMAT A10
SQL> COLUMN PARAM4 FORMAT A10
SQL> SELECT  *
  2    FROM  PARAMS_VW
  3  /

PARAM1     PARAM2     PARAM3     PARAM4
---------- ---------- ---------- ----------
TEXT       TEXT       TEXT
TEXT                  TEXT       TEXT
           TEXT       TEXT       TEXT
TEXT       TEXT       TEXT       TEXT

SQL> 


SY.
7 окт 17, 16:41    [20850980]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг файла  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 27289
Загрузка данных в формате Поле=Значение
8 окт 17, 08:34    [20851746]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг файла  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 8624
Elic
Загрузка данных в формате Поле=Значение


На универсальное решение не тянет:

create table tst(partition varchar2(30),subpartition varchar2(30));


SY.
P.S. Мое решение предполагает имена PARAMn.
8 окт 17, 13:03    [20852051]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг файла  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 8624
Хотя мое тоже не без грeха:

PARAM3=PARAM1=|


SY.
8 окт 17, 13:13    [20852059]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг файла  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 27289
SY
На универсальное решение не тянет:
Во-первых, когда это было.
Во-вторых, это лишь набросок. Тут хватает якорей для надёжного соответствия.
9 окт 17, 07:29    [20853357]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг файла  [new]
Рустамка
Member

Откуда:
Сообщений: 55
2SY
Спасибо. Воспользовался вторым решением. Первое получается громоздким при количестве параметров больше 4 (у меня 17).
9 окт 17, 07:30    [20853359]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить