SQL*Loader - загрузка CSV с несколькими чанками

У меня есть файл 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.


person Eugene Zhulenev    schedule 30.01.2012    source источник
comment
У вас есть возраст, вес, рост и только эти три поля для каждого чанка?   -  person Benoit    schedule 30.01.2012


Ответы (2)


Предполагая, что вы работаете в 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, это несложно.

person Zsolt Botykai    schedule 30.01.2012
comment
+1. с этим awk вы можете просто проанализировать ввод и сделать его стандартным csv, чтобы загрузить его с помощью SQL. - person Florin Ghita; 30.01.2012
comment
Вы правы, @FlorinGhita, почему мне это не приходит в голову? Мне нужно поспать. - person Zsolt Botykai; 30.01.2012

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

person Jeffrey Kemp    schedule 01.02.2012