Script zum massenhaften Ändern von einträgen in Dateien

Weedlord

Fleet Admiral
Registriert
Aug. 2013
Beiträge
16.306
Hallo, ich möchte ein Script erstellen, was bestimmte Einträge in einer Datei per klick invertiert.

Es sind halt über 9000 Textblöcke die bearbeitet werden müssen, per Hand würde das ewig dauern, es handelt sich um Angaben einer x und y Achse. Ich möchte nun das die Werte quasi invertiert werden. Als Beispiel, ist Wert x maximal 8000 und minimum 0 und der Wert im Textblock entspricht 2000, soll er auf 6000 geändert werden. Das selber beim Y Wert.

Aufbau der Datei:

1708799529343.png


Ich möchte hier vorallem die Positionen invertieren. Bei der Siege Unit Datei die identisch aufgebaut ist, möchte ich auch die Rotations invertieren. Es wäre daher nützlich wenn ich die Dateien einfach per Hand auswählen könnte die bearbeitet werden sollen oder zumindest den Dateinamen in das Fenster eingeben könnte. Eine Oberfläche braucht das nicht, denke das reicht wenn es normal über die Kommandozeile funktioniert. OS ist win 11.

Wenn ich das Script in Visual Studio Code schreiben könnte wäre das super und wenn es dafür eine Anleitung geben würde. Ich würde das gerne lernen und nicht einfach was fertiges bekommen, das dass erstellen von Scripten mir beim erstellen von Mods potential denke ich weiterhelfen könnte.

Was ich außerdem suchen würde, wäre eine Anleitung zu einem Script, mit dem ich automatisiert doppelte Textblöcke deaktivieren könnte, wobei ich da evtl. einen neuen Thread für erstelle, aber vielleicht hat da einer einen Tipp für mich. Und zwar müsste beim doppelten Textblock, entweder dem ersten oder dem zweiten ein "#" for alle Zeilen des Blockes gesetzt werden, oder zumindest vor den brackets des blockes um diesen zu deaktivieren.

Ich hoffe ich habe nichts vergessen zu erwähnen, vielen dank schonmal im Vorraus.^^
 

Anhänge

  • 1708799309128.png
    1708799309128.png
    307,4 KB · Aufrufe: 48
Servus, ich würde das JSOn in eine DB-Spalte laden - und dann via SQL zu einem neuen Jason transformieren

Eventuell hier https://jsoneditoronline.org - leider ist dein Sample nur ein Bild sonst könnte mann da etwas versuchen
 
Zuletzt bearbeitet:
Das sollte theoretisch mit notepad++ und Regex möglich sein.
 
  • Gefällt mir
Reaktionen: Weedlord
Alexander2 schrieb:
also einfach nen Minus davorsetzen? das passt aber nicht zu deinem anderen text.
Nah, es geht darum Map Positionen zu ändern. Ich möchte das das Objekt auf der genau gegenüberliegenden Seite der Map liegt. Invertieren bedeutet hier quasi den entgegengesetzten Wert auf der x und Y Achse zu nehmen. Bei einer Spanne von 0 bis 8000 bei x wäre das bei einem Standard Wert von 2000, 6000
Ergänzung ()

dms schrieb:
Servus, ich würde das JSOn in eine DB-Spalte laden - und dann via SQL zu einem neuen Jason transformieren
Ich bin leider noch nicht so tief in der Materie um zu verstehen was mit JSOn gemeint ist. Ist damit Java Script gemeint?

Das hier wäre die komplette Datei falls sich das einer anschauen möchte.
 

Anhänge

  • building_locators.txt
    1,3 MB · Aufrufe: 29
  • Gefällt mir
Reaktionen: Weedlord
korbenm schrieb:
Das sollte theoretisch mit notepad++ und Regex möglich sein.
Ich schau mir das mal an. Man kann hier wohl scheinbar patterns hinzufügen. Das klingt erstmal nicht schlecht
 
Alexander2 schrieb:
also einfach nen Minus davorsetzen? das passt aber nicht zu deinem anderen text.
ich glaube er meint seinen Wert in der Datei - 8000 und davon den Betrag

also so:
1708802070267.png
 
Zuletzt bearbeitet:
dms schrieb:
.. ist
Code:
position={ 271.722198/*X*/ 0.000000/*Y*/ 3950.798096/*Z*/ }
und dann?
0 ist denke ich die Höhe. Der Wert ist denke ich aus Engine Technischen gründen drinn und sollte immer gleich bleiben. Der erste und dritte sind x und y
 
Weedlord schrieb:
Wert x maximal 8000 und minimum 0 und der Wert im Textblock entspricht 2000, soll er auf 6000 geändert werde
und nun bitte mal den Rechenweg für 271.722198 ...
 
