Text umwandeln

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Cassiopeia
User
Beiträge: 5
Registriert: Sonntag 10. Februar 2008, 15:20
Kontaktdaten:

Sonntag 10. Februar 2008, 15:44

Grüße,

das Thema ist zwar schon etwas älter, aber wie es ausschaut wurde hier nich wirklich zu ende geredet.

Ich möchte ein Programm schreiben das mir eine Datei umwandelt. Ich habe mir den Code der Quell und der Zieldatei gut angeschaut und herausgefunden das nur die struktur etwas anders ist.

Ich hab noch nicht mit wirklich mit Python gearbeitet, habe nur ein Tutorial durchgearbeitet von dieser page: http://www.freenetpages.co.uk/hp/alan.g ... /index.htm

Mein Ziel ist es, dass das Programm folgenden Text in den darauf folgenden umwandelt.

QuellCode:

Code: Alles auswählen

solid
	{
		"id" "2"
		side
		{
			"id" "1"
			"plane" "(-1792 -640 160) (-1792 -640 128) (-1792 -128 128)"
			"material" "WALL/STONEWALL02C"
			"uaxis" "[0 1 0 0] 0.25"
			"vaxis" "[0 0 -1 128] 0.25"
			"rotation" "0"
			"lightmapscale" "16"
			"smoothing_groups" "0"
		}
		side
		{
			"id" "2"
			"plane" "(-1776 -128 160) (-1776 -128 128) (-1776 -640 128)"
			"material" "WALL/STONEWALL02C"
			"uaxis" "[0 1 0 0] 0.25"
			"vaxis" "[0 0 -1 128] 0.25"
			"rotation" "0"
			"lightmapscale" "16"
			"smoothing_groups" "0"
		}
		side
		{
			"id" "3"
			"plane" "(-1776 -640 160) (-1776 -640 128) (-1792 -640 128)"
			"material" "WALL/STONEWALL02C"
			"uaxis" "[-1 0 0 0] 0.25"
			"vaxis" "[0 0 -1 128] 0.25"
			"rotation" "0"
			"lightmapscale" "16"
			"smoothing_groups" "0"
		}
		side
		{
			"id" "4"
			"plane" "(-1792 -128 160) (-1792 -128 128) (-1776 -128 128)"
			"material" "WALL/STONEWALL02C"
			"uaxis" "[-1 0 0 -448] 0.25"
			"vaxis" "[0 0 -1 128] 0.25"
			"rotation" "0"
			"lightmapscale" "16"
			"smoothing_groups" "0"
		}
		side
		{
			"id" "5"
			"plane" "(-1792 -128 128) (-1792 -640 128) (-1776 -640 128)"
			"material" "TOOLS/TOOLSNODRAW"
			"uaxis" "[1 0 0 0] 0.5"
			"vaxis" "[0 -1 0 0] 0.5"
			"rotation" "0"
			"lightmapscale" "16"
			"smoothing_groups" "0"
		}
		side
		{
			"id" "6"
			"plane" "(-1792 -640 160) (-1792 -128 160) (-1776 -128 160)"
			"material" "WALL/SITEBWALL05"
			"uaxis" "[1 0 0 -305] 0.25"
			"vaxis" "[0 -1 0 -128] 0.25"
			"rotation" "0"
			"lightmapscale" "16"
			"smoothing_groups" "0"
		}
	}
ZielCode:

Code: Alles auswählen

// brush 2
{
 ( -1792 -640 160 ) ( -1792 -640 128 ) ( -1792 -128 128 ) caulk 64 64 0 0 0 0 lightmap_gray 16384 16384 0 0 0 0
 ( -1776 -128 160 ) ( -1776 -128 128 ) ( -1776 -640 128 ) caulk 64 64 0 0 0 0 lightmap_gray 16384 16384 0 0 0 0
 ( -1776 -640 160 ) ( -1776 -640 128 ) ( -1792 -640 128 ) caulk 64 64 0 0 0 0 lightmap_gray 16384 16384 0 0 0 0
 ( -1792 -128 160 ) ( -1792 -128 128 ) ( -1776 -128 128 ) caulk 64 64 0 0 0 0 lightmap_gray 16384 16384 0 0 0 0
 ( -1792 -128 128 ) ( -1792 -640 128 ) ( -1776 -640 128 ) caulk 64 64 0 0 0 0 lightmap_gray 16384 16384 0 0 0 0
 ( -1792 -640 160 ) ( -1792 -128 160 ) ( -1776 -128 160 ) caulk 64 64 0 0 0 0 lightmap_gray 16384 16384 0 0 0 0
}
Wie man sehn kann braucht der ZielCode aus jeder "side" vom Quellqode nur die "plane" Koordinaten. Den Rest könnte das Programm selber einfügen. Am ende Soll er das ganze in einer neuen Datei abspeichern.

