oracle 双引号替换,oracle - Oracle SQL-Loader在值中有效地处理内部双引号 - SO中文参考 - www.soinside.com...

如果您在封闭的字段中没有管道,则可以从控制文件中执行此操作。如果你可以在一个字段中同时拥有管道和双引号,那么我认为你别无选择,只能对这些文件进行预处理。

你的解决方案[1],取代双引号with an SQL operator,发生得太晚,无法发挥作用;在执行SQL步骤之前,SQL * Loader已经解释了分隔符和附件。您的解决方案[2],忽略外壳,将与[1]结合使用 - 直到其中一个字段确实包含管道字符。并且解决方案[3]具有与全局使用[1]和/或[2]相同的问题。

有时,作为分隔符的标点符号也必须包含在数据中。为了实现这一点,两个相邻的分隔符字符被解释为字符的单个匹配项,并且该字符包含在数据中。

换句话说,如果您在字段内重复双引号,那么它们将被转义并显示在表数据中。由于无法控制数据生成,因此您可以预处理文件,以使用转义双引号替换所有双引号。除非您不想替换所有这些 - 实际上真正的外壳不应该被转义。

您可以使用正则表达式来定位相关字符将跳过其他人。不是我强大的领域,但我认为你可以用lookahead and lookbehind assertions做到这一点。

如果你有一个名为orig.txt的文件,其中包含:

"1"|A|"B"|"C|D"

"2"|A|"B"|"C"D"

3|A|""B""|"C|D"

4|A|"B"|"C"D|E"F"G|H""

你可以这样做:

perl -pe 's/(? new.txt

这会查找一个双引号,它不在行开始锚点或管道符号之前;并且后面没有管道字符或行尾锚点;并且只替换那些带有转义(加倍)双引号的人。这将使new.txt包含:

"1"|A|"B"|"C|D"

"2"|A|"B"|"C""D"

3|A|"""B"""|"C|D"

4|A|"B"|"C""D|E""F""G|H"""

字段开头和结尾的双引号不会被修改,但中间的双引号现在被转义。如果您随后使用带有双引号机箱的控制文件加载了该文件:

load data

truncate

into table t42

fields terminated by '|' optionally enclosed by '"'

(

col1,

col2,

col3,

col4

)

然后你最终得到:

select * from t42 order by col1;

COL1 COL2 COL3 COL4

---------- ---------- ---------- --------------------

1 A B C|D

2 A B C"D

3 A "B" C|D

3 A B C"D|E"F"G|H"

希望与原始数据匹配。可能存在不起作用的边缘情况(如双引号后跟字段中的管道)但是对于尝试解释其他人的数据可以做什么是有限制的...可能还有(很多)当然,更好的正则表达模式。

如果数据文件是(或可以)在Oracle目录中并且您具有正确的权限,您还可以考虑使用an external table而不是SQL * Loader。您仍然需要修改该文件,但您可以使用preprocessor指令自动执行该操作,而不是在调用SQL * Loader之前需要显式执行此操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值