-
Du kannst dir ein Array mit dim(n) für die Felder mit varying definieren.
d Source 120 varying
d MyField 100 dim(20)
d AktPos 5I 0
d EndPos 5I 0
d FInd 5I 0
c/free
Source = %trimr(Quellfeld) + ";"; // Endekennzeichen setzen
FInd = 1;
for AktPos = 1 to %len(Source);
select
when substr(Source:AktPos:1) = """";
for EndPos = AktPos + 1 to %len(Source);
select;
when %subst(Source:EndPos:1) = """"""; // 2 Anführungszeichen
MyField(Find) += %subst(Source:EndPos:1);
EndPos += 1;
when %subst(Source:EndPos:2) = """;"; // Feldende
AktPos = EndPos + 2;
FInd += 1;
leave;
other;
MyField(Find) += %subst(Source:EndPos:1);
endsl;
next;
other;
EndPos = %scan(";":AktPos:Source);
if EndPos = *zero; // letztes Feld
EndPos = %len(Source) + 1;
endif;
if AktPos = EndPos; // Leerfeld
AktPos = EndPos + 1;
else;
MyField(Find) = %subst(Source:AktPos:EndPos-AktPos);
endif;
AktPos = EndPos + 1;
Find += 1;
endsl;
next;
Das Ganze erhebt keinen Anspruch auf Vollständigket.
-
Hi,
das hat mich doch stark interessiert.
Meine Lösung wäre einfach ein kleines PHP progrämmle
PHP-Code:
<?php
// folgender Aufbau //---------------------------------- // """Text""";Text;1;1,98;"3;4";"A;B;""C" // "feld1";datenfeld2;1500,99;feld4;"feld5";"120,99;5%" // //------------------------------------ echo('Hello CSV Import ');
ini_set('auto_detect_line_endings',TRUE);
$handle = fopen('/a/testcsv.txt','r'); while ( ($data = fgetcsv($handle, 1000, ';') ) !== FALSE ) { print_r($data); } ini_set('auto_detect_line_endings',FALSE); ?>
und hier das Ergebnis:
PHP-Code:
Hello CSV Import Array ( [0] => "Text" [1] => Text [2] => 1 [3] => 1,98 [4] => 3;4 [5] => A;B;"C ) Array ( [0] => feld1 [1] => datenfeld2 [2] => 1500,99 [3] => feld4 [4] => feld5 [5] => 120,99;5% )
Das war's läuft auf der i
COOL oder 
Gruß
Michael
-
Hat mich doch noch der Ehrgeiz gepackt und da PHP vermutlich nicht so gefragt ist...
Hier meine Lösung:
Code:
D pos s 10i 0 inz(0)
D ix s 10i 0 inz(0)
D Ara s 50a varying dim(99)
D src s 5000a inz('"""Text""";Text;1;1,98;"3;4";+
D "A;B;""C"')
/free
src = %trimr(src) + ';'; // set end mark
dow src > *blanks;
if %subst(src:1:1) = '"' and %subst(src:1:2) <> '""';
pos = %scan('";':src);
if %subst(src:pos+1:2) = '""';
dou %subst(src:pos+1:2) <> '""';
pos = %scan('";':src:pos+1);
enddo;
endif;
pos += 1;
else;
pos = %scan(';':src);
endif;
if pos > 1;
ix += 1;
ara(ix) = %trimr(%subst(src:1:pos-1));
if %subst(ara(ix):1:1) = '"'; // cleanup
ara(ix) = %replace('':Ara(ix):1:1);
ara(ix) = %replace('':Ara(ix):%len(ara(ix)):1);
endif;
src = %subst(src:pos+1); // shift
endif;
enddo;
Ara = %scanrpl('""':'"':Ara); // ab V7R1
/end-free
Erstaunlicherweise funktioniert sie auch ;-)
Alle Angaben ohne Gewähr (wie eine Lottopanne lehrt)
kf
-
Ehrlich, ihr seid der Wahnsinn,
so schnell so viele Lösungsansätze, dass ich kaum mit dem Lesen und Grüblen nachkomme 
Danke euch allen für die vielen Vorschläge. Ich werde mich jetzt daranmachen und sie der Reihe nach durchprobieren.
Nochmals recht herzlichen Dank!
Franz-Georg
-
Franz-Georg,
noch kurz einige Erklärungen, damit Du nicht zuviel Grüblen musst.
Der erste Teil dient dem Verfizieren der Endposition. Sollte ein Wert mit " beginnen, ist zu prüfen ob es eine Konstante oder ein Feld mit entsprechendem Separator ("; ist.
Wurde die Feldendposition bestimmt, erfolgt ein Substring in den Array mit einem ersten Cleanup vom " (nur einstellig). Damit wären Felder wie "3;4" von diesen Zeichen befreit.
Der Shift entfernt den bearbeiteten Wert aus dem String. Heisst, der String wird solange abgearbeitet , bis nix mehr da ist.
Am Schluss reduziert der %scanrpl das "" Zeichen auf ein Einzelnes (Erstes und letztes Feld). Dies funktioniert nur in V7R1, ansonsten eine Schleife mit %%scan/%replace.
Hoffe, dies hilft.
kf
-
Hallo,
so mit dem ersten Ergebnis zurück, aber leider gleich einen kleinen Dämpfer für Camouflage: Was passiert, wenn, wie natürlich auch möglich, hinter einem ; erneut ein ; kommt, da das entsprechende Feld keinen Wert enthält?
Durch die Abfrage pos > 1 wird genau dies nicht erfasst und es kommt zu einem Dauerloop.
LG
Franz-Georg
-
Hi,
Ist schon klar, aber auf die Schnelle hab ich nicht alle Fälle eingebaut...
Wollte Dir ja auch noch was überlassen
kf
-
Sonst kannst Du den Code so ergänzen:
Code:
if pos >= 1;
ix += 1;
if pos = 1;
ara(ix) = *blanks;
else;
ara(ix) = %trimr(%subst(src:1:pos-1));
endif;
ok?
kf
-
na ja wenn schon jemand so eine Lösung auf die
Schnelle anbietet wird man natürlich denkfaul 
danke nochmal für die superlösung.
Similar Threads
-
By iseries_user in forum NEWSboard Programmierung
Antworten: 5
Letzter Beitrag: 21-09-12, 14:53
-
By mk in forum IBM i Hauptforum
Antworten: 9
Letzter Beitrag: 21-12-06, 08:56
-
By cc in forum IBM i Hauptforum
Antworten: 6
Letzter Beitrag: 13-10-04, 22:52
-
By Kilianski in forum NEWSboard Server Software
Antworten: 0
Letzter Beitrag: 27-05-04, 14:13
-
By Kilianski in forum Archiv NEWSblibs
Antworten: 0
Letzter Beitrag: 27-05-04, 14:10
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