script dxf in xml File wandeln

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

script dxf in xml File wandeln

Beitrag von mclien » 29.03.2012 22:27:32

Ich will gerade ine script fabrizieren, daß ein dxf file nach bestimmten Mustern in ein xml file umwandelt nd scheittere mal wieder auf niedrigem Niveau.
also sagen wir ich habe dies:

Code: Alles auswählen

bla
bla
bla
CIRCLE
  8
OUTLINE
 62
     4
 10
233.343750
 20
102.937500
 40
20.812500
  0
blba
..
bla
CIRCLE
  8
OUTLINE
 62
     1
 10
134.906250
 20
162.562500
 40
44.309150
  0
blabbla
laber
erstmal will ich hier hin:

Code: Alles auswählen

CIRCLE
4
233
103
21
CIRCLE
1
135
163
44
danach soll das ganze dann in XML tags verpackt werden....

Also eigentlich brauch ich nur bestimmte Zeilen des Textfiles nach einem Bestimmten Wort ausgeben.
Das hier habe ich schon hinbekommen:

Code: Alles auswählen

cat map_script_test.dxf | grep -A11 CIRCLE
Da gibt es dann alles ohne das bla dazwischen
Mache ich dann mit sed weiter:

Code: Alles auswählen

sed -n -e '1p' -e '5p' -e '7p' -e '9p' -e '11p'
bekomme ich direkt ge-piped natürlich nur den ersten Treffer zurück.
Aber irgendwie bekomme ich die Schleife nicht gebaut, wie ich halt nach allen Treffern die Zeilen 1,5,7,9 und 11 zurückbekomme..
..vom korrekten runden der Zahlen mal ganz abgesehen..

EDIT:
eigentlich brauchte es ja nur folgendes machen:
-finde das wort CIRCLE
-mache mit Zeile nummer1 das und das
-mache mit zeile 5 das und das

usw.

