2017-08-24 225 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

大多数情况下,只要数据具有不可打印的字符,就会遇到此特定错误。我的建议是用空格替换不可打印的字符并执行查询