Script zum massenhaften Ändern von einträgen in Dateien

Ich bin vermutlich zu spät zur Party, aber ich wollte gerne noch eine awk-Lösung beisteuern:

Bash:
$ cat test.txt
game_bla={
    name=build
    clamp=yes
    instance={
        {
             id=1
             position={ 271.722198 0.000000 3950.798096 }
             rotation={ -0.000000 -0.000000 -0.000000 }
        }
        {
             id=2
             position={ 100.000000 0.000000 50.000000 }
             rotation={ -0.000000 -0.000000 -0.000000 }
        }
    }
}
$
$ awk '{ if ($0 ~ /^\s*position=.*/) { $2=8000-$2; $4=8000-$4; printf("%12s %s %.6f %s %.6f %s\n", " ", $1, $2, $3, $4, $5); } else print $0; }' test.txt
game_bla={
    name=build
    clamp=yes
    instance={
        {
             id=1
             position={ 7728.277802 0.000000 4049.201904 }
             rotation={ -0.000000 -0.000000 -0.000000 }
        }
        {
             id=2
             position={ 7900.000000 0.000000 7950.000000 }
             rotation={ -0.000000 -0.000000 -0.000000 }
        }
    }
}
$
$ # Ausgabe in eine neue Datei:
$ awk '{ if ($0 ~ /^\s*position=.*/) { $2=8000-$2; $4=8000-$4; printf("%12s %s %.6f %s %.6f %s\n", " ", $1, $2, $3, $4, $5); } else print $0; }' test.txt > invertierte_ausgabe.txt

Ich hoffe es ist trotzdem noch nützlich/ interessant.

Edit:
Ich habe jetzt erst die zweite Frage zu doppelten Textblöcken gesehen. Hast du mal Beispiel-Textblöcke? Dürfen die Textblöcke neu sortiert werden und dann in sortierter Reihenfolge vorliegen oder muss außer dem Kommentar am Anfang der Zeile alles unverändert bleiben?
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: simpsonsfan, Der Lord und H4110
Doch. Beispiel:
Bash:
echo "7 191" | awk '{ print $1*$2 }'
...liefert das erwartete Produkt.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: R00kie und Der Lord
0x8100 schrieb:
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)
Hi, also ich habe die Map soweit fertig bearbeitet und auch das Terrain usw. komplett. Die Building Locators konnte ich erfolgreich invertieren!^^

Ich muss jetzt noch schauen wie ich das Script für die anderen Dateien anpasse, falls ich es heute nicht hinbekommen sollte frage ich einfach die Tage nochmal um Hilfe. Ich poste außerdem später meine fertige Mod für die die vielleicht CK3 spielen und interessiert sind :D

So sieht die map schonmal aus^^

Diese Schwarzen Punkte rechts sind weg wem man ins Spiel geladen hat, dafür muss ich auch mal nee Lösung suchen. GGf. muss ich dafür den Tisch etwas bearbeiten was wohl auch möglich ist.

dbgfcnbcgvnbcvgnbcv.jpg

Ergänzung ()


Edit:

Ok, ich habe sogar jetzt schon eine Frage, wie muss ich das Script umschreiben um mit negativen Werten zu Arbeiten?

Maximaler Wert ist 1 und minimaler Wert ist -1

Geht um die Rotation:

1709732678889.png
 

Anhänge

  • result_Building_locators.txt
    1,4 MB · Aufrufe: 14
  • 1709732619932.png
    1709732619932.png
    154 KB · Aufrufe: 32
Zuletzt bearbeitet:
Weedlord schrieb:
Diese Schwarzen Punkte rechts sind weg wem man ins Spiel geladen hat, dafür muss ich auch mal nee Lösung suchen.
Sieht aus wie die Nietenköpfe des Stahlbandes vom Tisch, nur falsche Ebene.
 
  • Gefällt mir
Reaktionen: Alexander2
Weedlord schrieb:
Ok, ich habe sogar jetzt schon eine Frage, wie muss ich das Script umschreiben um mit negativen Werten zu Arbeiten?
wie bei der position zuvor kannst du ja irgendwas berechnen. aber k.a. was genau du da wie berechnen willst, ich weiss ja nicht, was du vor hast :)
 
Alexander2 schrieb:
Die sieht ja ungewohnt aus so über Kopf die Karte :D muss das so?
Das ist so gewünscht ja.
mae1cum77 schrieb:
Sieht aus wie die Nietenköpfe des Stahlbandes vom Tisch, nur falsche Ebene.
Ja, bzw. da wo die sind ist eigentlich keine Karte.Ich muss die Karte verkleinern damit das passt.

Edit: Ich habe die Karte jetzt etwas gefixt, es ist noch nicht perfekt aber deutlich besser als zuvor. Ich habe leeren nicht sichtbaren Inhalt rechts hinzugefügt und links leeren inhalt entfernt.
jjfhgfjhg.jpg



