在oracle中使用utl_file上载过程处理头文件

时间:2018-01-08 11:44:21

标签: oracle csv plsql utl-file

我正在尝试使用UTL_FILE将带有标题的csv文件上传到表中,但我遇到了一个问题。使用utl_file进行正常上传时,还会包含标题,并将数据结果记录在双引号中(我不需要)。如果我使用if条件排除标题,如下面的代码和声明标题变量,它会上传没有标题的记录,但仍然是双引号。当我从csv文件手动删除标题时,它上传没有引号。但是每天都会新创建csv,因此无法从文件中删除标题。

请建议一些与目标表和csv之间的标题匹配的解决方案,然后上传csv文件数据。以下是我的程序。

create or replace procedure load_file_new(p_FileDir in varchar2, p_FileName in varchar2)
as
    v_FileHandle utl_file.file_type;
    v_NewLine varchar2(2000);
    v_a varchar2(100);
    v_b varchar2(100);
    v_c varchar2(100);
    v_d varchar2(100);

    p_ignore_headerlines number;

begin
    v_FileHandle := utl_file.fopen(p_FileDir, p_FileName, 'r', 32767);

    p_ignore_headerlines := 1;

    if p_ignore_headerlines > 0
    then
        begin
            for i in 1 .. p_ignore_headerlines
            loop
                utl_file.get_line(v_FileHandle, v_NewLine);
            end loop;
        end;
    end if;

    loop
        begin
            utl_file.get_line(v_FileHandle, v_NewLine);
        exception
            when no_data_found then
                exit;
        end;

        v_a := regexp_substr(v_NewLine, '("[^"]*"|[^,]+)', 1, 1);
        v_b := regexp_substr(v_NewLine, '("[^"]*"|[^,]+)', 1, 2);
        v_c := regexp_substr(v_NewLine, '("[^"]*"|[^,]+)', 1, 3);
        v_d := regexp_substr(v_NewLine, '("[^"]*"|[^,]+)', 1, 4);

        merge into test using dual on (a = v_a)
            when not matched then insert (a, b, c, d)
                 values (v_a, v_b, v_c, v_d)
            when matched then update set
                 b = v_b, c = v_c, d = v_d where a = v_a;

    end loop;

    utl_file.fclose(v_FileHandle);
    commit;
end load_file_new;

0 个答案:

没有答案