Zuletzt bearbeitet: (Typofix)
Ich glaube, dass das mit Regex nicht geht, weil man die Zahlen Parsen muss. Ein "Invertieren" im Sinne von Minus voranstellen oder entfernen würde hingegen mit Regex gehen.

Grundlegend: Die entsprechenden Zeilen einlesen, Zahlen ändern und wieder rausschreiben. Sonstige Zeilen unverändert rausschreiben.

Welche Sprache ist prinzipiell egal. Bspw. Python.
 
Ok, ich hab jetzt nochmal einen Blick drauf geworfen. Der höchste Y Wert ist 4095 und der höchste X Wert scheint 6700 zu sein.

Edit: ok, es ist sogar 6900 als höchster X Wert.

Der erste Wert ist X und der dritte Wert ist Y
 
Python:
import re

with open("building_locators.txt") as i:
  with open("result.txt", "w") as o:
    for line in i.readlines():
      if re.search(r"^\s+position", line):
        pos = line.strip().split()
        line = "\t\t\tposition={ %.6f 0.000000 %.6f }\n" % (8000 - float(pos[1]), 8000 - float(pos[3]))
      o.write(line)
 

Anhänge

  • result.txt
    1,3 MB · Aufrufe: 27
  • Gefällt mir
Reaktionen: mae1cum77, Raijin, Der Lord und 4 andere
Oh Nice, danke sehr. ich schau mir den Code mal genauer an und änder dann einfach die Werte an die korrekten. Dann müsste ich damit die Datei recht schnell invertieren können :)

Welche Sprache hast du da verwendet? Python richtig?
 
Wenn ich jetzt das ganze für die SIege_units Datei machen möchte, wo ich auch die Rotations umkehren wollte, muss ich ja nur die Zeile "if re.search(r"^\s+position", line):" ändern zu "if re.search(r"^\s+rotation", line):"

Edit: ok und ich muss die Positionen anpassen, bei Rotation gibt es ja 4 Werte
 
Zuletzt bearbeitet:
simpsonsfan schrieb:
Ich glaube, dass das mit Regex nicht geht, weil man die Zahlen Parsen muss. Ein "Invertieren" im Sinne von Minus voranstellen oder entfernen würde hingegen mit Regex gehen.

Grundlegend: Die entsprechenden Zeilen einlesen, Zahlen ändern und wieder rausschreiben. Sonstige Zeilen unverändert rausschreiben.

Welche Sprache ist prinzipiell egal. Bspw. Python.
Es geht fast alles mit Regex.
Wird nur irgendwann kompliziert und nicht mehr lesbar.

Pattern: (position=\{).([0-9]\.[0-9]).([0-9]\.[0-9]).([0-9]\.[0-9]) (\})
Replace pattern: $1 $4 $3 $2 $5

Seite zum testen: https://regexr.com/
Text zum testen:
position={ 271.722198 0.000000 3950.798096 }
position={ 11.722198 0.000000 22.798096 }
position={ 1.11111 2.22222 3333.3333 }

Der Trick ist Gruppen zu benutzen. (mit diesen "()" Klammern)
Dann kann man im Replace die Gruppen in einer anderen Reihenfolge wieder zusammenbauen.
Die Leerzeichen hab ich alle aus den Gruppen raus gelassen.
Gruppe 1 ist "position={"
Gruppe 2 ist die erste Zahl
Gruppe 3 ist die zweite Zahl
Gruppe 4 ist die dritte Zahl
Gruppe 5 ist "}"

Also wird beim replace aus $1 $2 $3 $4 $5 => $1 $4 $3 $2 $5
 
  • Gefällt mir
Reaktionen: Raijin und simpsonsfan
@korbenm Alles schön und gut. Aber das gewünschte Ergebnis war nicht
Code:
position={ 3950.798096 0.000000 271.722198 }
position={ 22.798096 0.000000 11.722198 }
position={ 3333.3333 2.22222 1.11111 }
sondern
Code:
position={ 7728.277802 0.000000 4049.201904 }
position={ 7988.277802 0.000000 7977.201904 }
position={ 7998.88889 2.22222 4666.6667 }
(mit 8000 als max. Koordinate. Und nach meinem Wissensstand ist Arithmetik mit Regex nicht möglich. Ich lerne aber gerne dazu, wenn du da 'ne Idee hast.
 
  • Gefällt mir
Reaktionen: Raijin
Du hast Recht.
Hab die Problemstellungen missverstanden.
Für den Fall ist regex definitiv die falsche Wahl.
 
Zurück
Oben