Anmelden

View Full Version : CSV gemischt mit Satzformaten oder wie werde ich verrückt



Seiten : 1 [2]

camouflage
11-04-13, 13:03
Hat mich doch noch der Ehrgeiz gepackt und da PHP vermutlich nicht so gefragt ist...

Hier meine Lösung:


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)

FNeurieser
11-04-13, 13:53
Ehrlich, ihr seid der Wahnsinn,

so schnell so viele Lösungsansätze, dass ich kaum mit dem Lesen und Grüblen nachkomme :D

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

camouflage
11-04-13, 14:06
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.

FNeurieser
12-04-13, 08:55
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

camouflage
12-04-13, 09:12
Hi,

Ist schon klar, aber auf die Schnelle hab ich nicht alle Fälle eingebaut...

Wollte Dir ja auch noch was überlassen ;)

camouflage
12-04-13, 09:28
Sonst kannst Du den Code so ergänzen:



if pos >= 1;
ix += 1;
if pos = 1;
ara(ix) = *blanks;
else;
ara(ix) = %trimr(%subst(src:1:pos-1));
endif;


ok?

FNeurieser
12-04-13, 09:34
:D na ja wenn schon jemand so eine Lösung auf die
Schnelle anbietet wird man natürlich denkfaul :rolleyes:

danke nochmal für die superlösung.