Textblöcke sortieren - oder - mehrere Befehle in eine Zeile schreiben

  • Hallo,

    wie kann ich mehrere Befehle in eine Zeile schreiben?

    Falls man mehrere Befehle nicht in eine Zeile schreiben kann, wie kann ich am einfachsten mit AutoIt einen Select-Case-Block aufsteigend / absteigend sortieren?

    Gibt es eine unversal erweiterbare Lösung, so dass man folgendes in AutoIt umsetzt:

    Sortiere die 99 Zeilen von A bis Z, dabei bleiben 3 Zeilen (wie in diesem Beispiel) zusammenhängend und werden als Block behandelt.


  • Falls man mehrere Befehle nicht in eine Zeile schreiben kann, wie kann ich am einfachsten mit AutoIt einen Select-Case-Block aufsteigend / absteigend sortieren?


    Gibt es eine unversal erweiterbare Lösung, so dass man folgendes in AutoIt umsetzt:


    Sortiere die 99 Zeilen von A bis Z, dabei bleiben 3 Zeilen (wie in diesem Beispiel) zusammenhängend und werden als Block behandelt.

    Wieviele Fälle behandelst du denn in deinem Select?

    Wenn es (wie aus der Angabe hervorgeht) 32-33 wären dann stellt sich die Frage ob dein Ziel nicht auf anderem Wege besser erreichbar wäre.

    Z. B. die jeweiligen Zuordnungen in einem Array oder einer Datei auslagen und dann über eine kurze Schleife abfragen.

    Können wir aber erst sagen wenn es nicht mehr auf abstrakter Ebene diskutiert wird sondern konkret am Beispiel.

  • Nur so eine Idee :

    Du könntest Dir ein kleines Hilfsprogramm erstellen.

    Die Daten legst Du in einem 2-D Array direkt an, oder liest sie aus einer Textdatei ein z.B. :

    $iValue = |7|$iTest = |B|$iTest2 = |y

    $iValue = |2|$iTest = |A|$iTest2 = |x

    $iValue = |9|$iTest = |C|$iTest2 = |z

    usw. (Delimiter hier | )

    bei Switch kann das erste Feld auch weggelassen werden

    -> das Array auf/absteigend sortieren

    -> daraus den Befehlsblock als Text generieren und in Dein eigentliches Programm einfügen.

    Edit : ich sehe gerade, AspirinJunkie hat auch etwas in der Art vorgeschlagen ^^

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Wenn du nur auf $iValue prüfst kannst du auch ein Switch-Statement nehmen, das ist kürzer und sieht besser aus.

    Das ist eine interessante Anregung, danke.

    Wenn ich das richtig verstanden hab ...
    Select ... unterschiedliche Variablen
    Switch ... eine Variable

    Gibt es ansonsten noch einen wesentlichen Unterschied?

  • Wieviele Fälle behandelst du denn in deinem Select?

    Mir schweben drei Anwendungsfälle vor, dabei sind es ca. 12, rund 40 und dem dritten Fall über 300.

    In allen Varianten möchte ich Zeichenketten übersetzen, sei es ein veralteter Befehl in einen neuen Befehl, ein englisches Wort in ein deutsches Wort.

    Wäre die von Euch genannte Variante mit einem Array im auf die beste Lösung bei einer Größenordnung von 300 Elementen?

    Bisher habe ich Arrays selten eingesetzt.

  • Wäre die von Euch genannte Variante mit einem Array im auf die beste Lösung bei einer Größenordnung von 300 Elementen?

    Falls Du in einem Text diverse Elemente ersetzen möchtest, gibt es ggf. andere Herangehensweisen.

    Als Datenbasis scheint (nach derzeitigem Kenntnisstand) ein Array aber sinnvoll.

    Poste mal einen Beispieltext und Sachen, die Du ersetzen möchtest.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Nachtrag :

    Mir schweben drei Anwendungsfälle vor, dabei sind es ca. 12, rund 40 und dem dritten Fall über 300.

    In allen Varianten möchte ich Zeichenketten übersetzen, sei es ein veralteter Befehl in einen neuen Befehl, ein englisches Wort in ein deutsches Wort.

    Warum dann der Aufwand mit der Sortierung und der Festlegung auf 12, 40 und >300.

    Du bräuchtest ein Array mit den Ersetzungen, also 'ALT 1..n' -> 'NEU 1..n'.

    Den Text n-mal durchlaufen und jeweils ein StringReplace durchführen.

    Sobald man genau weiß was Du möchtest, geht es ggf. auch noch eleganter ;).

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Poste mal einen Beispieltext und Sachen, die Du ersetzen möchtest.

    Der Hinweis auf die Anzahl der Datenblöcke ist ein Hinweis auf die Zeilenanzahl - mehr nicht.

    Alle Ideen sind letztendlich Übersetzungen von A nach B, ob Sprache, Programmiersprache, Zahlen (1 = A, 3 = C ...).

    Wie in Post 6 geschrieben, das ist es.

    In allen Varianten möchte ich Zeichenketten übersetzen, sei es ein veralteter Befehl in einen neuen Befehl (AutoIt), ein englisches Wort in ein deutsches Wort (oder umgekehrt).

    In einem anderen Beitrag erhielt ich den Hinweis, dass ich veraltete Befehle über Suchen / Ersetzen in AutoIt Dateien automatisch ersetzen kann.

    Ich wollte das eingangs dieses Threads per Select umsetzen. Dann kam die Idee mit einem Array auf. Das ganze aus einer Textdatei einzulesen klingt gut.

    Beispiel aus AutoIt

    Array

    Spalte 1

    Dim

    Spalte 2Declare a variable, a constant, or create an array.

    Spalte 3

    Deklariert eine Variable, Konstante oder definiert ein Array.

    Es gibt ca. 30 aktuelle Befehle, die mir immer wieder Schwierigkeiten bereiten. Für eine online-Suche brauche ich häufig die englische Beschreibung, da ich darüber mehr finde.

    In anderen Fachbereichen gibt es gleiches in Analogie.

    Beispiel: Wer Programmiersprache A erlernt hat und mit Programmiersprache B beginnt, wird schnell feststellen, dass es viele Befehle gibt, die in beiden Versionen unterschiedlich heißen, aber letztendlich das gleiche in der jeweiligen Sprache bewirken.

    Die Daten werden mit der Zeit umfangreich und sind daher unsortiert. Diese im Array zu sortieren ist laut Hilfe gut möglich.

  • Hallo Banana_2_Day !

    Alle Ideen sind letztendlich Übersetzungen von A nach B, ob Sprache, Programmiersprache, Zahlen (1 = A, 3 = C ...).


    In allen Varianten möchte ich Zeichenketten übersetzen, sei es ein veralteter Befehl in einen neuen Befehl (AutoIt), ein englisches Wort in ein deutsches Wort (oder umgekehrt).

    Hier ein Beispielskript, wie Du das umsetzen kannst :

    -> Testtext01.txt (da Du keine Testdatei beigefügt hast, habe ich eine erzeugt)

    ---> Ausgangstext - wird nicht verändert, sondern unter *_New* gespeichert.

    -> ReplaceArr01.txt -> Textdatei mit den Ersetzungen für das Array

    ---> alleinstehende Zeichenketten müssen ein Leerzeichen vor und/oder danach erhalten.

    Einen allgemeinen Punkt solltest Du bei Deiner 'Sortierung' berücksichtigen :

    Falls Du z.B. einen alleinstehenden Wert A mit B ersetzt und B mit C , dann muss B -> C vorher ausgeführt werden ;).

    EDIT : Code und Anhänge entfernt -> siehe aktuelle Version in Beitrag #14

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    3 Mal editiert, zuletzt von Musashi (8. September 2019 um 01:37) aus folgendem Grund: Skripte verschoben

  • Nachtrag :

    autoiter hat mich freundlicherweise darauf hingewiesen, dass die Funktion _ReplaceStringInFile performancetechnisch hier nicht ideal ist und besser mit StringReplace gearbeitet werden sollte (was mir auch bereits bekannt war).

    _ReplaceStringInFile öffnet und schließt die Datei bei jedem Ersetzungsdurchlauf, was nicht zwingend erforderlich ist (üblicherweise öffnet man die Datei einmalig, arbeitet die Ersetzungen ab und speichert sie dann).

    Da ich _ReplaceStringInFile bisher aber noch nicht so auf dem Schirm hatte, wollte ich sie einfach mal verwenden. Wie Andy häufig anmerkt, sollen unsere Hochleistungsrechner auch etwas arbeiten dürfen, und nicht nur im Idle vor sich hin vegetieren ^^.

    Banana_2_Day :

    Solltest Du das Brockhaus-Lexikon replacen wollen bzw. die Ersetzungen Deiner Texte spürbar zu lange dauern, können wir auch das Standardverfahren nehmen ;).

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (8. September 2019 um 01:41)

  • Nachtrag 2 :

    Ich wollte mal wissen, wie groß die Performance-Unterschiede wirklich sind ;)

    Testsituation :

    - ein Testskript - 5200 Zeilen; 280 KB

    - 300 Replaceläufe (1. Wert001 zu Wert002; 2. Wert002 zu Wert003 ... 300. Wert300 zu Wert301)

    - der Wert selbst kommt 1141 mal im Skript vor

    Dafür habe ich folgende Daten verwendet :

    Testtext-Long.txt (das ist die GDIPlus-UDF als Text)

    ReplaceArr-Long.txt (Ersetzungsarray als Text)

    -> Mit _ReplaceStringInFile() :

    00:00:13.458 (Std:Min:Sek.Millisek.)

    -> Mit StringReplace() :

    00:00:10.274 (Std:Min:Sek.Millisek.) - kein großer Unterschied zu _ReplaceStringInFile()

    -> Richtig ab geht es aber mit StringRegExpReplace() :

    00:00:00.628 (Std:Min:Sek.Millisek.) !!!

    Die Ergebnisdateien waren in allen Fällen identisch (sogar der MD5-Hash).

    Hier die neue Version des Skriptes :

    Das ReplaceArray ist jetzt 3-spaltig , Delimiter ist #|#.

    ; Array mit den 'Suchen & Ersetzen'-Werten :

    ; Spalte 0 = gesuchte Textkette

    ; Spalte 1 = neue Textkette

    ; Spalte 2 = falls Semikolon (;) -> Element nicht ersetzen (quasi auskommentiert)

    Das Ersetzen funktioniert grundsätzlich.

    Probleme gibt es in der akt. Variante noch, wenn z.B. Werte alleinstehend am Anfang der Zeile stehen und mit TAB statt Leerzeichen eingerückt wurden. Diese müssen noch berücksichtigt werden !

    Gruß Musashi