-
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.
-
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:
Code:
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
-
Hier noch etwas vereinfacht:
Code:
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):
Code:
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
-
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.
-
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?
-
 Zitat von Andreas_Prouza
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
-
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.
-
DANKE an alle, mit euren Infos konnte ich das Problem lösen.
-
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;-).
-
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
Similar Threads
-
By KingofKning in forum NEWSboard Programmierung
Antworten: 8
Letzter Beitrag: 04-11-19, 07:59
-
By programmer400 in forum NEWSboard Drucker
Antworten: 7
Letzter Beitrag: 26-07-17, 10:58
-
By _MG_ in forum NEWSboard Programmierung
Antworten: 10
Letzter Beitrag: 14-12-16, 15:45
-
By dibe in forum NEWSboard Programmierung
Antworten: 20
Letzter Beitrag: 25-02-16, 15:33
-
By gerhardsw in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 20-12-13, 09:27
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks