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

Sqlldr- No terminator found after terminated and enclosed field

我使用 Oracle 11g。
我的数据文件如下所示:

1|"\a\ab\"|"do not "清洁"针头"|"@"

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 文件包含错误消息 "No terminator found after terminated and enclosed field"

双引号开始和结束不在我的数据中,但是我需要像上面示例中围绕 clean 和 69 的数据一样使用双引号。例如:加载后我的数据文件应该如下所示:

1,\a\ab\,不要"clean"针,@

2,\b\bg\,墙“69”边到尾,@

如何实现?

恐怕由于字段被双引号包围,您想要保留的双引号需要通过在前面添加另一个双引号来转义,如下所示:

1|"\a\ab\"|"do not ""clean"" needles"|"@"

或者,如果您可以在字段不被双引号括起来的情况下获取数据,这也可行:

1|\a\ab\|do not "clean" needles|@

如果您无法让数据提供者根据需要格式化数据(即在提取到文件之前搜索双引号并替换为 2 个双引号),您将不得不预处理文件以其中一种方式设置双引号,以便数据按预期加载。

要求您的提供者更正数据文件可能不是一个选项,但我最终找到了一个解决方案,要求您稍微更新控制文件以指定每个字段而不是所有字段的 "enclosed by" 字符字段。

对于我的情况,我遇到了一个问题,如果 [first_name] 字段以双引号括起昵称,它将不会加载。 (例如:乔纳森 "Jon")。在数据文件中,名称显示为“Jonathon "Jon"”。所以 "enclosed by" 抛出错误,因为值周围有双引号,部分值周围有双引号 ("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 '"'
)