PDA

View Full Version : 65k Dateifeld oder wie lese ich eine Datei direkt aus dem IFS ein.



Seiten : 1 2 3 4 [5] 6

B.Hauser
21-02-21, 13:02
Wobei ich mich immer noch frage, warum man eine CSV selber auseinandernehmen muss.
Weil man sie vielleicht direkt verarbeiten und nicht erst lange herumkopieren möchte?

B.Hauser
21-02-21, 13:08
Wer die Aktuellen TRs eingespielt hat sollte auf jeden Fall auf die IFS_READ... Funktionen zurückgreifen, so wie von Birgitta vorgeschlagen.
Diese gehen um einiges schneller, als mit GET_CLOB_FROM_FILE und dann das Ergebnis mit Split aufzuteilen.

Die SPLIT-Funktion kann man im übrigen beträchtlich beschleunigen, in dem man sich basierend auf dem Quellcode der SPLIT-Funktion (bekommt man durch Reverse Engineering) eine neue Funktion generiert, die anstatt mit den großen LOBs zu arbeiten, VarChar Datentypen verwendet.
... im übrigen wird das (so oder so ähnlich) sogar in der Dokumentation vorgeschlagen.
Deshalb kommt man ja auch an den SourceCode (der normalerweise verschlüsselt ist) dran.
Mit einer solchen Funktion löst man eine IFS-Datei um ein x-faches schneller auf.

Birgitta

Fuerchau
21-02-21, 15:50
Nun, da solche Importe ja keine Einmalaktionen sind, ist eine komfortable Bearbeitung direkt mit SQL nach dem CPYxxx erheblich einfacher. Zumal die Datei zu Dokumentationszweicek auch meist noch aufgehoben werden muss. Ich muss mich auch nicht selber um die Typanapssung in Zahlen/Datum kümmern.
Ich liebe halt den einfachen statt des komplizerten Weges;-).

Aber es kann ja jeder machen was er will, auch Übungsaufgaben.

MoellerH
23-02-21, 08:06
DANKE an alle, mit euren Infos konnte ich das Problem lösen.

Fuerchau
23-02-21, 09:33
Das Problem des Splits ist ja, dass es beim Vorkommen des Trennzeichens innerhalb eines Spaltenwertes zu Verschiebungen der Inhalte kommt:

123.45,"Müller, Johannes",03.07.1963

Der CPY-Import regelt sowas halt;-).

labm
23-07-21, 07:21
Hallo,

Problem CCSID

ich habe in IFS ein CSV Datei mit ccsid 1252

dieser will ich per sql verarbeiten:

Variante 1:

Select Ordinal_Position as RowKey, cast(Element as varchar(2000) ccsid 1208) from Table(SysTools.Split(Get_clob_From_File('/chguser/labuhn/upload/idn_tek2.csv'), x'0D25')) a
Where Trim(Element) > ''

hier sehe ich keine umlaute.. Habe mit cast(element as varchar(2000) ccsid 1208) probiert / mit Vargraphic

Variante 2 ;
Datenbank Datei Feld Graphic(13488) dann Cpyfrmstmf mit Ziel CCSID1208/1200/13553


Geht alles nicht.

Was mache ich falsch?

