[NEWSboard IBMi Forum]
Seite 4 von 5 Erste ... 3 4 5 Letzte
  1. #37
    Registriert seit
    Nov 2020
    Beiträge
    315
    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;

  2. #38
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #39
    Registriert seit
    Nov 2020
    Beiträge
    315
    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

  4. #40
    Registriert seit
    Feb 2001
    Beiträge
    20.206
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #41
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    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?
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  6. #42
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Zitat Zitat von Andreas_Prouza Beitrag anzeigen
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  7. #43
    Registriert seit
    Feb 2001
    Beiträge
    20.206
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  8. #44
    Registriert seit
    Feb 2021
    Beiträge
    10
    DANKE an alle, mit euren Infos konnte ich das Problem lösen.

  9. #45
    Registriert seit
    Feb 2001
    Beiträge
    20.206
    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;-).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  10. #46
    Registriert seit
    Mar 2006
    Beiträge
    98
    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

  11. #47
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  12. #48
    Registriert seit
    Feb 2001
    Beiträge
    20.206
    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?to...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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. Mit dem Bagger durch die Eifel oder wie debugge ich eine SQL Prozedur
    By KingofKning in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 04-11-19, 08:59
  2. mehrere Spoolfiles in eine Datei
    By programmer400 in forum NEWSboard Drucker
    Antworten: 7
    Letzter Beitrag: 26-07-17, 11:58
  3. Antworten: 10
    Letzter Beitrag: 14-12-16, 16:45
  4. verschiedene Jobs gleiche Datei, schreib / lese konflikt?
    By dibe in forum NEWSboard Programmierung
    Antworten: 20
    Letzter Beitrag: 25-02-16, 16:33
  5. Antworten: 3
    Letzter Beitrag: 20-12-13, 10:27

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •