通过 Oracle Loader 外部表加载字段值中带双引号的 CSV 文件

问题描述 投票:0回答:1

请求您在以下方面提供帮助和专业知识:

UNIX 服务器上的 Oracle DB 19c

要求: CSV 文件每天都会进入 Unix 目录(数据库所在的位置)并加载到数据库表中。记录终止符是 LF (Unix)。 CSV 文件的字符串中可以包含换行符 (LF),也可以包含特殊字符。如果字段中嵌入了逗号,则它们会用双引号引起来。跳过标题行。跳过加载包含所有空字段的行。所需的输出是获取此示例 CSV 文件中加载的所有记录。现实世界中的所有这些 CSV 文件在附加到主表之前都会通过外部表读取。

CSV 文件(dummy_test_file.csv):

EMP_ID,EMP_DEPT,EMP_NAME,EMP_SAL,EMP_COMMENTS
101,Accounting,John Doe,78000,None
MM202,Finance,Jack N Doe,80000,"PTO, OOO"
303,Finance,"Dunham, Melissa",98000,N/A µóíé ``é
404,Info Tech,O'Connor A.,,
Z505,""Infra Services,Joe Miller,67000,,Infra
606,""R&D"" Info. Sec - Commercial,Jack Miller,68000,""
707,""Accounting & Offices"",M'ria Flo,55000,20-PPES
808,"- State S7 -20 - 24
- state S3 ,//- 29 - 32
- INC - 49 - 56 (14.004% inic)
- SD",Scala F. Mora,88000,Static
909,",",Nem Rogers,66500,Cambridge - MA
,,,,

1101,,,,""1""
AX2202,Finance,Meryl Jane,110000,STEM &^%$#@!~()_+-=|:"<>?{}[]\;'./`~Pro - D.

我的尝试: 我使用了 ORACLE_LOADER 外部表,并使用了 FIELDS CSV WITH EMBEDDED 选项。它非常适合加载带有特殊字符的值,并且还可以处理字段中的嵌入换行符(如果有)。但是...

问题: 它无法加载某些场景的数据,如下所述,在我运行 select 语句后生成的 BAD 文件中。

错误文件:

Z505,""Infra Services,Joe Miller,67000,,Infra
606,""R&D"" Info. Sec - Commercial,Jack Miller,68000,""
707,""Accounting & Offices"",M'ria Flo,55000,20-PPES
1101,,,,""1""

脚本:

CREATE TABLE EXT_OL_DUMMY_CSV_LOAD
(
  EMP_ID        VARCHAR2(10 BYTE),
  EMP_DEPT      VARCHAR2(200 BYTE),
  EMP_NAME      VARCHAR2(50 BYTE),
  EMP_SAL       NUMBER,
  EMP_COMMENTS  VARCHAR2(4000 BYTE)
)
ORGANIZATION EXTERNAL
  (  TYPE ORACLE_LOADER
     DEFAULT DIRECTORY MY_FILES_DIR
     ACCESS PARAMETERS 
       ( 
         RECORDS DELIMITED BY NEWLINE
                          BADFILE 'dummy_test_file.bad'
                          LOGFILE 'dummy_test_file.log'
                          SKIP 1
                          FIELDS CSV WITH EMBEDDED
                              NOTRIM
                              MISSING FIELD VALUES ARE NULL
                              REJECT ROWS WITH ALL NULL FIELDS
       )
     LOCATION ( MY_FILES_DIR:'dummy_test_file.csv' )
  )
REJECT LIMIT UNLIMITED
PARALLEL 5
/

SELECT * FROM EXT_OL_DUMMY_CSV_LOAD;

当前输出: - 未加载所有记录

Current Output

询问

有什么想法可以如何利用 Oracle Loader 的功能加载所有这些记录,而不使用预处理器?也欢迎任何其他想法,前提是它不能用 Oracle_Loader 处理。值得一提的是,我还可以访问 Oracle APEX 软件包(如果这些软件包对解决此问题有任何帮助)。预先感谢任何提供帮助的人。 :)

sql oracle csv plsql oracle-apex
1个回答
0
投票

我不熟悉 Oracle Loader,因此这里有一个使用 apex 包来执行此操作的选项。以下是如何使用错误文件的内容解析 CLOB:

SELECT
  col001, col002, col003, col004, col005
FROM   TABLE(
         APEX_DATA_PARSER.parse(
           p_content         => apex_util.clob_to_blob(
    p_clob => q'!Z505,""Infra Services,Joe Miller,67000,,Infra
606,""R&D"" Info. Sec - Commercial,Jack Miller,68000,""
707,""Accounting & Offices"",M'ria Flo,55000,20-PPES
1101,,,,""1""!',
    p_charset => 'AL32UTF8' )
,
           p_file_name       => 'emp.csv' /*to get the file type*/
          ,p_skip_rows       => 1 /*default 0*/
          ,p_csv_col_delimiter => ','
         )
       );
       select * from dual

enter image description here

有几个关于它的博客应该很容易找到,并且docs显示了所有可以使用的参数。

© www.soinside.com 2019 - 2024. All rights reserved.