IFS_READ_UTF8( --> kann ich nicht nutzen da wir V7R3M0 haben.

Danke

Labm

B.Hauser
23-07-21, 07:43
Wenn Ihr in Release 7.3 auf dem Aktuellen PTF-Stand seid, sollte der IFS_READ verwendet werden können.

Kannst Du den GET_CLOB_FROM_FILE casten?
Etwa so:
Cast(GET_CLOB_FROM_FILE(...) as CLOB(2M) CCSID 1208)

Es kann auch sein, dass Du nicht direkt von 1252 nach 1208 casten kannst und den Umweg über 273 oder 1174 nehmen musst.

Birgitta

Fuerchau
23-07-21, 07:53
Prüfe bitte folgendes:
Welche CCSID hat denn tatsächlich deine IFS-Datei? ggf. mit CHGATR korrekt anpassen.
Welche CCSID hat zur Laufzeit dein Job?
https://www.ibm.com/docs/en/i/7.3?topic=functions-get-clob-from-file

"The function will read the file specified by the argument, convert the data to the default job CCSID, and return it as a CLOB locator."

Der anschließende CAST nimmt die bereits konvertierten Daten.

Ein Set von/nach CLOB_FILE ins Programm klappt auch mit älteren Releases.
Dabei können bis zu 16MB in SBCS und 8MB in DBCS (1200) verarbeitet werden.
Mittels XML-INTO kann man dann auch problemlos per geschachtelten qualified DS XML-Dateien verarbeiten.
Beispiele dazu hatten wir schon hier im Forum.

labm
23-07-21, 07:58
so etwa:

Select Ordinal_Position as RowKey, cast(Element as varchar(2000) ccsid 1208) from Table(SysTools.Split Cast((Get_clob_From_File('/chguser/xxx/upload/idn_tek2.csv'), x'0D25') as CLOB(2M) CCSID 1208) ) a
Where Trim(Element) > '' ;

Fehler
SQL State: 42601
Vendor Code: -199
Message: [SQL0199] Schlüsselwort CAST nicht erwartet. Gültige Token: (. Ursache . . . . : Schlüsselwort CAST wurde an dieser Stelle nicht erwartet. Im Schlüsselwort CAST wurde ein Syntaxfehler erkannt. Die Teilliste gültiger Token ist (. Bei dieser Liste wird vorausgesetzt, dass die Anweisung bis zum unerwarteten Schlüsselwort richtig ist. Der Fehler liegt möglicherweise an anderer Stelle der Anweisung, die Syntax scheint aber bis zu dieser Stelle korrekt zu sein. Fehlerbeseitigung: Die SQL-Anweisung im Bereich des angegebenen Schlüsselworts untersuchen. Möglicherweise fehlt ein Doppelpunkt oder ein SQL-Begrenzer. Bei SQL müssen reservierte Wörter begrenzt werden, wenn sie als Namen verwendet werden sollen. Die SQL-Anweisung korrigieren und die Anforderung wiederholen.



Bei: ccsid 1174
cast(Element as varchar(2000) ccsid 1174)
Fehler:
SQL State: 22522
Vendor Code: -189
Message: [SQL0189] ID für den codierten Zeichensatz 1174 ungültig. Ursache . . . . : Die ID für den codierten Zeichensatz (CCSID = Coded Character Set Identifier) 1174 ist aus einem der folgenden Gründe ungültig: -- Die CCSID ist keine EBCDIC-CCSID. -- Die CCSID wird vom System nicht unterstützt. -- Die CCSID ist für die Datenart nicht gültig. -- Wird die CCSID für Grafikdaten angegeben, muss die CCSID eine DBCS-CCSID sein. -- Wird die CCSID für UCS-2- oder UTF-16-Daten angegeben, muss die CCSID eine UCS-2- oder UTF-16-CCSID sein. -- Wird die CCSID für XML-Daten angegeben, muss sie eine SBCS- oder Unicode-CCSID sein. DBCS oder der Wert 65535 ist nicht zulässig. -- Wird die CCSID für CLOB-, DBCLOB- oder DATALINK-Daten angegeben, darf die CCSID nicht 65535 sein. -- Wird die CCSID für eine Ergebnisspalte der Funktion XMLTABLE angegeben, darf die CCSID nicht 65535 sein. -- Sind mehrere DATALINK-Spalten mit FILE LINK CONTROL vorhanden, müssen alle dieselbe CCSID haben. -- Die Klausel NORMALIZED kann nur für eine UTF-8- oder UTF-16-CCSID angegeben werden. Fehlerbeseitigung: Sicherstellen, dass alle CCSID-Werte in der Anweisung vom System unterstützt werden und für die Datenart zulässig sind. Eine Liste der gültigen CCSID-Werte enthält die Themensammlung zu DB2 for i SQL Reference in der Kategorie Datenbank im IBM i Information Center unter http://www.ibm.com/systems/i/infocenter/.




Bei: ccsid 1174
cast(Element as varchar(2000) ccsid 273) <-- keine umlaute

Fuerchau
23-07-21, 08:01
Split ist eine Funktion und da gehört der Ausdruck in Klammern: Split(cast...).
Aber ich weiß wirklich nicht, warum man es immer so kompliziert machen will, wenn ILERPG> das native eben auch kann. Da funktioniert das auch besser. Man hat mit CRLF nichts zu tun, vor allem da XML's CRLF nicht anthalten müssen.