我需要使用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);
由于我必须检查多个不同的标题,我不能完全这样做。
我似乎无法弄清楚这个额外字节来自检索行的位置。
答案 0 :(得分:3)
您可以使用the dump()
function显示字符串中每个字符的数字表示形式,十进制或十六进制,以便您可以看到不可打印的字符:
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>
删除它,或者 - 正如您自己发现的那样 - 删除正则表达式。
...
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