leider bekomme ich es aber nicht hin. (Jedenfalls nicht ohne vorher 2-7 Mal in ein temp file zu schreiben...

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: script dxf in xml File wandeln

Beitrag von Cae » 30.03.2012 08:39:20

mclien hat geschrieben:

Code: Alles auswählen

cat map_script_test.dxf | grep -A11 CIRCLE
Wah! Use:

Code: Alles auswählen

$ grep foo /path/to/bar
mclien hat geschrieben:leider bekomme ich es aber nicht hin. (Jedenfalls nicht ohne vorher 2-7 Mal in ein temp file zu schreiben...
Zeig' trotzdem mal deinen Code, damit lässt sich erfahrungsgemäß besser arbeiten. Es erscheint mir geschickt, awk einzusetzen, um den finalen XML-Text zu gewinnen, da du Variablen verwenden kannst, mit sed ist das über stdout etwas frickelig.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: script dxf in xml File wandeln

Beitrag von Liffi » 30.03.2012 09:03:25

Vielleicht kann dir auch Debianxmlstarlet dabei helfen, die XML Datei zu erzeugen.

mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

Re: script dxf in xml File wandeln

Beitrag von mclien » 30.03.2012 11:28:26

Wirklichen code habe ich noch nicht. Ich habe einfach auf der CLI ein paar Kommandos per grep und sed mit pipe verbunden.
Und dann bin ich schon an der for loop gescheitert.
Was mir fehlt ist eher der Anfang: Wie gebe ich die Zeilen 5,7,9,11 nach der Zeile "CIRCLE" aus? die kann ich dann ja jeweils in eine Variable schreiben und damit weiterarbeiten. Und das ganze soll sich dann für jede gefundene "CIRCLE" Zeile wiederholen.

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: script dxf in xml File wandeln

Beitrag von Liffi » 30.03.2012 12:39:16

mclien hat geschrieben: Was mir fehlt ist eher der Anfang: Wie gebe ich die Zeilen 5,7,9,11 nach der Zeile "CIRCLE" aus? die kann ich dann ja jeweils in eine Variable schreiben und damit weiterarbeiten. Und das ganze soll sich dann für jede gefundene "CIRCLE" Zeile wiederholen.
Vielleicht ist es mit Perl ein wenig einfacher:

Code: Alles auswählen

perl -e '$counter=0;
while (<>)
{
    $counter++;
    if( $_=~/CIRCLE/ )
    {
        $counter=0;
    }
    if ( $counter == 5 )
    {
        print $_;
    }
    elsif ( $counter == 7 )
    {
        print $_;
    }
}' datei

mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

Re: script dxf in xml File wandeln

Beitrag von mclien » 30.03.2012 12:47:26

[quote="Liffi"]
Vielleicht ist es mit Perl ein wenig einfacher:
[/qoute]
Ich habs ja befürchtet . (Leider beschränkt sich mein Wissen zu perl darauf, dass eine Programmierspreche ist)
Aber wahrscheinlich hast Du Recht, meine (jämmerlichen) awk versuche haben bisher nur hierhin geführt:

Code: Alles auswählen

awk '/CIRCLE/{getline;getline;getline;getline;print;getline;getline;print;getline;getline;print;getline;getline;print}'  file
(ohne Zeilenumbrüche, die baut die Forensoftware dawzischen)
Zuletzt geändert von mclien am 30.03.2012 18:05:25, insgesamt 1-mal geändert.

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: script dxf in xml File wandeln

Beitrag von Liffi » 30.03.2012 12:52:59

mclien hat geschrieben:
Liffi hat geschrieben: Vielleicht ist es mit Perl ein wenig einfacher:
Ich habs ja befürchtet . (Leider beschränkt sich mein Wissen zu perl darauf, dass eine Programmierspreche ist)
Perl kann awk und sed sehr nah kommen (manchmal führt das auch zu recht schwer lesbarem Code, aus dieser Richtung kommt auch der schlechte Ruf der Sprache).
Wenn du dich also recht gut mit awk auskennst, sollte es nicht allzu schwer sein, dieses Problem in Perl zu lösen.

mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

Re: script dxf in xml File wandeln

Beitrag von mclien » 30.03.2012 18:07:13

naja, eigentlich bin ich auf allen Gebieten eher ein Stümper.
Dann könnte ich mir auch gleich perl aussuchen, wenn ich irgendwann mal etwas einigermassen beherrschen will...

mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

Re: script dxf in xml File wandeln

Beitrag von mclien » 30.03.2012 18:53:33

Liffi hat geschrieben: Vielleicht ist es mit Perl ein wenig einfacher:

Code: Alles auswählen

perl -e '$counter=0;
while (<>)
{
    $counter++;
    if( $_=~/CIRCLE/ )
    {
        $counter=0;
    }
    if ( $counter == 5 )
    {
        print $_;
    }
    elsif ( $counter == 7 )
    {
        print $_;
    }
}' datei
OK, dann mache ich mich mal ans perl verstehen:
zunächst wird die Var $counter auf "0" gesetzt,
in der while Schleife wird der counter hochgezählt, und die Zeilen mit der passenden Nummer ausgegeben.
wird der Pattern "CIRCLE" gefunden wird er counter wieder auf null gesetzte.
Leider gibt das script so aber auch 2 Zeilen aus bevor "CIRCLE" zum ersten mal gefunden wird.... (und das schnalle ich nicht)

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: script dxf in xml File wandeln

Beitrag von Cae » 30.03.2012 20:53:23

Naja, bevor CIRCLE gefunden wird und die Nullstellung wirkt, kommt je fünf und sieben einmal dran, also ein logischer Fehler (da bin ich aber auch nicht sofort drauf gekommen). Eine Lösung wäre es, den couter zum Beispiel mit 7 zu initialisieren, dann wird er zu 8 inkrementiert und die 5er- und 7er-Zeilen wirken nicht.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: script dxf in xml File wandeln

Beitrag von Liffi » 30.03.2012 21:08:01

Cae hat geschrieben:Naja, bevor CIRCLE gefunden wird und die Nullstellung wirkt, kommt je fünf und sieben einmal dran, also ein logischer Fehler (da bin ich aber auch nicht sofort drauf gekommen). Eine Lösung wäre es, den couter zum Beispiel mit 7 zu initialisieren, dann wird er zu 8 inkrementiert und die 5er- und 7er-Zeilen wirken nicht.
Hab ich natürlich absichtlich eingebaut, um zu gucken, ob jemand aufpasst *hust* ;-).

mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

Re: script dxf in xml File wandeln

Beitrag von mclien » 30.03.2012 22:51:49

vielen Dank für die Hilfe schonmal, geht jetzt voran.
Werde mich dann wieder melden, wenn dxf2aamap.pl (konvertiert dxf-files zu map-file für armagetronad) zur Zufriedenheit meines Sohnes läuft.

so long
mclien

PS: "inkrementiert musste ich erstmal googlen ;-)

mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

Re: script dxf in xml File wandeln

Beitrag von mclien » 31.03.2012 13:52:18

Gerade ist noch eine Frage aufgetaucht, die Ausgabe betreffend:

Code: Alles auswählen

print $_;
print $rounded;
ersteres macht einen Zeilenumbruch, letzteres nicht. Wieso?

EDIT:
und nocheins:

Code: Alles auswählen

while (<>)
{
...
} datei
wie mache ich das wenn ich ein script benutzte und nicht direkt in der shall arbeite?
Und wie kann ich die gleiche datei als input für mehrere while Schleifen hintereinander benutzen? (oder muss ich die dann schachteln?

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: script dxf in xml File wandeln

Beitrag von Liffi » 31.03.2012 15:15:19

Schön, dass du dich jetzt ernsthaft damit beschäftigst :-).
Ein richtiges Script fängt man am besten noch mit dem folgenden an:

Code: Alles auswählen

use strict; # Verhindert Perl, dass man nächste Woche nicht mehr lesen kann und krasse Fehler 
use warnings; # Gibt brauchbare Warnungen aus
Dabei ist zu beachten, dass man bei der Variablendeklaration ein my davor schreiben muss.
Beispiel:

Code: Alles auswählen

my $counter = 8;
print $counter;
mclien hat geschrieben:Gerade ist noch eine Frage aufgetaucht, die Ausgabe betreffend:

Code: Alles auswählen

print $_;
print $rounded;
ersteres macht einen Zeilenumbruch, letzteres nicht. Wieso?
Erstmal: In $_ steht die ganze Zeile drin, die durch die while Schleife erzeugt wird. Darin ist auch das Zeilenumbruchzeichen enthalten (unter Linux '\n').
Deshalb gibt es hierbei einen Zeilenumbruch. Wenn du einen Zeilenumbruch hinzufügen möchtest:

Code: Alles auswählen

print "$rounded\n"; # Variablen in '"' werden interpretiert
oder

Code: Alles auswählen

print $rounded . "\n"; # der '.'-Operator hängt Strings an

Code: Alles auswählen

while (<>)
{
...
} datei
wie mache ich das wenn ich ein script benutzte und nicht direkt in der shall arbeite?
Und wie kann ich die gleiche datei als input für mehrere while Schleifen hintereinander benutzen? (oder muss ich die dann schachteln?

Code: Alles auswählen

open( my $file_handle, '<', 'datei1.txt' ); #öffnet datei1.txt im Lesemodus
while my $line ( <$file_handle> ) # laufe über alle Zeilen
{
    print $line;
}
Damit steht der Inhalt von '$_' , also jeder gelesenen Zeile auch in '$line'. Das ist vielleicht ein bisschen lesbarer, wenn das Skript ein wenig größer ist.

mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

Re: script dxf in xml File wandeln

Beitrag von mclien » 31.03.2012 18:59:25

Danke für die Tips und Erklärungen, fängt auch langsam an Spass zu machen.
Runden habe ich auch schon "gelernt", wie man aus der Variablen im Beispiel sicher sehen konnte :-).

Zu dem input aus einer Datei:
wenn ich das script so aufrufen will:

Code: Alles auswählen

irgendeinscript.pl inputdatei
Ist innerhalb des Scripts dann "$1" mit der inputdatei gefüllt (analog zu bash)?

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: script dxf in xml File wandeln

Beitrag von Liffi » 31.03.2012 19:04:15

mclien hat geschrieben: Zu dem input aus einer Datei:
wenn ich das script so aufrufen will:

Code: Alles auswählen

irgendeinscript.pl inputdatei
Ist innerhalb des Scripts dann "$1" mit der inputdatei gefüllt (analog zu bash)?
Bei Perl gibt es dafür das Array '@ARGV'. Skalare Variablen beginnen mit '$', Arrays mit '@'.
Um jetzt auf das erste Element von 'ARGV' zuzugreifen, kann man zum Beispiel das folgende tun:

Code: Alles auswählen

my $file_name = $ARGV[0]; # Hier nimmt man wieder $ statt @, weil ARGV[0] ein Skalar ist
Alternativ:

Code: Alles auswählen

my $file_name = shitf(@ARGV); # shift entfernt das erste Element aus dem Array und gibt es zurück

mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

Re: script dxf in xml File wandeln

Beitrag von mclien » 31.03.2012 19:21:51

Liffi hat geschrieben:

Code: Alles auswählen

open( my $file_handle, '<', 'datei1.txt' ); #öffnet datei1.txt im Lesemodus
while my $line ( <$file_handle> ) # laufe über alle Zeilen
{
    print $line;
}
Damit steht der Inhalt von '$_' , also jeder gelesenen Zeile auch in '$line'. Das ist vielleicht ein bisschen lesbarer, wenn das Skript ein wenig größer ist.
Hmm, habe ich gerade getestet:

Code: Alles auswählen

Global symbol "$line" requires explicit package name at ./test.pl line 7
Global symbol "$line" requires explicit package name at ./test.pl line 9
Mit der Variablen "$_" läufts. Auch wenn ich es vor her declariere, gehts nicht ( my $line="irgendwas")

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: script dxf in xml File wandeln

Beitrag von Liffi » 01.04.2012 08:19:29

mclien hat geschrieben:
Liffi hat geschrieben:

Code: Alles auswählen

open( my $file_handle, '<', 'datei1.txt' ); #öffnet datei1.txt im Lesemodus
while my $line ( <$file_handle> ) # laufe über alle Zeilen
{
    print $line;
}
Damit steht der Inhalt von '$_' , also jeder gelesenen Zeile auch in '$line'. Das ist vielleicht ein bisschen lesbarer, wenn das Skript ein wenig größer ist.
Hmm, habe ich gerade getestet:

Code: Alles auswählen

Global symbol "$line" requires explicit package name at ./test.pl line 7
Global symbol "$line" requires explicit package name at ./test.pl line 9
Mit der Variablen "$_" läufts. Auch wenn ich es vor her declariere, gehts nicht ( my $line="irgendwas")
Oh. Mein Fehler:

Code: Alles auswählen

while ( my $line = <$file_handle> )
{
}

sisam
Beiträge: 19
Registriert: 01.04.2012 11:17:04

Re: script dxf in xml File wandeln

Beitrag von sisam » 01.04.2012 11:36:15

Hallo Forum
Ich bin mclien's sohn und will das script weiter schreiben.
da wollte ich mal fragen wie man in perl maskier.

sisam

sisam
Beiträge: 19
Registriert: 01.04.2012 11:17:04

Re: script dxf in xml File wandeln

Beitrag von sisam » 01.04.2012 12:13:46

=O ich meine maskiert.

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: script dxf in xml File wandeln

Beitrag von Liffi » 01.04.2012 12:36:34

Es gibt einen edit Button ;-).
sisam hat geschrieben: da wollte ich mal fragen wie man in perl maskiert.
Meinst du damit Manipulationen der Bitmaske?
Oder 'Escapen' von Sonderzeichen à la '"'?

