2017-08-24 12 views
1

大きなフラットファイルからデータを取り込む際に問題が発生しています。私が書いている行を前処理した後、 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コマンドを使用してファイルからヌル文字を削除しようとしました。誰かがこの仕事をする方法についていくつかの提案を投げてもらえますか?

-

事前に感謝します!

+0

"outFile_"が実際にnullバイトを削除したことを確認しましたか?また、 "outFile"を "outFIle_"に置き換えたり、テーブルを変更して "outFile_"からデータをロードしたりしましたか? –

+0

Pythonで前処理している場合、nullバイトを取り除くのはどうですか? 'line.replace(" \ 0 "、" ")、それ以外は無意味であると仮定して、 –

答えて

0

ほとんどの場合、この特定のエラーは、データに印刷できない文字がある場合は常に発生します。印刷可能でない文字をスペースで置き換えてクエリを実行することをお勧めします。

関連する問題