Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL加载器字段是否可以通过其相对于最后一个字段的位置来指定?_Oracle_Csv_Sql Loader - Fatal编程技术网

Oracle SQL加载器字段是否可以通过其相对于最后一个字段的位置来指定?

Oracle SQL加载器字段是否可以通过其相对于最后一个字段的位置来指定?,oracle,csv,sql-loader,Oracle,Csv,Sql Loader,我需要定期将csv文件中的脏数据转储到表中。此csv文件包含前几天的所有以前的记录(感谢第三方供应商!),但我满足于让唯一的约束防止这些记录重复 然而,这种肮脏数据的本质是在数据本身中添加额外的逗号,而双引号字段太难了(不要让自己成为第三方供应商!)。因此,虽然理想的记录有7个字段,但其中一些字段最多有12个字段 我真正需要的字段是所附的日期。它总是第7个字段(除非是第8、第9、第10、第11或第12个字段) 是否有办法指定此列始终是最后一个字段 控制文件似乎允许按位置显示字段,但只允许固定长度

我需要定期将csv文件中的脏数据转储到表中。此csv文件包含前几天的所有以前的记录(感谢第三方供应商!),但我满足于让唯一的约束防止这些记录重复

然而,这种肮脏数据的本质是在数据本身中添加额外的逗号,而双引号字段太难了(不要让自己成为第三方供应商!)。因此,虽然理想的记录有7个字段,但其中一些字段最多有12个字段

我真正需要的字段是所附的日期。它总是第7个字段(除非是第8、第9、第10、第11或第12个字段)

是否有办法指定此列始终是最后一个字段

控制文件似乎允许按位置显示字段,但只允许固定长度的记录(字符45-68等)。有什么方法可以告诉它“最后一个”并从中学习吗


注意:翻阅了文档,了解到我需要做的每一件有趣/有用的事情都是不可能的,我已经知道答案,但我还是要问一下。

带.csv的,看起来像这样(可变长度记录,每个问题都有最后一个日期):

按如下方式构造控制文件:

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>

我相信这会解决这个问题。您很可能需要调整日期格式,实际上,正则表达式应该对您实际处理的日期格式更加严格,而不仅仅是接受行末尾的内容。

您是否可以选择预处理文件,也许用脚本把最后一个字段移到行的开头?@AlexPoole我想我有这个选择。还向我的老板抱怨,看看供应商是否能解决这个问题。老实说,我不想在这件事上经历很多不同的步骤,我开始觉得我最好还是自己动手(即使我知道这是个错误)。最需要确认的是,我所要求的是不可能的。假设最大效率不是主要考虑的问题,我会尝试将数据加载到单个
varchar2(4000)
(或者32000,如果您在12.1上使用超长字符串),然后编写您自己的解析逻辑(即,第6个逗号右边的所有内容都是您要查找的字段)。请显示一些好的和坏的记录示例,以便我们可以看到数据的复杂性。第一步是依靠供应商提供已删除的数据。也就是说,我必须处理相同的废话:-/可能将整行读取到BOUNDFILLER中,然后使用REGEXP_SUBSTR()进行解析如果数据不太复杂或性能不是问题,则调用。我基本上是在重复Alex和Justin所说的,但这不是不可能的,只是解析数据中的模式很痛苦,当您不相信它会在正确的位置时,不必使用分隔符。请在最后一个字段中显示该日期数据的格式。
SQL> select col1
     from x_test;

COL1
---------
28-JUL-68
22-NOV-69
28-FEB-66

SQL>