sisam
Beiträge: 19
Registriert: 01.04.2012 11:17:04

Re: script dxf in xml File wandeln

Beitrag von sisam » 01.04.2012 12:54:42

Letzteres,
halt die Entsprechung von "\" in bash scripten. zB. html oder xml tags

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: script dxf in xml File wandeln

Beitrag von Cae » 01.04.2012 13:53:36

Ich interpretiere das mal so:

Code: Alles auswählen

my bar  = '$foo=' . $foo;
my bar2 = "\$foo=$foo";
Du hast jeweils Ausdrücke, die normalerweise zum Inhalt von $foo expandiert werden würden, aber es beim ersten Vorkommen in der Zeile nicht sollen. Lösung ist der Einsatz von Tics ' oder eines Backslashes. Falls meine Glaskugel jetzt keinen Glückstreffer erzielt hat, schreibst du besser, was genau du erreichen willst.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

sisam
Beiträge: 19
Registriert: 01.04.2012 11:17:04

Re: script dxf in xml File wandeln

Beitrag von sisam » 01.04.2012 14:21:34

veilen dank, deine Glaskugel funktioniert prima und das wolte ich ereichen

Code: Alles auswählen

~$ perl -e 'print "\<wall>\n";'
<wall>

sisam
Beiträge: 19
Registriert: 01.04.2012 11:17:04

Re: script dxf in xml File wandeln

Beitrag von sisam » 01.04.2012 15:05:59

ich hab noch ne frage undzwar wie ich heir »Point« und »ChapeCycle« vertauschen kann.

Code: Alles auswählen

CIRCLE
<zone effect="win">
                <Point x="233" x="103">
        <ShapeCycle radous="21">
CIRCLE
<zone effect="death">
                <Point x="135" x="163">
        <ShapeCycle radous="44">
Zuletzt geändert von sisam am 01.04.2012 15:17:54, insgesamt 1-mal geändert.

Antworten