2013-02-18 97 views
0

我需要檢查使用UTL_FILEUTL_FILE.get_line返回額外的字節ORACLE

我需要在標題行與數據庫中的值進行比較的.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的值長一個字節。我試過修剪它,什麼都不做,兩端沒有空白。

如果我強制工作的最大線路大小。

例如。

UTL_FILE.get_line(file_handle, buffer, 20); 

由於我必須檢查多個不同的標題,我不能完全做到這一點。

我似乎不知道這個額外的字節來自檢索行。

+0

您可以['dump'(http://docs.oracle.com/cd/E11882_01/server.112/e10592/functions055.htm)值,看看它們之間的區別;如果沒有明顯的區別,則很有用。我猜想有一個換行符 - 例如如果該文件是在Windows中創建的。投機雖然很清楚。如果有,那麼你可以用'替換'來剝離它;一個簡單的「trim」不會尋找你擁有的任何角色。 – 2013-02-18 23:37:03

+0

我不是一個大的oracle人,我將如何轉儲值來查看差異。我已經印刷了它們,沒有明顯的差異,並且肯定沒有前導或尾隨空格,不管有沒有被掩蓋。 – user2026989 2013-02-18 23:54:36

+0

這實際上就像一個魅力: – user2026989 2013-02-19 00:07:14

回答

3

您可以使用the dump() function來顯示字符串中的每個字符的數字表示,十進制或十六進制,所以你可以看到非打印字符:

select dump(<some string>) from dual; 

你不能直接調用dumpdbms_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(十進制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