Frage ist wie schreib ich mein Programm so das es das tut? schreibt mir bitte nicht nur modul-namen rein, ich kenn mich damit noch net so ganz aus. Es sind noch mehr sachen drinn die ersetzt werden müssen aber wenn mir hierzu jemand helfen kann, werd ich vllt auch mit dem andern kram klarkommen, ansonsten müsst ich halt nochmal fragen. ^^

Danke im Voraus
Gruß Cassiopeia
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sonntag 10. Februar 2008, 16:24

Ich denke das geht relativ einfach per regexp! Das sollte Dir helfen:
http://www.amk.ca/python/howto/regex/
Außerdem empfehle ich dazu kodos:
http://kodos.sourceforge.net/

Damit solltest Du das relativ einfach hinbekommen können!

Ciao,
Hyperion
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Sonntag 10. Februar 2008, 16:56

Nah das sieht doch ganz nach dem map-Format aus :-) Wenn ich mich richtig erinnere, konnten dort beliebig tiefe Verschachtelungen innerhalb der Objekte erstellt werden, da reichen einfache Reguläre Ausdrücke nicht mehr aus.

Entweder würde ich gleich den Inhalt vernünftig parsen oder, du baseltst dir einen kleinen Pseudo-Parser für dieses Format. Dazu sollte es genügen, wenn du dich an den öffnenden und schliessenden geschwungenen Klammern orientierst (rekursiv durch die Ebenen). Die letzte Ebene, mit dem eigentlichen Inhalt, kannst du dann schnell mit Regulären Ausdrücken abarbeiten:

Code: Alles auswählen

solid
|-id (hier mit REs arbeiten)
|-side
| |-Hier mit REs arbeiten
|-side
| |-Hier auch mir REs arbeiten
Um die Eizelnen Ebenen zu modellieren sollte ein einfaches Dictionary genügen. Eigene Klassen wären natürlich etwas komfortabler.

Für das Format sollte es in jedem Fall genügen.
Cassiopeia
User
Beiträge: 5
Registriert: Sonntag 10. Februar 2008, 15:20
Kontaktdaten:

Sonntag 10. Februar 2008, 20:20

gibts da auch deutsche Seiten die das erklärn @Hyperion? ich tu mich immer echt schwer bei englischen Seiten "code" von "geschwafel" zu unterscheiden.


ps.: Ja es ist ein .map-file :D
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sonntag 10. Februar 2008, 21:16

Also da mußt Du schon mal selber googlen ;) Oder such mal hier im Forum! Ich bin sicher das wird nicht so schwer sein, sich in die Basics davon einzuarbeiten. Und ohne Verschachtelungen ist es auch sehr sehr simpel ...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Montag 11. Februar 2008, 17:00

"Einfach mit RE" ist es natürlich nur, wenn man sich mit RE auskennt oder den Aufwand nicht scheut, sich damit gründlich zu beschäftigen.

Vielleicht habe ich ja etwas falsch verstanden, aber ich würde es ohne RE und irgendwelche rekursiven Geschichten so machen:

Originaldatei zeilenweise einlesen, jeweils prüfen, ob das Schlüsselwort "plane" vorkommt, anhand der ersten sich öffnenden und der letzten sich schließenden Klammer mittels der String-Methoden .index() bzw. .rindex() den benötigten Bereich mit den Zahlentripeln ermitteln, mittels Slicing den benötigten Teil kopieren und in die Zieldatei schreiben.

Oder übersehe ich da irgendetwas?
Cassiopeia
User
Beiträge: 5
Registriert: Sonntag 10. Februar 2008, 15:20
Kontaktdaten:

Montag 11. Februar 2008, 18:07

Hört sich so garnich schlecht an. Leider versteh ich soziemlich null davon, und bräuchte eigentlich sowas wie n codeschnippsel um was damit anfangen zu können.

Ich bin imo schon wie wild am googln um mal irgendwie n codeschnippsel oder n beispiel zu bekommen, allerdings scheint das net wirklich viel zu bringen.
BlackJack

