我使用的是Oracle 11g 我的数据文件如下所示:
1 |“\ a \ ab \”|“不要”清除“针”|“@”
2 |“\ b \ bg \”|“wall”69“一对一”|“@”
我的控制文件是:
load data
infile 'short.txt'
CONTINUEIF LAST <> '"'
into table "PORTAL"."US_FULL"
fields terminated by "|" OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
u_hlevel,
u_fullname NULLIF u_fullname=BLANKS,
u_name char(2000) NULLIF c_name=BLANKS ,
u_no NULLIF u_no=BLANKS
)
通过sqlldr加载数据时,会创建一个.bad文件,而.log文件包含错误消息,指出“在终止和封闭的字段后找不到终结符”
双引号的开头和结尾都不在我的数据中,但是我需要双引号,如上面的示例所示,包括clean和69.例如:加载后我的数据文件应该如下所示:
1,\ a \ ab \,不要“清理”针头,@
2,\ b \ bg \,墙“69”一边到另一边,@
如何做到这一点?
答案 0 :(得分:1)
要求您的提供商更正数据文件可能不是一个选项,但我最终找到了一个解决方案,要求您稍微更新您的控制文件,以指定每个字段的“括号”字符,而不是所有字段。 / p>
对于我的情况,我有一个问题,如果[first_name]字段带有双引号包装昵称,它将无法加载。 (EG:Jonathon“Jon”)。在数据文件中,名称显示为“Jonathon”Jon“”。所以“封闭的”是抛出错误,因为值周围有双引号,而值的一部分(“Jon”)附近有双引号。因此,我没有指定该值应该用双引号括起来,而是省略了它,只是手动删除了字符串中的引号。
Load Data
APPEND
INTO TABLE MyDataTable
fields terminated by "," ---- Noticed i omitted the "enclosed by"
TRAILING NULLCOLS
(
column1 enclosed by '"', --- Specified "enclosed by" here for all cols
column2 enclosed by '"',
FIRST_NAME "replace(substr(:FIRST_NAME,2, length(:FIRST_NAME)-2), chr(34) || chr(34), chr(34))", -- Omitted "enclosed by". substr removes doublequotes, replace fixes double quotes showing up twice. chr(34) is charcode for doublequote
column4 enclosed by '"',
column5 enclosed by '"'
)
答案 1 :(得分:0)
我担心因为字段被双引号包围,所以要保留的双引号需要通过在前面添加另一个双引号来转义:
1|"\a\ab\"|"do not ""clean"" needles"|"@"
或者,如果您可以在没有字段被双引号括起的情况下获取数据,这也可以使用:
1|\a\ab\|do not "clean" needles|@
如果您无法让数据提供程序根据需要格式化数据(例如,在解压缩到文件之前搜索双引号并用2个双引号替换),则必须预先处理该文件以进行设置up double引用其中一种方式,以便数据按预期加载。