ソース システムにランダムにロードされたように見える列データを含む 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: キーコード 8269353 の出荷前レポート NKGWT00065104 を受け取り、AQL 欠陥レベルは 1/0 クリティカル、17/10 メジャーおよび 24/14 マイナーが見つかりました。,23/11/2011 12:00:00 AM
レコード 2: PS-ASXGANBAG,aOA2000x39,NULL,NULL,898245",NULL,22-11--11: キーコード 8241233 の出荷前検査レポート Intertek SHIJ25252253。AQL レベル: 0/0 重大、16/10 重大および 4/ 14 軽微な欠陥. 出荷前レポートは、仕上がりが悪く、スタッドがずれているために失敗しました. 製造品質の欠陥が懸念されます. これは、将来の生産で改善する必要があります. 公差外の寸法は、この出荷では商業的に許容されます. すべての欠陥のある衣服は、バルクから削除または修復. オーストラリア国旗の印刷および輸入許可のための政府文書 Judy,23/11/2011 12:00:00 AM
レコード 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も試してみましたが、適切なパターンがなければ、これもあまり役に立ちませんでした
col5 および col7 (フリー テキストまたは NULL) には非常にランダムなデータ パターンが含まれているため、列を抽出するパターンを見つけることができません。
これを解析するには助けが必要です..または、このCSVをORACLEテーブルにロードする別の方法で、データベースのバージョンが10.2であるか、PL/SQLではまったく実行できません:(