Montag 11. Februar 2008, 18:33

Python-Tutorial aus der Doku durcharbeiten. Doku zu Dateiobjekten und Zeichenketten nach nützlichem absuchen. Und ein wenig interaktiv ausprobieren.

Code: Alles auswählen

In [478]: cat test.txt
a truediv 1000
b mul 153

In [479]: f = open('test.txt')

In [480]: for line in f:
   .....:     print line,
   .....:
a truediv 1000
b mul 153

In [481]: line = '      a(1 2 3)     \n'

In [482]: line.strip()
Out[482]: 'a(1 2 3)'

In [483]: line = line.strip()

In [484]: line.startswith('a(')
Out[484]: True

In [485]: line.index('(')
Out[485]: 1

In [486]: line.rindex(')')
Out[486]: 7

In [487]: line[2:7]
Out[487]: '1 2 3'
Cassiopeia
User
Beiträge: 5
Registriert: Sonntag 10. Februar 2008, 15:20
Kontaktdaten:

Montag 11. Februar 2008, 18:40

wasn für ne doku, häää??? :shock:

aus dem code werd ich net schlau.
Cassiopeia
User
Beiträge: 5
Registriert: Sonntag 10. Februar 2008, 15:20
Kontaktdaten:

Montag 11. Februar 2008, 19:06

oh nee, net scho wieder englisch :cry:

Ich werd jahre brauchen bis ich da durchsteige, ich glaub ich sollts wohl besser lassen.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Montag 11. Februar 2008, 19:21

Mach doch einfach das, was BlackJack vorgeschlagen (und auch gleich demonstriert) hat: Interaktiv experimentieren! Das ist doch (auch) das Tolle an Python!

Und, mal ehrlich: Wenn du die Lektüre englischsprachiger Doku etc. scheust, dann wirst du es mit dem Programmieren vermutlich immer schwer haben.

Auch wenn man im Englischen nicht so fit ist: DAS Original Python-Tutorial liest sich bestimmt einfacher als ein englischer Zeitungsartikel, weil sich manche Fachbegriffe gar nicht so sehr vom Deutschen bzw. den auch im Deutschen üblichen Fachbegriffen für diese Dinge unterscheiden.

Es gibt natürlich auch dt. Tutorials im Netz, aber so wie ich das sehe kranken die so ziemlich alle daran, dass sie vom aktuellen Stand mehr oder weniger weit entfernt sind; meistens eher "mehr". (Natürlich lasse ich mich gerne vom Gegenteil überzeugen).

Sicher wäre es kein Problem, dass irgendjemand den von dir gewünschten "Codeschnipsel" (am besten gleich das ganze Skript ...) hier postet, aber etwas mehr eigene Anstrengung wird schon erforderlich sein, wenn du Python wirklich verstehen willst. In diesem Sinne: Nicht aufgeben, sondern lesen, experimentieren und schlauer werden ...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 11. Februar 2008, 20:24

pütone hat geschrieben:Es gibt natürlich auch dt. Tutorials im Netz, aber so wie ich das sehe kranken die so ziemlich alle daran, dass sie vom aktuellen Stand mehr oder weniger weit entfernt sind; meistens eher "mehr". (Natürlich lasse ich mich gerne vom Gegenteil überzeugen).
Für das was Anfänger brauchen reichen auch ältere Tutorials (hauptsache sie sind brauchbar und nicht Schrott). Man muss nicht am zweiten Tag schon das ``with``-Statement verstehen und die Contextlib verwenden.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Dienstag 12. Februar 2008, 10:42

kleiner tip wie man das auf einfachstem wege erreichen könnte ...
befasse dich mit string methoden.

Code: Alles auswählen

text = '        {\n            "id" "6"\n            "plane" "(-1792 -640 160) (-1792 -128 160) (-1776 -128 160)"\n            "material" "WALL/SITEBWALL05"\n            "uaxis" "[1 0 0 -305] 0.25"\n            "vaxis" "[0 -1 0 -128] 0.25"\n            "rotation" "0"\n            "lightmapscale" "16"\n            "smoothing_groups" "0"\n        }'

for line in text.splitlines():
 	if line.strip().startswith('"plane"'):
 		line = line.strip().split(" ", 1)[1].replace('"', '')
 		print line + ".... X Y Z Blah"
 		
(-1792 -640 160) (-1792 -128 160) (-1776 -128 160).... X Y Z Blah
Antworten