XML, CSV , hierachische Suche

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:~
$