Oracle CSV文件,其中一些双引号列包含逗号,一些非双引号列的文本列中包含逗号

Oracle CSV文件,其中一些双引号列包含逗号,一些非双引号列的文本列中包含逗号,oracle,csv,plsql,export,utl-file,Oracle,Csv,Plsql,Export,Utl File,解析CSV文件时遇到困难,该文件的列数据似乎已随机加载到源系统中: 我的输入是一个有88列的CSV文件,我需要将其加载到oracle表中。SQL loader抛出坏行(这几乎是文件中的所有内容),因此这不是一个选项。 我决定在PL/SQL过程中使用UTL_文件,这将使我能够灵活地解析每一行并将数据拆分为列 CSV中的模拟记录如下所示,第5列和第7列很难处理: 记录1: PS-ASXGBDFEG,aOA2000x29,空,空,“899245,892345”,空,4-7-12:收到钥匙代码82693

解析CSV文件时遇到困难,该文件的列数据似乎已随机加载到源系统中:

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

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

记录1: PS-ASXGBDFEG,aOA2000x29,空,空,“899245,892345”,空,4-7-12:收到钥匙代码8269353的装运前报告NKGWT00065104,发现AQL缺陷等级为1/0严重、17/10严重和24/14轻微,2011年11月23日12:00上午

记录2: PS-ASXGANBAG,aOA2000x39,零,零,898245“,空,22-11--11:Intertek SHIJ25252253钥匙码8241233的装运前检验报告。AQL水平:0/0严重缺陷、16/10重大缺陷和4/14轻微缺陷。由于工艺差和螺柱未对齐,装运前报告失败。制造质量问题令人担忧;这必须随着未来的生产而改善。超出公差的尺寸在商业上可接受。所有有缺陷的衣服必须从散装中取出或修理。澳大利亚国旗印刷批准和进口许可的政府文件?Judy,2011年11月23日12:00:00

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

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

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

我还尝试了下面链接中的DBMS_UTILITY.COMMA_TO_表,但如果没有合适的模式,这也没有多大帮助 [

我找不到提取列的模式,因为col5和col7(自由文本或NULL)中有相当多的随机数据模式


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

什么构成“坏行”那个SQLLoader丢弃了吗?似乎不太可能有足够规则的数据让您能够手动解析它,而这些数据非常不规则,以至于您无法编写SQLLoader控制文件来解析它。如果您有一个CSV文件,其中有一个嵌入逗号的文本字段,并且该字段周围没有双引号或其他分隔符,那么您可以你可能运气不好。也许“下一步”中有固定或接近固定的数据字段,可以用来帮助找出混乱字段的真正结束位置,但这只是运气的问题。我的建议是返回数据源,告诉他们无法解析文件,并让他们以可以处理的形式重新生成文件。祝你好运。你还对处理这个问题感兴趣吗?
    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