数据从txt文件加载到oracle数据库

时间:2016-01-22 12:26:09

标签: oracle

FILE.TXT:

Itemnumber  20
Quantity    2
Itemname    Rubber

需要帮助才能将这些数据加载到表格中吗?

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

Select * from stationary
Item_number,quantity,item_name 

是专栏。

1 个答案:

答案 0 :(得分: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,查找文本'项目编号',后跟一个或多个空格,后跟一个或多个数字(记住这些数字,因此由REGEXP_SUBSTR在组中返回)。重复其他元素。

编辑:稍微考虑一下,前两个元素可以像这样缩短以获取数字的第一次和第二次出现(假设零将在那里而不是零数量的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.
相关问题