bon*_*svr 4 oracle oracle11gr2 sql-loader
我正在通过 SQLLDR 将一些数据加载到 Oracle。源文件是“管道分隔”。
FIELDS TERMINATED BY '|'
Run Code Online (Sandbox Code Playgroud)
但有些记录的数据中包含管道字符,而不是作为分隔符。因此,它破坏了记录的正确加载,因为它将indata管道字符理解为字段终止符。
你能给我指出解决这个问题的方向吗?
数据文件约9GB,手动编辑比较困难。
例如,
加载行:
ABC|1234567|STR 9 R 25|98734959,32|2011年12月28日
拒绝行:
DE4|2346543|WE| 454|956584,84|2011年11月28日
错误:
Rejected - Error on table HSX, column DATE_N.
ORA-01847: day of month must be between 1 and last day of month
Run Code Online (Sandbox Code Playgroud)
DATE_N 列是最后一列。
您不能使用任何分隔符,并执行以下操作:
field FILLER,
col1 EXPRESSION "REGEXP_REPLACE(:field,'^([^|]*)\\|([^|]*)\\|(.*)\\|([^|]*)\\|([^|]*)\\|([^|]*)$', '\\1')",
col2 EXPRESSION "REGEXP_REPLACE(:field,'^([^|]*)\\|([^|]*)\\|(.*)\\|([^|]*)\\|([^|]*)\\|([^|]*)$', '\\2')",
col3 EXPRESSION "REGEXP_REPLACE(:field,'^([^|]*)\\|([^|]*)\\|(.*)\\|([^|]*)\\|([^|]*)\\|([^|]*)$', '\\3')",
col4 EXPRESSION "REGEXP_REPLACE(:field,'^([^|]*)\\|([^|]*)\\|(.*)\\|([^|]*)\\|([^|]*)\\|([^|]*)$', '\\4')",
col5 EXPRESSION "REGEXP_REPLACE(:field,'^([^|]*)\\|([^|]*)\\|(.*)\\|([^|]*)\\|([^|]*)\\|([^|]*)$', '\\5')",
col6 EXPRESSION "REGEXP_REPLACE(:field,'^([^|]*)\\|([^|]*)\\|(.*)\\|([^|]*)\\|([^|]*)\\|([^|]*)$', '\\6')"
Run Code Online (Sandbox Code Playgroud)
这个正则表达式需要六个捕获组(括号内),并用竖线分隔(我必须转义它,因为否则它在正则表达式中意味着 OR)。除第三组之外的所有组都不能包含竖线 ( [^|]*),第三组可以包含任何内容 ( .*),并且正则表达式必须从行首跨越到行尾 (^和$)。
这样我们就可以确定第三组会吃掉所有多余的分隔符。这只有效,因为您只有一个可能包含分隔符的字段。如果您想进行校对,您可以指定第四组以数字开头(包括\d在第四个括号块的开头)。
我将所有反斜杠加倍,因为我们位于双引号表达式内,但我不太确定我应该这样做。