powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсинг файла
12 сообщений из 12, страница 1 из 1
Парсинг файла
    #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
Парсинг файла
    #39532691
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Файл-то где? На клиенте или на срвере базы?

SY.
...
Рейтинг: 0 / 0
Парсинг файла
    #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
Парсинг файла
    #39532695
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Число PARAM всегда 4 или может быть любое и заранее неизвестно?

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

SY.

Максимально возможное число PARAM известно заранее.
...
Рейтинг: 0 / 0
Парсинг файла
    #39532705
Фотография 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
Парсинг файла
    #39532716
Фотография 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
Парсинг файла
    #39532865
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Парсинг файла
    #39532895
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic Загрузка данных в формате Поле=Значение

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

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



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

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



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


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