SQL * Loader - загрузить CSV с несколькими блоками - PullRequest
1 голос
/ 30 января 2012

У меня есть CSV-файл, который содержит несколько блоков данных:

Alice
Age,Weight,Height
20y,50kg,170cm
Bob
Age,Weight,Height
22y,80kg,180cm

Мне нужно загрузить его в таблицу PEOPLE таким образом:

Name   |  Age   |  Weight   |  Height 
Alice     20y       50kg        170cm
Bob       22y       80kg        180cm

Возможно ли это сделать с помощью SQL * Loader? Другой способ - написать препроцессор csv, например, на groovy, но было бы гораздо лучше решить его просто с помощью SQl * Loader

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Предполагается, что вы находитесь в Linux и или имеете доступ к awk:

awk -v Q="'" -F "," \
    'BEGIN {
         print "create table YOURTABLE (name varchar2(X), age varchar2(Y), weight varchar2(Z), height varchar2(N));"
     }
     /^[^,]\+$/ {name=$0}
     /^Age,Weight,Height$/ {
         getline 
         print "insert into YOURTABLE values (" Q name Q ", " Q $1 Q ", " Q $2 Q ", " Q $3 Q ") ;"
         print "commit;"
     }
     END { print "exit;" }' INPUT.CSV > LOAD.SQL

Таким образом, он печатает оператор create table ..., в котором вы должны заменить длину вашего поля и имя табуляции. Затем читает ваш CSV и в каждой строке, если строка не содержит какую-либо ,, она устанавливает переменную name, затем в каждой строке Age,Weight,Height читает следующую и печатает оператор insert с содержимым (и commit;). В конце он печатает exit;.

Вуаля, вы можете загрузить его с sqlplus.

Или переписать его немного, чтобы создать стандарт csv, это легко.

0 голосов
/ 01 февраля 2012

Альтернативой является просто загрузить его в промежуточную таблицу (или загрузить как внешнюю таблицу) с общими столбцами C1, C2, C3;тогда было бы просто написать SQL для его обработки.

...