很难解析包含似乎已在源系统中随机加载的列数据的 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 中完成:(