PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Regular Expressions - Zeilen zusammenlegen



dvdjimmy
27-02-2006, 14:23
Hallo,

heute schon das zweite Problem :)
Folgende beiden Zeilen habe ich zu 1000den.
GOTO / 132.76142, -96.75079, 96.00000,132.761416,-96.750790,96.000$
000, 0.000000, 0.000000, 1.000000

Ich will, dass dieses beiden Zeilen nach einer Umwandlung wie folgt ausschauen:

132.76142,-96.75079,96.00000,132.761416,-96.750790,96.000000, 0.00000, 0.000000, 1.000000

Also ohne Zeilenumbruch und ohne das Dollarzeichen.

Leider funktioniert bei mir der Befehl Join nicht wirklich.

Vielleicht läßt sich so etwas auch ganz anderst machen.

Vielen Dank schon für eure Hilfe.

Gruß,

Joachim

klaus_harrer
27-02-2006, 14:32
Hallo

Versuch es mit "tr -d $,\\n".

MfG
klaus_harrer

dvdjimmy
27-02-2006, 14:56
Besten Dank schon einmal.

Leider bin ich zu dumm, dass Ganze jetzt richtig in Syntax zu packen. Wie schreibe ich das denn in Perl. Aktuell habe ich folgendes gemacht.

foreach $zeile (@inhalt){
$zeile=~tr/\$/\n";
}

Liegt hier schon der Wurm begraben? Der Compiler gibt mir leider nur kauderwelsch aus....

Gruß,

Joachim

Mehlwurm
28-02-2006, 07:07
wo es um "wurm" geht will ich mich doch mal einmischen ;-)
soweit ich weiss ist das tr ein komando für die shell programmierung!
ich kenne perl nicht, vielleicht gibt es das dort auch ? ...

reneeb
28-02-2006, 07:55
my $text = join("",@inhalt);
$text =~ s/\$\n//sg;

dvdjimmy
01-03-2006, 09:33
Hi Reneeb,

vielen Dank für die Hilfe. Das erste hat jetzt schon einmal geklappt.

Jetzt will ich jede dieser Zeilen durchgehen und mir die 9 unterschiedlichen Zahlen in eine Matrix bzw. erstmal in eine Variable schreiben.
Syntax soll folgendermaßen sein.
[ Zahl1 Zahl2 Zahl3 Zahl4 ...usw. ]

Leider funktioniert bei mir mit einer variablen nicht mehr der foreach...Befehl. Kann ich so etwas auch anderweitig lösen?

Vielen Dank schon einmal.

Gruß,

Joachim

Caveman
01-03-2006, 18:22
Wie schaut das Programm mittlerweilen denn aus?

dvdjimmy
02-03-2006, 06:56
Hi Caveman,

das Programm sieht mittlerweile so aus:

use cwd;
open(OF,"testkomplex.aptsource")||die print"Kann Datei nicht öffnen";
open(WF,">comau.nc")||die print"Kann Datei nicht schreiben";
@inhalt=<OF>;
$index=0;
my $text = join("",@inhalt);
$text =~ s/\$\n//sg;
Jetzt sollen zusätzlich noch die Zahlen in folgender Form in eine String-Variable geschrieben werden.
[ Zahl1 Zahl2 Zahl3....usw]\n[ Zahl1 ......usw]\n

Ich habe versucht es mit folgendem Code in den Griff zu bekommen. Leider funktioniert das so nicht.

$text=~m/GOTO\s{0,4}\/\s{0,4}(.*),\s{0,4}(.*),\s{0,4}(.*),\s{0,4}(.*),\s {0,4}(.*),\s{0,4}(.*),\s{0,4}(.*),\s{0,4}(.*),\s{0 ,4}(.*)/ig;
Die vielen Kombinationen entsprechen den 9 Zahlen, welche gesucht werden sollen. Für das erste auftreten der 9 Zahlen bekomme ich auch die Ausgabe mit

print"$1 $2 $3 $4 $5 $6 $7 $8 $9";
aber wie mache ich das für jedes auftreten der Zahlen. Mit dem Parameter g für Global dachte ich eigentlich, dass das möglich ist....

Vielen Dank schon einmal für eure Hilfe.

Grüße,

Joachim

Caveman
02-03-2006, 09:40
Suche doch jeweils nach den Zahlen in einer while-Schleife.
Also so ungefähr:


if ($text =~ /GOTO/) # suche nach GOTO
{
my $string;

while ( $text =~ /([0-9.]{6,10})/g ) # suche nach Zahlen mit Laenge 6-10
{
# Verarbeite jeweils $1, z.B. mit join
$string .= ' ' . $1 #oder anhaengen an eine Variable
}
}
Die while-Schleife bewirkt nun, dass eine Zahl nach der anderen in der Variable $text gefunden wird.

Hilft Dir das weiter?

dvdjimmy
02-03-2006, 12:05
Hi Caveman,

erstmal vielen Dank für deinen Tip.

Ich habe es jetzt gelöst. Hier der Code meiner Lösung.


$text = join("",@inhalt);
$text =~ s/\$\n|\r//g;
@inhalt=split(/\n/,$text);


foreach $zeile (@inhalt) {
if($zeile=~m/GOTO\s{0,4}\/\s{0,4}(.*),\s{0,4}(.*),\s{0,4}(.*),\s{0,4}(.*),\s {0,4}(.*),\s{0,4}(.*),\s{0,4}(.*),\s{0,4}(.*),\s{0 ,4}(.*)/ig){
$match="[ $1 $2 $3 $4 $5 $6 $7 $8 $9 ]";
$matrixinput="$matrixinput$match\n";
}
}

Vielen Dank trotzdem.

Gruß,

Joachim

nic
03-03-2006, 12:25
Anscheinend hast du ja schon ne Loesung, allerdings schaut die ehrlich gesagt ganz schoen wuest aus ;)
Tut es nicht auch einfach ein

$line =~ s/[^\d\.\,]//g;
@foo = split(',', $line);

dvdjimmy
04-03-2006, 09:58
Das werde ich doch gleich einmal ausprobieren. Sieht schon einmal super aus. Wenn das wirklich funktionieren sollte bin ich aber platt :)

Gruß und ein schönes Wochenende.

Joachim

dvdjimmy
06-03-2006, 08:43
hi nic,

deine Lösung funktioniert auch wunderprächtig. Ist in der Tat ein klein wenig übersichtlicher als meine :)

Vielen Dank nochmals.

Joachim