2017-08-24 2 views
1

Ich habe ein Problem in einem Prozess Ich schreibe Daten aus einer großen flachen Datei zu erfassen. Ich Vorverarbeitung die flache Datei ein Python-Wrapper mit UTF8 Spezifikationen wie folgt verwendet: wrFile = io.open("outFile","w+",encoding='utf8')GPFdist einfügen von Flat-Datei löst Fehler 'ungültige Byte-Sequenz für die Codierung "UTF8": 0x00' auf Einfügen

Ich bin die Quelldatei Zeile für Zeile zu lesen mit: lineACT = linecache.getline("inFile", i+j) lineNxt = linecache.getline("inFile", i+j+1)

Ferner wird, nachdem die Linien Vorverarbeitung ich schreibe die Datei wie folgt: wrFile.write(lineACT) Durch Iteration durch die Anzahl der Zeilen in der Infile, ich erstelle das outfile.

Jetzt ist die Datei bereit, in eine externe postgresql Tabelle mit der folgenden Abfrage aufgenommen werden. Der Lader Anwendung wird in Java geschrieben und alle Konfigurationen verwenden eine Properties-Datei übergeben:

-- 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; 

das Laufen auf einem UNIX Box wirft mich eine Ausnahme:

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) 

Hinweis: Jede Zeile in outFile hat 1655 Zeichen. Säulenstruktur der beiden outTable & deltaTable sind auch 1655 Wenn ich überprüfen, in die errorTable ich diese finden in errmsg Spalte:

invalid byte sequence for encoding "UTF8": 0x00 

Nun, ich vermute, dass die Datenbank nicht Akzeptieren der null Zeichen '0x00' in der Datei aufgrund der Codierungseigenschaften der db, die ich überprüft habe, ist 'UTF8'

Ich habe versucht, die null Zeichen aus der Datei mit den folgenden Bash-Befehle zu entfernen:

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

&

tr < outFile -d '\000' > outFile_ 

aber nichts hat sich bis jetzt gearbeitet. Kann jemand bitte einen Vorschlag einreichen, wie es funktioniert?

-

Vielen Dank im Voraus!

+0

Haben Sie bestätigt, dass die "outFile_" tatsächlich die Nullbytes entfernt hat? Haben Sie auch "outFile" durch "outFIle_" ersetzt, oder ändern Sie die Tabelle, um Daten von "outFile_" zu laden? –

+0

Wenn Sie in Python vorverarbeiten, dann entfernen Sie die Nullbytes dann? 'line.replace (" \ 0 "," ")' oder was auch immer, vorausgesetzt, sie sind ansonsten bedeutungslos. –

Antwort

0

In den meisten Fällen tritt dieser spezielle Fehler auf, wenn die Daten nicht druckbare Zeichen enthalten. Meine Empfehlung wäre, das nicht druckbare Zeichen durch Leerzeichen zu ersetzen und die Abfrage auszuführen

Verwandte Themen