我在csv文件中有非常脏的数据,我需要定期转储到表中。此csv文件包含前几天的所有先前记录(感谢第三方供应商!),但我满足于让唯一约束使这些记录不会重复。
但是,这些脏数据的本质是将数据本身的额外逗号加入nincompoops,并且双引字段太难了(不要让自己给第三方供应商带来压力!)。因此,虽然理想记录有7个字段,但其中一些字段最多可以显示12个字段。
我真正所需的字段是附加日期。它始终是第7场(除非它是第8,第9,第10,第11或第12场)。
有没有办法指定此列是最后一个字段?
控制文件似乎允许逐个位置,但仅适用于固定长度的记录(字符45-68等)。有没有办法告诉它“最后一个”并从中起作用?
注意:仔细阅读文档并了解到我需要做的每件有趣/有用的事情都是不可能的,我已经知道了答案,但无论如何我都要问。
答案 0 :(得分:0)
.csv看起来像这样(可变长度记录,每个问题的日期最后):
Lance,Link,07/28/1968
Mata,M,Hairi,11/22/1969
Ba,ron,von But,cher,,,02/28/1966
构建您的控制文件,如下所示:
load data
infile 'x_test.csv'
into table x_test
truncate
FIELDS TERMINATED BY x'0D0A' TRAILING NULLCOLS
(
x BOUNDFILLER,
col1 EXPRESSION "TO_DATE(REGEXP_SUBSTR(:x, '.*,(.*)$', 1, 1, NULL, 1), 'MM/DD/YYYY')"
)
Sqlldr将读取每一行,因为它的定义BOUNDFILLER
不会尝试加载它,而是“记住”它以供以后用作'x'。接下来,它会看到一个'col1',它匹配表中的一列,因此它运行表达式,从记忆缓冲区'x'中提取最后一个逗号后的内容,直到该行结束,将其转换为日期并加载该日期进入col1。
SQL> select col1
from x_test;
COL1
---------
28-JUL-68
22-NOV-69
28-FEB-66
SQL>
我相信这会解决这个问题。您很可能需要调整日期格式,实际上正则表达式应该对您实际处理的日期格式更严格,而不仅仅是接受行尾的内容。