0

UTL_FILE を使用して .csv ファイルのヘッダーを確認する必要があります

ヘッダー行をデータベースの値と比較する必要があります。

UTL_FILE.get_line(file_handle, buffer);

例えば。

 dbms_output.put_line( length(buffer_db)); 20
 dbms_output.put_line( length(buffer)); 21

csv の varchar の長さは、db の値よりも 1 バイト長くなります。私はそれをトリミングしようとしましたが、何もしません。端に空白はありません。

最大行サイズを強制すると機能します。

例えば。

UTL_FILE.get_line(file_handle, buffer, 20);

複数の異なるヘッダーをチェックする必要があるため、正確に行うことはできません。

この余分なバイトが検索された行のどこから来ているのかわかりません。

4

1 に答える 1

3

この関数を使用してdump()、文字列内の各文字の数値表現を10進数または16進数で表示できるため、印刷できない文字を確認できます。

select dump(<some string>) from dual;

dump呼び出し内で直接呼び出すことはできませんdbms_output。SQLステートメント(PLS-00204)でのみ使用できますが、別の変数に割り当てて、次のように表示することはできます。

declare
    ...
    buffer_dump varchar2(4000);
begin
    ...
    utl_file.get_line(file_handle, buffer);
    select dump(buffer) into buffer_dump from dual;
    dbms_output.put_line(buffer_dump);
    ...

CSVファイルを扱っているので、Windowsスタイルのラインターミネーター(CRLF)がありget_line()、結果にキャリッジリターンが含まれていると推測するのが妥当かもしれません。これは、最後の余分な文字で示されます。13(10進ASCII)で表されます。

declare
    buffer varchar2(4000);
    buffer_dump varchar2(4000);
begin
    buffer := 'Field1,Field2^M'; -- terminated with \r
    select dump(buffer) into buffer_dump from dual;
    dbms_output.put_line(buffer_dump);
end;
/

Typ=1 Len=14: 70,105,101,108,100,49,44,70,105,101,108,100,50,13

その場合は、、、、または-自分で見つけたように-正規表現を使用して削除できreplace(<string>, chr(13), '')ますtrim(trailing chr(13) from <string>

...
    buffer := trim(trailing chr(13) from buffer);
    select dump(buffer) into buffer_dump from dual;
    dbms_output.put_line(buffer_dump);
...

Typ=1 Len=13: 70,105,101,108,100,49,44,70,105,101,108,100,50
于 2013-02-19T00:25:23.460 に答える