2016-01-22 87 views
0

FILE.TXT:数据加载到Oracle数据库

Itemnumber 20 
Quantity 2 
Itemname Rubber 

需要帮助这个数据装载到表?

我觉得一个ctl文件可以将数据加载到表中。我遇到了加载CSV,基于位置的负载(位置1:10)。你能帮我加载上面的文件吗?

Select * from stationary 
Item_number,quantity,item_name 

是列。

+0

请显示您尝试过的结果。结果将转到.log文件。这组3行是否真的包含记录重复?您是否可以对记录进行预处理,以便在一行上自行获取数据元素? –

+0

可以有NULL值吗? –

回答

1

虽然我强烈建议您让数据提供者为您提供加载正确格式的数据,或者做一些预处理以便自己首先构建适当的格式,我认为这是最后的手段,因为REGEXP功能很昂贵,如果这个文件很大,它很可能需要很长时间来处理。无论如何,我们都必须处理来自供应商的废话数据,并且必须做我们必须做的事情,无论如何:-)

CONCATENATE 3子句告诉sqlldr在处理前将每3行组合成1行。然后,任务是从该行中获取数据元素。

sqlldr读取该行并且由于没有定义分隔符,整个行实际上是一个字段并与控制文件TEMP中的第一个字段匹配。 TEMP与表stationary中的列不匹配,因此不会尝试插入它,但在右侧,您会看到它被定义为BOUNDFILLER,它告诉sqlldr要记住它,但不要做任何其他操作。 sqlldr然后看到控制文件中定义的其他字段与表中的列匹配,因此它应用表达式并将结果插入到相应的列中。

表达式对已保存的行进行操作并挑出该行的数据部分。

load data 
infile 'file.txt' 
CONCATENATE 3 
into table stationary 
append 
TRAILING NULLCOLS 
(
    TEMP   BOUNDFILLER CHAR(1000), 
    Item_number EXPRESSION "REGEXP_SUBSTR(:TEMP, 'Itemnumber +([0-9]+)', 1, 1, NULL, 1)", 
    quantity  EXPRESSION "REGEXP_SUBSTR(:TEMP, 'Quantity +([0-9]+)', 1, 1, NULL, 1)", 
    item_name  EXPRESSION "REGEXP_SUBSTR(:TEMP, 'Itemname +(.*)', 1, 1, NULL, 1)" 
) 

由于数据元素名称在数据文件中被硬编码,因此请查找并获取后面的数据部分。即对于Itemnumber,请查找文本'Itemnumber',然后查找一个或多个空格,后跟一个或多个数字(这些数字会被记住,因此会在REGEXP_SUBSTR的组中返回)。重复其他元素。

编辑:有关此一点点的思考,第一2个元件可缩短这样抓住一个数的第一和第二出现(假定零将在那里,而不是对于零量的NULL):

Item_number EXPRESSION "REGEXP_SUBSTR(:TEMP, '[0-9]+', 1, 1)", 
    quantity  EXPRESSION "REGEXP_SUBSTR(:TEMP, '[0-9]+', 1, 2)", 

试试看,并尝试一下。

Assumptions: 
- Hardcoded element names won't change 
- There will always be at least one space between element names and their value 
- There will be no NULL item numbers or quantities (a 0 will be there) 
- item_name data can't contain one of the hardcoded element names 

Caveats 
- The common regex shortcut of \d for a digit does not work. 
+0

好的...... –