2017-08-24 215 views
1

我正在寫一個過程中的問題,我正在寫入從大型平面文件中獲取數據。 wrFile = io.open("outFile","w+",encoding='utf8')GPFdist從平面文件插入錯誤'編碼錯誤'字節序列'UTF8':0x00'插入

我讀通過使用線源文件行::我使用與UTF8規格Python包裝如下預處理平面文件 lineACT = linecache.getline("inFile", i+j) lineNxt = linecache.getline("inFile", i+j+1)

此外,預處理我寫行後該文件如下: 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個字符。既outTable & deltaTable的立柱結構也是1655 當我檢查到errorTable我覺得這是在errmsg列:

invalid byte sequence for encoding "UTF8": 0x00 

現在,我猜測數據庫沒有接受文件中的null個字符'0x00',因爲我檢查的db的編碼屬性是'UTF8'

我試着用以下的bash命令,從文件中刪除無效字符:

sed 's/\x0/-9/g' outFile > outFile_ 

&

tr < outFile -d '\000' > outFile_ 

但沒有奏效至今。有人可以提出一些關於如何做這項工作的建議嗎?

-

提前感謝!

+0

您確認「outFile_」實際上是否刪除了空字節?你還用「outFIle_」替換了「outFile」,還是將表更改爲從「outFile_」加載數據? –

+0

如果你在Python中進行預處理,爲什麼不去掉空字節呢? 'line.replace(「\ 0」,「」)''或其他什麼,假設他們沒有任何意義。 –

回答

0

大多數情況下,只要數據具有不可打印的字符,就會遇到此特定錯誤。我的建議是用空格替換不可打印的字符並執行查詢