删除EOL分隔符以插入外部表-oracle

时间:2016-08-30 08:26:11

标签: oracle file end-of-line external-tables

我已将 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

1 个答案:

答案 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       >