View Full Version : 65k Dateifeld oder wie lese ich eine Datei direkt aus dem IFS ein.
kann ich den insert parametrisieren mit CCS-angaben , oder sollte die Ziel-CLOB-File entsprecht definiert werden ? hier besteht die Herausforderung , dass ich direkt vom windowsserver lade ( Freigabe ist definiert ) , ohne Umwege , was ja auch problemlos funktioniert ...
Da hast du aber keine CCSID-Unterstützung, da Windows das nicht beherrscht.
Für eine CCSID-Konvertierung musst du die Datei vorher lokal ins IFS kopieren, ansonsten wird wieder der Default des Netservers (819/1252) verwendet.
Das geht z.B. mit CPY.
okay , danke . wir werden die files ins IFS stellen und dann mit CHGATR die CCSID ändern und die Daten laden ..
Hallo Brigitta,
dein Beispiel oben läuft bei mir rudimentär.
Ich möchte eine IFS-CSV-Datei lesen, und zwar Satzweise,
bis EOF.
Was muss ich noch beachten ?
Danke im voraus.
Nur mal so als Frage: Warum erstellst du nicht eine passende Tabelle und nutzt CPYFRMIMPF?
Satzweises lesen geht u.U. nur mit der neuen SQL-Functions IFS_READ.
Andreas_Prouza
19-02-21, 13:19
Hallo,
Mit SQL Gibt es auch viele Möglichkeiten.
Hier hab ich ein Beispiel, wie du mit SQL das CSV nicht nur Zeile für Zeile einlesen kannst, sondern auch schon auf die entsprechenden Spalten aufgesplittet bekommst:
With csv2rows as (Select Element as Satz
from Table(SYSTOOLS.SPLIT(
GET_CLOB_FROM_FILE('/home/prouza/test.csv'), x'0D25')
)
),
rows2col as (select regexp_replace(satz, '(.+),(.+),(.+),(.+),(.+),(.+)', '$1') Spalte1,
regexp_replace(satz, '(.+),(.+),(.+),(.+),(.+),(.+)', '$2') Spalte2,
regexp_replace(satz, '(.+),(.+),(.+),(.+),(.+),(.+)', '$3') Spalte3,
regexp_replace(satz, '(.+),(.+),(.+),(.+),(.+),(.+)', '$4') Spalte4,
regexp_replace(satz, '(.+),(.+),(.+),(.+),(.+),(.+)', '$5') Spalte5,
regexp_replace(satz, '(.+),(.+),(.+),(.+),(.+),(.+)', '$6') Spalte6
from csv2rows
)
select * from rows2col;
Das (.+) steht für ein Feld im CSV. Diese Felder sind mit dem "," getrennt.
Es gibt auch noch andere Möglichkeiten wie man diese auf Spalten aufsplitten kann.
Die Frage der Performance wäre dann halt auch noch nebenbei.
Ich denke von diesem Aspekt ist der CPYFRMIMPF womöglich am schnellsten.
lg Andreas
Andreas_Prouza
19-02-21, 14:30
Hier noch etwas vereinfacht:
With csv2rows as (Select Element as Satz from Table(SYSTOOLS.SPLIT(
GET_CLOB_FROM_FILE('/home/prouza/test.csv'), x'0D25')
)
),
rows2col as (select satz, regexp_substr(satz, '[^,]+') Spalte1,
regexp_substr(satz, '[^,]+', 1, 2) Spalte2,
regexp_substr(satz, '[^,]+', 1, 3) Spalte3,
regexp_substr(satz, '[^,]+', 1, 4) Spalte4,
regexp_substr(satz, '[^,]+', 1, 5) Spalte5,
regexp_substr(satz, '[^,]+', 1, 6) Spalte6
from csv2rows
)
select * from rows2col;
Der Lösungen gibt es viele!
Es geht auch ohne Regular Expressions (einfach nur Spalten, ohne Überschriften und ohne Anführungszeichen um die Alpha Felder):
With x as (Select * from Table(IFS_READ_UTF8('/home/Dir/Example.csv'))),
y as (Select x.*, Ordinal_Position ColKey,
Trim(B '"' from Element) as ColInfo
from x cross join Table(SysTools.Split(Line, ',')))
Select Line_Number,
Min(Case When ColKey = 1 Then ColInfo End) Col1,
Min(Case When ColKey = 2 Then ColInfo End) Col2,
Min(Case When ColKey = 3 Then ColInfo End) Col3,
Min(Case When ColKey = 4 Then ColInfo End) Col4,
Min(Case When ColKey = 5 Then ColInfo End) Col5,
Min(Case When ColKey = 6 Then ColInfo End) Col6,
Min(Case When ColKey = 7 Then ColInfo End) Col7
From y
Where Line_Number > 1
Group By Line_Number
Order By Line_Number
;
... mit GET_CLOB_FROM_FILE geht es auch, dann muss man allerdings 2 Splits machen.
Birgitta
Andreas_Prouza
21-02-21, 09:40
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.
Für wem Performance eine Rolle spielt bietet, sollte auch noch zusätzlich wie im meinen Beispiel oben auf Regex zurückgreifen.
Bei größeren CSV Files ist diese Variante 6-7 mal schneller, da die SPLIT Funktion im Vergleich zu Regex viel langsamer ist.
lg Andreas
Wobei ich mich immer noch frage, warum man eine CSV selber auseinandernehmen muss.
Da gibt es soviele Varianten:
- Decimalcomma/-point
- Datumsformat
- Mit/Ohne Delimter (achtung, Delimiter sind innerhalb des Feldes verdoppelt)
- Trennzeichen: , ; Tab
- Mit/Ohne Null
Bisher hat mich der CPYxxxIMPF da immer comfortabel und vor allem auch schnell weitergebracht.