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 '"'
)
我使用 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 '"'
)