Anmelden

View Full Version : Nicht lesbare Daten nach Read aus dem IFS



msost
24-07-14, 12:54
Hallo,

ich möchte Daten aus einer .csv Datei im IFS lesen. Die eingelesenen Daten werden aber nciht umgesetzt. Was mache ich falsch/was fehlt? Habe mich an den bekannten Beispielen von Scott Klement orientiert. Auch verschiedene Versuche mit den Parametern des Open haben nichts gebracht (O_CCSID/O_TEXTDATA/O_CODEPAGE). Oder ist buf falsch definiert?

Open der Datei:
Inp_File = '/CIAN/' + Read_File;
oflag = O_RDWR + O_CCSID + O_TEXTDATA;
omode = S_IRWXU + S_IRWXG + S_IRWXO;
eval fd = open(%trimr(Inp_File) : oflag :
omode : 500);

Lesen der Datei:
eval len = read(fd: %addr(buf): %size(buf));

Inhalt von buf:
‚ä%ÑÁ>È€ñà‚›‚&/ÊÈ`‚›‚&<ãäèê‚›‚&<ãçëè‚
Ž‚‚›‚è`øÁ‚›‚‚›‚‚
Ž‚‚›‚‚›‚‚›‚‚
Ž‚.+( à€€€€€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚.+âä+€€€€€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚èáë耀€€€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚+!èñã߀€€€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚ë â ñêäê ‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚ëçñ&&áꀀ€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚ä!+ëñå+áဂ›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚.+ç.倀€€€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚â!ñ+å ñäê ‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚.+âê䀀€€€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚.+ <ñ€€€€€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚.+î <€€€€€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚.+â< €€€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚.+€( à€€€€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚( [!êñä ë ‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚äíêèñà!ëêñ‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚.+€<!+€ã €‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚ë& ñ+èáë耂›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚ íè!( èñäë‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚ <ã ãíᐑ€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚ <ñ(&íᐑ€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚ ê(ëâá向€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚ êá â à‘€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚ <âêâ ꐑ€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚ åäñâ ꐑ€‚›‚А•‚›‚àá‚›‚ ë.+ñàá‚
Ž‚ &<ñ


Definition buf:
D buf S 5000


Danke für Ideen!

Grüße

Matthias

Fuerchau
24-07-14, 13:04
O_CCSID ist schon korrekt.
Wenn dein Job allerdings auf CCSID(*HEX) steht, weiß das System ja nicht in welche CCSID umgewandelt werden soll.
Ändere deinen Job auf die benötigte CCSID (z.B. 273), dann sollte es klappen.

msost
24-07-14, 13:20
Der Job läuft unter CCSID 500. Ergo sollte das klappen. Der Fehler muß also noch irgendwo anders liegen.

msost
24-07-14, 14:34
Die Files im IFS haben alle CCSID 819. Der Job läuft unter 500. Wenn ich mir mal einen CHGJOB, Parameter CCSID, anschaue, sehe ich in der Lsite der CCSID's die 819 nicht. Deutet das auf ein Problem mit CCSID 819 hin? Erstellt werden die csv's per CPYTOIMPF mit TOCCSID(*STMF).

msost
24-07-14, 16:58
Ich bin schon mal ein Stück weiter. Die .csv Files haben CCSID 819, die Daten sind binär gespeichert. Wenn ich jetzt die .csv Datei mit COPY kopiere und dabei die CCSID 500 und Format *TEXT angebe, dann kann ich die Daten offensichtlich lesen. Allerdings muß der open() dann auch mit O_TEXTDATA und O_CCSID (500) gemacht werden.

Fuerchau
24-07-14, 17:14
Dann stammen die CSV-Daten nicht aus der PC-Welt sondern aus einer anderen AS/400.
Beim Kopieren von Dateien in das IFS per FTP wird die CCSID aus CHGFTPA gewählt.
Beim Kopieren über Freigaben (Windows) die Default-CCSID des NetServers.
Dabei spielt es keine Rolle, welchen Code die Daten tatsächlich haben.
Man sollte also immer wissen, wie die Daten tatsächlich kodiert sind.

Lesbar mit Windows Notepad?
Dann wahrscheinlich 1252 (Voll-ANSI) oder 819 (Teil-ANSI).

Per CHGATR kann man die CCSID einer IFS-Datei anpassen ohne Codewandlung.
Ist die Datei mit EDTF auf der AS/400 lesbar?
EDTF wandelt standardmäßig von der IFS-CCSID in die JOB-CCSID um.

msost
25-07-14, 08:33
Danke für die Info's! Ja, die Dateien stammen von einer anderen AS/400. Alle haben CCSID 819 und sind mit EDTF lesbar.

AG1965_2
25-07-14, 12:41
Wenn Du O_CCSID bzw. O_CODEPAGE angibst, musst Du auch den 4. Parameter, CCSID oder Codepage, angeben. Als 5. Parameter kannst Du einfach 0 übergeben, das ist dann die Job-CCSID.

Aber weniger ist oft besser, darum probier's mal so:
oflag = O_RDWR + O_TEXTDATA;
fd = open(%trimr(Inp_File) : oflag );

Wenn das nichts bringen sollte, gib' wieder O_CCSID und den 4. Parameter an, mit der CCSID der IFS-Datei (mit stat() im Pgm herauszufinden).

Fuerchau
25-07-14, 13:32
So wie es für mich aussieht, hat die Datei zwar CCSID 819 (ggf. Copy aus Windows/FTP), der Inhalt ist wohl aber die CCSID des Quellsystem (z.B. 273).
Damit kann keine Codewandlung von 819 nach irgendwas funktionieren.

AG1965_2
25-07-14, 14:54
Das kann nicht sein, Baldur.
Um 09:33 hat msost geschrieben, dass die Dateien CCSID 819 haben und er sie mit EDTF lesen kann - also stimmt die Codierung. Es kann nur das Lesen im RPG falsch sein.