Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсинг файла / 12 сообщений из 12, страница 1 из 1
07.10.2017, 13:35
    #39532670
Рустамка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг файла
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 следующего формата:
Код: plaintext
1.
2.
3.
4.
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|

Чтобы результат выглядел следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
PARAM1|PARAM2|PARAM3|PARAM4|
----------------------------
TEXT  |TEXT  |TEXT  |      |
TEXT  |      |TEXT  |TEXT  |
      |TEXT  |TEXT  |TEXT  |
TEXT  |TEXT  |TEXT  |TEXT  |
...
Рейтинг: 0 / 0
07.10.2017, 14:38
    #39532691
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг файла
Файл-то где? На клиенте или на срвере базы?

SY.
...
Рейтинг: 0 / 0
07.10.2017, 14:47
    #39532693
Рустамка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг файла
SYФайл-то где? На клиенте или на срвере базы?

SY.
В принципе, в идеале, буду обрабатывать с сервера.
Т.е. на сервере создам DIRECTORY "FILE_DIR" а из нее можно подбирать тот файл "file.txt" в external table.
Проблема в том, что если этот файл парсить как csv, то в поля вносятся данные следующим образом:
Код: plaintext
1.
2.
3.
C1         |C2         |C3         |C4|
----------------------------
PARAM1=TEXT|PARAM2=TEXT|PARAM3=TEXT|  |
А мне так не надо.
Подозреваю, что надо указывать параметры при создании external table, но какие - не могу найти. Возможно не прав, и проблема решается по-другому.
...
Рейтинг: 0 / 0
07.10.2017, 14:56
    #39532695
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг файла
Число PARAM всегда 4 или может быть любое и заранее неизвестно?

SY.
...
Рейтинг: 0 / 0
07.10.2017, 15:01
    #39532696
Рустамка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг файла
SYЧисло PARAM всегда 4 или может быть любое и заранее неизвестно?

SY.

Максимально возможное число PARAM известно заранее.
...
Рейтинг: 0 / 0
07.10.2017, 15:29
    #39532705
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг файла
РустамкаМаксимально возможное число PARAM известно заранее.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
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.
...
Рейтинг: 0 / 0
07.10.2017, 16:41
    #39532716
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг файла
A можно и через external table + view:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
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.
...
Рейтинг: 0 / 0
08.10.2017, 08:34
    #39532865
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг файла
...
Рейтинг: 0 / 0
08.10.2017, 13:03
    #39532895
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг файла
Elic Загрузка данных в формате Поле=Значение

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

Код: plsql
1.
create table tst(partition varchar2(30),subpartition varchar2(30));



SY.
P.S. Мое решение предполагает имена PARAMn.
...
Рейтинг: 0 / 0
08.10.2017, 13:13
    #39532900
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг файла
Хотя мое тоже не без грeха:

Код: plsql
1.
PARAM3=PARAM1=|



SY.
...
Рейтинг: 0 / 0
09.10.2017, 07:29
    #39533155
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг файла
SYНа универсальное решение не тянет:Во-первых, когда это было.
Во-вторых, это лишь набросок. Тут хватает якорей для надёжного соответствия.
...
Рейтинг: 0 / 0
09.10.2017, 07:30
    #39533156
Рустамка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг файла
2SY
Спасибо. Воспользовался вторым решением. Первое получается громоздким при количестве параметров больше 4 (у меня 17).
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсинг файла / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]