我正在写一个过程中的问题,我正在写入从大型平面文件中获取数据。 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”,“”)''或其他什么,假设他们没有任何意义。 –