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 的值长一个字节。我试过修剪它,什么都不做,末端没有空格。

如果我强制使用最大行大小,它会起作用。

例如。

UTL_FILE.get_line(file_handle, buffer, 20);

由于我必须检查多个不同的标题,我不能完全这样做。

我似乎无法弄清楚这个额外的字节是从哪里来的。

4

1 回答 1

3

您可以使用dump()函数以十进制或十六进制显示字符串中每个字符的数字表示,这样您就可以看到不可打印的字符:

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(十进制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>, or 删除它 - 正如您自己发现的那样 - 正则表达式。

...
    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 回答