Файл с разделителями Oracle SQL Pipe с одним столбцом с разделителями-запятыми для разделения и загрузки с использованием SQLLDR

Входные данные выборки:

Style|Size|Codes
Modern|9|A224, B153, C166
Retro|8|D532, E533, F122
Vintage|7|G324, H243, I432

Использование SQLLDR - нужен этот вывод:

Style     Size     Code1      Code2      Code3
Modern    9        A224       B153       C166
Retro     8        D532       E533       F122
Vintage   7        G324       H243       I432

person user3546956    schedule 13.11.2014    source источник


Ответы (1)


Вы можете выполнить преобразование данных по пути. Это указано в управляющем файле. См. этот недавний пост для примера: -of-y/26743439#26743439">SQLLDR CTL: загрузить поле даты, полученное в формате DDMonYYYY, в поля базы данных с форматами YYYYMM или MM/DD/YYYY

Я бы использовал REGEXP_SUBSTR для извлечения различных кодов из их позиций в списке, разделенном запятыми. Попробуйте и дайте нам знать, что происходит.

Похоже, ваша целевая таблица будет иметь конечное количество столбцов кода. Что делать, если в ваших данных больше коэдов, чем столбцов в целевой таблице? Подумайте о том, чтобы сделать коды для элемента отдельной таблицей, чтобы не нарушить первую нормальную форму (одно значение только для каждого столбца).

Если строка кодов из исходного файла действительно является описанием как часть элемента, то они, скорее всего, должны оставаться вместе в виде столбца code_description. Это зависит от того, как эти данные используются вашим приложением или отчетом.

Все, что было сказано, заключается в том, чтобы определить поле кодов как BOUNDFILLER. Это говорит об обработке его как FILLER и не загружайте его, но разрешите использовать его в качестве переменной связывания в более поздних выражениях. Попробуйте это в своем управляющем файле:

LOAD DATA
INFILE 'data.txt'
APPEND
INTO TABLE X_TEST
FIELDS TERMINATED BY '|'
TRAILING NULLCOLS
(
 STYLE       CHAR
,SIZE        CHAR
,CODESTRING  BOUNDFILLER
,CODE1      "trim(regexp_substr(:CODESTRING, '([^,]*)(,|$)', 1, 1, NULL, 1))"
,CODE2      "trim(regexp_substr(:CODESTRING, '([^,]*)(,|$)', 1, 2, NULL, 1))"
,CODE3      "trim(regexp_substr(:CODESTRING, '([^,]*)(,|$)', 1, 3, NULL, 1))"
)

Регулярное выражение можно прочитать как «Вернуть n-е вхождение нуля или более символов, не являющихся запятыми, за которыми следует запятая или конец строки, и вернуть 1-ю подгруппу (то есть данные за вычетом запятой или конца строки). строка). Просто оберните его вызовом TRIM(), чтобы удалить пробелы, или подождите, пока один из мастеров REGEXP выдаст улучшенный REGEX. Если есть только 2 кода, CODE3 будет NULL.

person Gary_W    schedule 13.11.2014