我正在尝试加载一个CSV文件,其中每行数据都加载到两个表(TAB1,TAB2)中。 对于CSV文件中的每一行数据,将在TAB1中加载一行,在第二个表中加载多行。
CSV文件中的数据行示例:
Data_col1,Data_col2,Data_col3,Data_col4 , Key_name1, Key_value1 , Key_name2, Key_value2 ,Key_name3, Key_value3 ,.................
我期待这些数据如下表所示:
Tab1
====
Data_col1
Data_col2
Data_col3
Data_col4
Tab2 ( Load data in TAB2 until the end of the data row1)
record 1 ==> Key_name1, Key_value1
record 2 ==> Key_name2, Key_value2
record 3 ==> Key_name3, Key_value3
我做了一些研究,但无法解决这个问题。 请帮我解决这个问题。
答案 0 :(得分:0)
如何首先加载到单个导入表中,然后使用脚本处理数据并将其加载到两个表中?
答案 1 :(得分:0)
通常这种情况会要求预先处理文件以在加载之前拆分记录,或者如@MercyfulGPF建议的那样,加载到临时表并运行一个过程来将行处理到它们的表中(这将是我喜欢的方法因为它允许你更多地控制过程,你可以处理可变数量的键名/值对。)
但是,如果您拥有固定数量的元素并且不介意维护噩梦,那么您可以提出要求。使用多个“INTO TABLE”部分构造控制文件,第一个字段从位置(1)开始。这会强制sqlldr将其内部指针移回每个INTO表部分的行的开头,为每个部分插入一个新行。每个部分都将已经插入的字段定义为FILLER,以便跳过它们(确保它们的名称与表列不同)。如果您的示例建议存在可变数量的key_name / value对,则它将不起作用。所以这可能只是一个部分解决方案,但可能会给你一些可能(或不可能)的想法。
LOAD DATA
infile datafile.csv
TRUNCATE
INTO TABLE tab1
fields terminated by ','
(
data_col
)
INTO TABLE tab1
fields terminated by ','
(
filler1 FILLER position(1)
,data_col
)
INTO TABLE tab1
fields terminated by ','
(
filler1 FILLER position(1)
,filler2 FILLER
,data_col
)
INTO TABLE tab1
fields terminated by ','
(
filler1 FILLER position(1)
,filler2 FILLER
,filler3 FILLER
,data_col
)
INTO TABLE tab2
fields terminated by ','
(
filler1 FILLER position(1)
,filler2 FILLER
,filler3 FILLER
,filler4 FILLER
,key_name
,key_value
)
INTO TABLE tab2
fields terminated by ','
(
filler1 FILLER position(1)
,filler2 FILLER
,filler3 FILLER
,filler4 FILLER
,filler5 FILLER
,filler6 FILLER
,key_name
,key_value
)
...