我正在寫一個過程中的問題,我正在寫入從大型平面文件中獲取數據。 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_
但沒有奏效至今。有人可以提出一些關於如何做這項工作的建議嗎?
-
提前感謝!
您確認「outFile_」實際上是否刪除了空字節?你還用「outFIle_」替換了「outFile」,還是將表更改爲從「outFile_」加載數據? –
如果你在Python中進行預處理,爲什麼不去掉空字節呢? 'line.replace(「\ 0」,「」)''或其他什麼,假設他們沒有任何意義。 –