0x8100 schrieb:
wie bei der position zuvor kannst du ja irgendwas berechnen. aber k.a. was genau du da wie berechnen willst, ich weiss ja nicht, was du vor hast :)
Ich habe mehrere Dinge vor, ich muss die bererits berechneten Locators mit 1050 subtraieren. D. H. bei jedem Wert muss die X Koordinate um 1050 reduziert werden.

1709761199253.png


Grund hierfür ist, das ich die Karte um 1050 Pixel verkleinert habe und alles nun um 1050 Pixel nach Links rückt.

Bzgl. der Rotation brauche ich das quasi für die Siege Units. Und zwar ist hier der höchste Wert denke ich 1 und der niedrigste Wert -1. Wenn 1 unterschritten wird, dürfte der Wert bei der Drehung wieder bei 1 sein. Daher müsste wenn man die Werte invertiert bei einem Ausgangswert von 1, dieser auf 0 gesetzt werden, bei einem Wert von 0.2 auf - 0.8 usw. Ist das mit Python möglich?

Ansonsten gibt es noch diese Datei, hier muss ich in jeder Zeile den ersten Wert (x) und den dritten Wert (Y) invertieren wie bei den anderen locatern. Aber da steht halt kein Position davor, da wusste ich grade leider nicht wie ich das dort eintrage damit das funktioniert.

Der 5 und 7 Wert sind hier wieder die Rotationswerte die genau wie bei den Siege Units bearbeitet werden müssten.

Edit: Ich hab die Files für die ich noch eine Lösung brauche mal mit in den Anhang gepackt wie zuvor, damit man nicht nur die Srceenshots hat...


1709761686400.png


So, ich glaube so passt der Tisch jetzt. Besser wirds auch nicht mehr, hab alles ausgenutzt was geht.

6818_3630_laerchebrett_1_1.jpg
 

Anhänge

  • lakes.txt
    19,3 KB · Aufrufe: 18
  • building_locators.txt
    1,3 MB · Aufrufe: 18
  • 6818_3630_laerchebrett_1_1.jpg
    6818_3630_laerchebrett_1_1.jpg
    2,8 MB · Aufrufe: 19
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: mae1cum77
Weedlord schrieb:
Daher müsste wenn man die Werte invertiert bei einem Ausgangswert von 1, dieser auf 0 gesetzt werden, bei einem Wert von 0.2 auf - 0.8 usw. Ist das mit Python möglich?
Klar, wie in jeder Programmiersprache. Mach dir eine Funktion:
Python:
def invert_rot(x):
 return x-1 if x>0 else x+1
und nutze die.

Die Subtraktion von -1050 von einem anderen Wert ist trivial (schlicht x-1050).
Die Suche nach der Zeile kannst du ähnlich gestalten wie in #14. Suchst halt nach transform und nimmst deine 10 float-Werte. Und dann aber natürlich nicht vorne drei Tabsstopps hin, falls die in der Orignaldatei nicht drin sind.
Kannst ja mal probieren.
 
  • Gefällt mir
Reaktionen: Weedlord
Hi,

Was haben Sie gemeint mit "doppelte Textblöcke" ?

id Werte ?
position Werte ?
rotation Werte ?
scale Werte ?

Oder wenn sie alle identisch Werte ist ?..


Aber ich denke definitiv, dass Sie diese Skriptdatei mit diesen Codes (Mit VSCode, Visual Studio oder PowerShell) nach Ihren Wünschen bearbeiten können. Ich habe dieses Beispiel vorbereitet, damit Sie es entwickeln können. Sie können die fehlenden Teile problemlos ergänzen.


Code:
try
{
    string lnText = null;
    string allText = File.ReadAllText("DATEI_PFAD_HIER");
    int brInd = allText.IndexOf('{', allText.IndexOf('{') + 1) + 1;
    int lastBrInd = allText.LastIndexOf('}', allText.LastIndexOf('}') - 1);
    lnText = allText.Substring(brInd + 1, (lastBrInd - brInd) - 1);
    string[] splitted = lnText.Split('\n');
   

    foreach (string s in splitted)
    {
        if (s.Contains("position"))
        {
            string[] splitPos = s.Split(' ');
            splitPos[1] = "214235"; //Erste Value von position
            splitPos[2] = "214235"; //Zweite Value von position
            splitPos[3] = "214235"; //Dritte Value von position
        }

        if (s.Contains("rotation"))
        {
            string[] splitRot = s.Split(' ');
            splitRot[1] = "214235"; //Erste Value von rotation
            splitRot[2] = "214235"; //Zweite Value von rotation
            splitRot[3] = "214235"; //Dritte Value von rotation
        }

        if (s.Contains("scale"))
        {
            string[] splitScal = s.Split(' ');
            splitScal[1] = "214235"; //Erste Value von scale
            splitScal[2] = "214235"; //Zweite Value von scale
            splitScal[3] = "214235"; //Dritte Value von scale
        }
    }
                   
}
catch (Exception xErr)
{
    //lass es gehen :)
}


MfG / Best Regards
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben