Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 显示按分隔符拆分的文件内容_Regex_Oracle_Plsql_Bfile - Fatal编程技术网

Regex 显示按分隔符拆分的文件内容

Regex 显示按分隔符拆分的文件内容,regex,oracle,plsql,bfile,Regex,Oracle,Plsql,Bfile,我试图显示一个文件的内容,用分隔符分隔。 更确切地说,从开始,我尝试将结果显示为: bbb aaa qqq ccc 但是要从文件中获取的数据源 直到现在,我一直在尝试: DECLARE l_bfile bfile; BEGIN l_bfile := bfilename(my_dir, my_file); dbms_lob.fileopen(l_bfile); FOR i IN (SELECT TRIM(regexp_substr(TO_CHAR(

我试图显示一个文件的内容,用分隔符分隔。 更确切地说,从开始,我尝试将结果显示为:

bbb
aaa
qqq
ccc

但是要从文件中获取的数据源

直到现在,我一直在尝试:

DECLARE
    l_bfile bfile;
BEGIN
    l_bfile := bfilename(my_dir, my_file);
    dbms_lob.fileopen(l_bfile);

    FOR i IN
        (SELECT TRIM(regexp_substr(TO_CHAR(l_bfile),'[^;]+',1,level) ) AS q
         FROM dual
         CONNECT BY regexp_substr(TO_CHAR(l_bfile),'[^;]+',1,level) IS NOT NULL
         ORDER BY level
        )
    LOOP
        dbms_output.put_line(i.q);
    END LOOP;

EXCEPTION
WHEN No_Data_Found THEN
    NULL;
END; 
结果,我得到了

PL/SQL:ORA-00932:不一致的数据类型:获取文件的预期数量


有人能给我一个提示吗?

如果您的文件包含一行,您可以尝试此操作(因此出现了关于文件结构的问题):


如果您的文件包含单行,您可以尝试此操作(因此出现了关于文件结构的问题):


必须将此作为一个新答案来写,因为对于@SmartDumb:

请注意,如果在列表中找到空元素,则格式为“
”[^;]+'
(通常用于解析分隔列表)的正则表达式将失败。有关更多信息,请参阅本文:

相反,请使用这种形式的对regexp_substr的调用(注意,我删除了第二个元素):

在本例中,它可能重要,也可能不重要,这取决于字符串中元素的顺序对您是否重要,或者您是否需要保留NULL。i、 e.如果您需要知道第二个元素为NULL,那么这将起作用


另外,搜索外部表,看看这是否是您可以使用的解决方案。这将使您可以像查询表一样查询文件。

必须将其作为新答案写入,因为这对于@SmartDumb:

请注意,如果在列表中找到空元素,则格式为“
”[^;]+'
(通常用于解析分隔列表)的正则表达式将失败。有关更多信息,请参阅本文:

相反,请使用这种形式的对regexp_substr的调用(注意,我删除了第二个元素):

在本例中,它可能重要,也可能不重要,这取决于字符串中元素的顺序对您是否重要,或者您是否需要保留NULL。i、 e.如果您需要知道第二个元素为NULL,那么这将起作用


另外,搜索外部表,看看这是否是您可以使用的解决方案。这将使您可以像查询表一样查询文件。

我注意到的第一件事是,在使用bfilename时,缺少引号。看这里。oracle文档中的示例(注意引号):
BFILENAME('MEDIA\u DIR'、'modem\u comp\u ad.gif')
没错,我尝试使用变量,但对于文件名,我也保留了扩展名。我更正了。你的文件有什么结构吗?你能发布文件内容吗?你的代码对我来说似乎很好(我在Oracle 12.2中测试过)。我刚刚将
my_dir
my_file
定义为分配正确值的变量。@SmartDumb:该文件应包含“bbb;aaa;qqq;我注意到的第一件事是,当你使用bfilename时,引号丢失了。看这里。oracle文档中的示例(注意引号):
BFILENAME('MEDIA\u DIR'、'modem\u comp\u ad.gif')
没错,我尝试使用变量,但对于文件名,我也保留了扩展名。我更正了。你的文件有什么结构吗?你能发布文件内容吗?你的代码对我来说似乎很好(我在Oracle 12.2中测试过)。我刚刚将
my_dir
my_file
定义为分配正确值的变量。@SmartDumb:该文件应包含“bbb;aaa;qqq;ccc'该文件可能包含1行或n行,但无论如何可以通过循环完成。该文件可能包含1行或n行,但无论如何可以通过循环完成。
DECLARE

utlFileHandle  UTL_FILE.FILE_TYPE;
vLine varchar2(100);

BEGIN

utlFileHande := UTL_FILE.FOPEN(my_dir, my_file, 'r');
utl_file.get_line(utlFileHande, vLine);

FOR i IN
    (SELECT TRIM(regexp_substr(vLine,'[^;]+',1,level) ) AS q
     FROM dual
     CONNECT BY regexp_substr(vLine,'[^;]+',1,level) IS NOT NULL
     ORDER BY level
    )
LOOP
    dbms_output.put_line(i.q);
END LOOP;

utl_file.fclose(utlFileHande);

EXCEPTION
WHEN No_Data_Found THEN
   utl_file.fclose(utlFileHande);
   null;
END; 
SELECT TRIM(regexp_substr('bbb;;qqq;ccc','(.*?)(;|$)',1,level, null, 1) ) AS q
     FROM dual
     CONNECT BY regexp_substr('bbb;;qqq;ccc','(.*?)(;|$)',1,level) IS NOT NULL
     ORDER BY level