Hallo Zusammen,
ich bin gerade dabei, eine XML-Struktur nach CSV zu wandeln. So sieht meine XML-Datei aus:
12327.11.200310028.11.2003200
In jeder Zeile steht eine Nummer, die für alles in der Zeile gilt,
ein Datum und dazu ein Betrag .
Das Paar Datum und Betrag können mehrfach vorkommen.
Es soll folgendes gemacht werden:
In einer Datei soll folgendes stehen:
123;27.11.2003;100
123;28.11.2003;200
Mein Code sieht so aus, funktioniert aber nicht. Es ist scheinbar eine Endlosschleife:
if($i =~ m|(.+)|i)
{
$a = $+;
}
while($i =~ m|(.+)|ig)
{
$x = $+;
if($i =~ m|(.+)|ig)
{
$c = $+;
}
print $a.";".$x.";".$c
}
Was mache ich falsch?
Gruß, Franz
Es soll folgendes gemacht werden:
In einer Datei soll folgendes stehen:
123;27.11.2003;100
123;28.11.2003;200
Was mache ich falsch?
du muesstest an irgendeiner stelle in der whileschleife $i um die fundstelle kuerzen, weil du sonst immer das gleiche $c und das gleiche $x findest - nicht?
Hallo Franz,
das Problem liegt daran, dass Du über while($i =~ m|(.+)|ig) immer wieder das Ergebnis 27.11.200310028.11.2003 erzeugst. Es wird immer das erste und das letzte gefunden. Dadurch bist Du in der Endlosschleife.
Ich gehe einmal davon aus, dass in $i immer nur ein Datensatz steht, daher könntest Du es auch so lösen:
($a, $i) = split( //, substr( $i, 3, length( $i )-7 ) );
@content = split( //, $i );
foreach $i ( @content )
{
($x, $c) = split( //, $i );
print "$a;$x;$c\r\n";
}
falls Du $i nicht zerstören willst, dann kannst Du es ja anpassen.
Gruß
Christian
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Danke! und noch eine Anmerkung
Vielen Dank für die Tipps.
Ich dachte mit der Option g beim suchen würde Perl nicht wieder von vorne anfangen zu suchen sondern da, wo er gerade ist + 1 Zeichen weiter.
Franz
Ich dachte mit der Option g beim suchen würde Perl nicht
wieder von vorne anfangen zu suchen sondern da, wo er gerade
ist + 1 Zeichen weiter.
in einer schleife schon, nur machst du das durch den zweiten $i=~ m//ig wieder kaputt, und er faengt wieder von vorn an.
ich haette es so geloest:
13.27:je@1@booster:~
$ cat foo.pl
#!/usr/bin/perl
$zeile = "12327.11.200310028.11.2003200";
$x=$c=$a=false;
while ($zeile =~ m|([^|g)
{
# print "$1 $2 $3\n";
if ($1 eq "a")
{ $a = $2; $x = false; $c = false; }
if ($1 eq "x")
{ $x = $2; $c = false; }
if ($1 eq "c")
{ $c = $2; }
if ($c ne false)
{ print "$a;$x;$c\n"; }
}
13.27:je@1@booster:~
$ ./foo.pl
123;27.11.2003;100
123;28.11.2003;200
13.27:je@1@booster:~
$