Sqlldr-在终止和封闭字段后找不到终结符

时间:2015-07-16 18:55:53

标签: oracle oracle11g sql-loader

我使用的是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”一边到另一边,@

如何做到这一点?

2 个答案:

答案 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引用其中一种方式,以便数据按预期加载。