大きなフラットファイルからデータを取り込む際に問題が発生しています。私が書いている行を前処理した後、 lineACT = linecache.getline("inFile", i+j) lineNxt = linecache.getline("inFile", i+j+1)
フラットファイルからのGPFdistの挿入で、 'UTF8:0x00'のエンコードに無効なバイトシーケンスが発生します
さらに: wrFile = io.open("outFile","w+",encoding='utf8')
私が使用して線で、ソースファイルの行を読んでいた:私は次のようにUTF8仕様のPythonラッパーを使用してフラット・ファイルを前処理していますファイルは次のようになります: wrFile.write(lineACT)
このように、infileの行数を繰り返し、私はoutfileを作成しています。
ファイルは、次のクエリを使用して外部postgresql
テーブルに取り込む準備が整いました。ローダアプリケーションはJava
で書かれており、すべての設定は、プロパティファイル使用して渡されます。
-- CREATE EXTERNAL TABLE FOR A SPECIFIC CLIENT
CREATE EXTERNAL TABLE outTable ( col1 character(3), col2
character(3),.....)
LOCATION ('<LocationOf outFile>')
FORMAT 'CUSTOM' (formatter=fixedwidth_in,col1='3',col2='3'......)
LOG ERRORS INTO errorTable SEGMENT REJECT LIMIT 2 ROWS;
-- INSERT INTO DELTA TABLE
INSERT INTO deltaTable
SELECT col1, col2,......
FROM outTable
;
-- DROP EXTERNAL TABLE
DROP EXTERNAL TABLE IF EXISTS outTable;
がUNIX
ボックス上でこれを実行すると、私に例外をスローする:
Cause: org.postgresql.util.PSQLException: ERROR: Segment reject limit reached. Aborting operation. Last error was: Expected line size from the formatting string: 1655, but the actual size is: 455 (seg43 slice1 uxpbdpsdw06.dstcorp.net:1028 pid=335160)
注:各行でoutFileは1655文字です。今、私はデータベースがないことを推測してい
invalid byte sequence for encoding "UTF8": 0x00
:両方outTable & の列構造deltaTableは私がerrorTableにチェックインすると、私はerrmsg
列でこれを見つけるも1655 ですチェックしたdbのエンコーディングプロパティのためにnull
文字の'0x00'
を受け取ります。'UTF8'
sed 's/\x0/-9/g' outFile > outFile_
&
tr < outFile -d '\000' > outFile_
が、何も今まで働いていない:は、私は、次のbashコマンドを使用してファイルからヌル文字を削除しようとしました。誰かがこの仕事をする方法についていくつかの提案を投げてもらえますか?
-
事前に感謝します!
"outFile_"が実際にnullバイトを削除したことを確認しましたか?また、 "outFile"を "outFIle_"に置き換えたり、テーブルを変更して "outFile_"からデータをロードしたりしましたか? –
Pythonで前処理している場合、nullバイトを取り除くのはどうですか? 'line.replace(" \ 0 "、" ")、それ以外は無意味であると仮定して、 –