0

很难解析包含似乎已在源系统中随机加载的列数据的 CSV 文件:

我的输入是一个包含 88 列的 CSV 文件,我需要将它加载到一个 oracle 表中。SQL 加载器会抛出错误的行(几乎是文件中的所有内容),因此这不是一个选项。我决定在 PL/SQL 过程中使用 UTL_FILE,这将使我能够灵活地解析每一行并将数据拆分为列。

CSV 中的模拟记录如下所示,第 5 个 COl 和第 7 个 COL 很难处理:

记录 1:PS-ASXGBDFEG,aOA2000x29,NULL,NULL,"899245, 892345",NULL,4-7-12:收到的发货前报告 NKGWT00065104 的密钥代码为 8269353,AQL 缺陷级别为 1/0 严重,17/10 主要和 24/14 Minor found.,23/11/2011 12:00:00 AM

记录 2:PS-ASXGANBAG,aOA2000x39,NULL,NULL,898245",NULL,22-11--11:装运前检验报告 Intertek SHIJ25252253 的关键代码 8241233。AQL 级别:0/0 关键,16/10 主要和 4/ 14 个小缺陷。由于工艺不良和螺柱未对齐,装运前报告失败。制造质量故障是一个问题;这必须随着未来的生产而改进。尺寸超出公差的这批货物在商业上是可以接受的。所有有缺陷的服装必须从散装中取出或修理。政府文件批准印刷的澳大利亚国旗和“进口许可”?Judy,2011 年 11 月 23 日上午 12:00:00

记录 3:PS-ASXGNDBAG,aOA2000x42,NULL,NULL,“7771965(黑色),7771958(白色)”,NULL,NULL,NULL

记录 4: PS-ASXGLPBAG,aOA2000x80,NULL,NULL,8272700/E,NULL,NULL,NULL

我使用了基本解析(显然失败得很惨)

    F := UTL_FILE.FOPEN ('FILE_DIR', 'QAProductSpecs.csv', 'R',32767);

    IF UTL_FILE.IS_OPEN(F) THEN
    LOOP

    UTL_FILE.GET_LINE(F, V_LINE, 10000);

    V_LENGTH := (INSTR(V_LINE, ',', 1, 1));
    PRODUCT_SPEC_ID := SUBSTR(V_LINE,1,V_LENGTH-1);

    --CHOP OUT PRODUCT_SPEC_ID column from the CURRENT ROW
    V_LINE  := SUBSTR(V_LINE,V_LENGTH+1);

    V_LENGTH := (INSTR(V_LINE, ',', 1, 1));
    PRODUCT_SPEC_ID2 := SUBSTR(V_LINE, 1, V_LENGTH-1);

   --CHOP OUT PRODUCT_SPEC_ID2 column from the CURRENT ROW
    V_LINE  := SUBSTR(V_LINE,V_LENGTH+1);

   .. So on for other columns.. and finally load the record once all the 88 columns value     for a row are in the respective variables..
end loop
end if

我还从下面的链接中尝试了 DBMS_UTILITY.COMMA_TO_TABLE,但是如果没有适当的模式,这也没有多大帮助[在读取 CSV Oracle 存储过程 UTL_FILE 时忽略引号之间的逗号

我无法找到一种模式来提取列,因为 col5 和 col7(自由文本或 NULL)中有相当随机的数据模式。

需要帮助来解析这个..或任何替代方法将此 CSV 加载到数据库版本为 10.2 的 ORACLE 表中,或者根本不能在 PL/SQL 中完成:(

4

0 回答 0