1

アレックスの提案として、外部テーブルのrowdata列のnotrimを含めました(これは この質問の続きです)、

しかし、現在、行末文字も行データ列に追加されています。つまり、行末 (CR-LF) も行データの最後に結合されています。

ファイルサイズが約1GBなので、 substr() や translate() は使いたくありません。

私の外部テーブル作成プロセス:

'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:

私のファイル:

末尾にスペースがある最初の行のいくつかは、末尾にスペースが
あるいくつかの 2 行目

私のExtテーブル:

Some first line with spaces at end    <EOL>
Some second line with spaces at end   <EOL>

より明確にするために、Javaで説明します(列の値を string に割り当てると、次のようになります)、

notrim なし:

rowdata[1]="Some first line with spaces at end";
rowdata[2]="Some second line with spaces at end";

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   ";

トリムが指定されていないため、区切り文字も行データの一部です。

EDIT2:

行末: CRLF

プラットホーム :

Oracle データベース 12c Enterprise Edition リリース 12.1.0.1.0 - 64 ビット

本番 PL/SQL リリース 12.1.0.1.0 - 本番

「CORE 12.1.0.1.0 Production」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,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, 20,20,20,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,日

Len は 615 である必要があります

4

1 に答える 1

3

ファイルの行末は CRLF ですが (ファイルが Windows で作成されていることを示唆していますか?)、データベースは Solaris で実行されています。ドキュメントが言うように:

DELIMITED BY NEWLINE が指定されている場合、使用される実際の値はプラットフォーム固有です。UNIX プラットフォームでは、NEWLINE は「\n」と見なされます。Windows オペレーティング システムでは、NEWLINE は "\r\n" と見なされます。

データベース プラットフォームが Unix であるため\n、レコード区切り文字として LF ( ) のみを使用しています。ファイルの区切り文字を変更するか、terminated by句を変更して Windows の行末を探すことができます。

,,,
records delimited by "\r\n" nobadfile ...

いずれかのタイプの行末を持つファイルを取得する可能性があり、それを制御できない場合は、プリプロセッサ ステップを追加して、存在する行末を取り除くことができます。ファイルと同じディレクトリ、または(Oracleが推奨するように)Oracleがアクセス可能な別のディレクトリに実行可能スクリプト・ファイルを作成する場合、次のremove_cr内容を含む「called」とします:

/usr/bin/sed -e "s/\\r$//" $1

外部テーブル定義に呼び出しを追加し、newlineテミネーターを保持できます。

...
records delimited by newline nobadfile nodiscardfile
preprocessor 'remove_cr'
...

ただし、ドキュメントのセキュリティ警告を必ずお読みください。

temp.txtCRLF 行末を持つファイルのデモ:

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       >                                                          
于 2016-08-30T09:51:49.727 に答える