我已将 notrim 包含在外部表格中的 rowdata 列中,作为Alex的建议(这是this问题的延续,)
但现在End of Line字符也附加在rowdata列,我的意思是,行尾(CR-LF)也在rowdata的末尾加入。
我不想使用substr()或translate(),因为文件大小约为1GB,
我的外部表创建过程:
'CREATE TABLE ' || rec.ext_table_name || ' (ROW_DATA VARCHAR2(4000)) ORGANIZATION EXTERNAL ' ||
'(TYPE ORACLE_LOADER DEFAULT DIRECTORY ' || rec.dir_name || ' ACCESS ' || 'PARAMETERS (RECORDS ' ||
'DELIMITED by NEWLINE NOBADFILE NODISCARDFILE ' ||
'FIELDS REJECT ROWS WITH ALL NULL FIELDS (ROW_DATA POSITION(1:4000) char)) LOCATION (' || l_quote ||
'temp.txt' || l_quote || ')) REJECT LIMIT UNLIMITED'
是否可以添加任何其他参数,以删除行尾字符。感谢。
编辑1:
我的档案:
在末尾有一些空格的第一行 一些第二行,末尾有空格
我的Ext表:
Some first line with spaces at end <EOL> Some second line with spaces at end <EOL>
更清楚,我将在java中解释(当我将列值赋给字符串时,它就像下面这样),
没有notrim:
rowdata[1]="Some first line with spaces at end";
rowdata[2]="Some second line with spaces at end";
with notrim:
rowdata[1]="Some first line with spaces at end \n";
rowdata[2]="Some second line with spaces at end \n";
我想要的是:
rowdata[1]="Some first line with spaces at end ";
rowdata[2]="Some second line with spaces at end ";
分隔符也是rowdata的一部分,因为没有指定修剪。
EDIT2:
行结尾:CRLF
平台:
Oracle Database 12c企业版12.1.0.1.0版 - 64位
生产PL / SQL版本12.1.0.1.0 - 生产
“CORE 12.1.0.1.0生产”TNS for Solaris :版本12.1.0.1.0 -
生产NLSRTL版本12.1.0.1.0 - 生产
SELECT DUMP(ROW_DATA,1016)FROM EXT_TABLE WHERE ROWNUM = 1;
Typ = 1 Len = 616 CharacterSet = AL32UTF8: 41,30,30,30,30,30,30,30,30,30,30,31,30,30,30,30,37,36,36,36,44,30,30,30,30, 31,32,35,30,38,31,36,32,35,30,38,31,36,31,33,34,37,30,39,44,42,20,41,30,36, 31,30,30,30,30,30,30,30,30,30,30,30,30,32,30,30,4d,59,52,20,32,5a,20,30,31, 36,30,30,30,31,32,31,32,33,34,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, 30,52,49,42,46,50,58,30,30,30,31,30,30,30,30,30,30,30,30,31,30,36,32,38,30, 31,30,32,30,30,47,20,20,20,20,53,20,20,30,30,30,30,30,30,30,30,30,30,30,20, 20,20,20,20,20,20,4e,39,32,37,32,20,20,20,20,20,20,30,30,30,30,30,20,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,30,30,39,39,38,54,45,53,54,52,52,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,54,45,53, 54,4f,50,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,54,45,53,54,54,52,41,4e, 53,49,44,20,20,20,20,20,2 0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,54,45,53,54,52,52,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,54,45,53, 54,4f,50,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,54,45,53,54,54,52,41,4e, 53,49,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 20,20,20,20,20,20,20,d
Len应为615
答案 0 :(得分:1)
您的文件行结尾是CRLF(建议在Windows中创建文件?),但您的数据库在Solaris上运行。正如the documentation所说:
如果指定了DELIMITED BY NEWLINE,则使用的实际值是特定于平台的。在UNIX平台上,NEWLINE被假定为“\ n”。在Windows操作系统上,NEWLINE被假定为“\ r \ n”。
由于您的数据库平台是Unix,因此只使用LF(\n
)作为记录分隔符。您可以更改文件中的分隔符,也可以更改terminated by
子句以查找Windows行结尾:
,,,
records delimited by "\r\n" nobadfile ...
如果您可能获得任何类型的行结尾但无法控制的文件,您可以添加preprocessor step来删除任何存在的文件。如果您创建一个可执行脚本文件,可以在与该文件相同的目录中,或者(如Oracle建议的那样)在另一个可访问Oracle的目录中,例如名为remove_cr
,其中包含:
/usr/bin/sed -e "s/\\r$//" $1
你可以在外部表定义中添加对它的调用,并保留newline
temrinator:
...
records delimited by newline nobadfile nodiscardfile
preprocessor 'remove_cr'
...
请务必阅读文档中的安全警告。
使用带有CRLF行结尾的temp.txt
文件进行演示:
create table t42_ext (
row_data varchar2(4000)
)
organization external
(
type oracle_loader default directory d42 access parameters
(
records delimited by newline nobadfile nodiscardfile
preprocessor 'remove_cr'
fields reject rows with all null fields
(
row_data position(1:4000) char notrim
)
)
location ('temp.txt')
)
reject limit unlimited;
select '<'|| row_data ||'>' from t42_ext;
'<'||ROW_DATA||'>'
--------------------------------------------------------------------------------
<Line1sometext >
<Line2sometext >
<Line3sometext >