Code optimieren

  • Hiho Gemeine,

    ich hab im moment eine Denkblockade. Könnt ihr mir helfen meinen Code zu verkürzen, damit ich nicht 5000 Variablen erstellen muss mit jeder neuen Abfrage?

    Als Beispiel: Ich les einen String in eine Variable und dieser String wird anschliessend über zig tasusend Dinge überprüft und ggf auch Dinge ersetzt.

    AutoIt
    $sOutput7 = StringReplace($sOutput6, "MON ", " ", 0, 1)
    		$sOutput8 = StringReplace($sOutput7, "TUE ", " ", 0, 1)
    		$sOutput9 = StringReplace($sOutput8, "WED ", " ", 0, 1)
    		$sOutput10 = StringReplace($sOutput9, "THU ", " ", 0, 1)
    		$sOutput11 = StringReplace($sOutput10, "FRI ", " ", 0, 1)

    Das Snipped dient nur als Beispiel - solche Stellen ziehen sich allerdings recht oft durch mein Skript und ich hab momentan einfach kein Plan, wie ich das kurz und übersichtlich und vor allem mit weniger Variablen lösen kann.

    Mein String wird so oft bearbeitet das ich am Ende da sicher 30 Variablen, oder mehr habe.

    Jemand Vorschläge?

    LG
    Mirko

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Hm die StringReplacer sind ja alle komplett unterschiedlich... ohne wirkliches Muster...

    Hier mal ein grösserer Ausschnitt:


    Hab mir For-Schleifen noch nie gearbeitet. Könntest Du mir evtl ein Beispiel anhand von 2 Variablen kurz zeigen? Wenn ich es sehe verstehe ich in der Regel den Sinn des Codes und kann ihn mir entsprechend anpassen...

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • So kannst dus auch schreiben.
    Ansonsten könntest du auch alle suchbegriffe und replaces in ein 2d array packen und dann das array mit schleife durchlaufen, und jeweils den kram ersetzen.


    MfG Kanashius

    • Offizieller Beitrag

    Hier mal ein Beispiel für ein ersetzen mit einem 2D-Array:

  • AutoIt
    $sOutput = "Irgendwas..."
    
    
    Dim $aSearch [11] = ["INTERNATIONAL_ECONOMY(4)", "INTERNATIONAL_PRIORITY(1)", "INTERNATIONAL_PRIORITY_FIRST(6)", "EUROPE_FIRST_INTERNATIONAL_PRIORITY(null)", "PRIORITY_OVERNIGHT(1)", "INTERNATIONAL_PRIORITY_DISTRIBUTION(null)", "MON ", "TUE ", "WED ", "THU ", "FRI "]
    Dim $aReplace[11] = ["International Economy", "International Priority", "International Priority First", "International Europe First", "Priority Overnight", "International Priority Distribution", " ", " ", " ", " ", " "]
    
    
    For $i = 0 To UBound($aSearch) - 1
    	$sOutput = StringReplace($sOutput, $aSearch[$i], $aReplace[$i], 0, 1)
    Next

    Dein Beispiel von oben mal mit einer Schleife. Besser wäre allerdings die Search / Replacewerte nicht hart zu vercoden (im Quelltext zu halten) sondern extern - zum Beispiel in einer Datei. Dazu gibt es zig Möglichkeiten. Von einer Ein-Datei-Lösung mit Seperator über zwei Dateien in der jede Zeile mit der gleichen Zeile der anderen Datei überschrieben wird bis hin zu kompletten Übersetzungstabellen - letzteres wird zum Beispiel oft bei mehrsprachigen Produkten verwendet, um die Übersetzung geschmeidig zurecht zu biegen.

    Wenn du zu einem dieser Lösungen eine Frage hast, werde ich dir das gerne noch erläutern.

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.

  • Hey danke an beide für die anschaulichen Beispiele :)

    Wobei mir (von meinem eigenes Verständnis her) die zweite Methode (die von Bioshade) besser gefäält. Den Code kann ich besser lesen. Code, den ich besser lesen kann, kann ich auch besser verstehen bzw mit arbeiten :)

    Auch wenn bei beiden dasselbe passiert :)

    Danke - damit kann ich etwas anfangen und mein Skript erheblich verkürzen. 500 Zeilen und die Hälfte (übertrieben) davon solche einzelnen Abfragen blähen den Code einfach unendlich auf...

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Solche "Ersetzen X mit Y"-Orgien haben im Programmcode absolut nichts verloren!
    Bei jedem Pipifax (Rechtschreibfehler/Zahlendreher/Erweiterung/Löschung) wird der Code editiert....und weil der "Programmierer" der diesen Mist im Quellcode verzapft hat, sicherlich keinen anderen findet der zig Arrrayeinträge durchzählt und editiert, muss er diese "Datenpflege" auch noch selbst machen!

    Die Ersetzungstabelle gehört in eine Text-Datei, CSV ist wie dafür gemacht. Das kann jedes x-beliebige DB- oder Tabellenkalkulationsprogramm einlesen/editieren, Texteditoren natürlich auch 8o
    Dateiinhalt Ersetzen.csv:
    INTERNATIONAL_ECONOMY(4),International Economy
    INTERNATIONAL_PRIORITY(1),International Priority
    INTERNATIONAL_PRIORITY_FIRST(6),International Priority First
    bla,blub

    Der Quellcode reduziert sich auf den 3-Zeiler, auch wenn 20000 Ersetzungen durchgeführt werden müssen! Und evtl. "Erweiterungen" drückt man ggf. in Ermangelung eines überarbeiteten Azubis einfach der Reinigungskraft aufs Auge :D Auch die kann mit dem Windows-"Editor" die CSV öffnen und die beiden zusätzlichen Wörter durch Komma getrennt hinten anhängen....

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    2 Mal editiert, zuletzt von Andy (9. September 2015 um 18:12)

  • @Oscar, nein, dem war nicht so....der TE liest lediglich den "Text" ein, in dem dann mit obigem (Post #1) Replacekrampf das eine Wort durch ein anderes ersetzt werden soll(te)!

  • Na die Unterhaltung wird ja interessant hier :)

    Also der Text kommt aus einem Edit-Feld meiner GUI. Aus einem unserer Programme wird dort halt ein sehr langer Text reinkopiert (also ins Editfeld) was anschliessend komplett umgewandelt wird und später durch eine Textvorlage eingefügt. In der Textdatei werden die Schlüsselwörter so angegeben: Hier kommt der %Beispielwert% rein.
    Also so gesehen arbeite ich mit 2 Strings. Eines was aus dem Editfeld eingelesen wird und eins, was in der Textdatei steht. Aus diesen beiden Strings wird im Endeffekt ein dritter generiert, der uns dann als Emailvorlage dient. Ich hoffe das klingt jetzt nicht alles zu wirr ohne das man den kompletten quellcode sieht.

    Ich kan Andys Gedankengänge schon nachvollziehen, jedoch muss tatsächlich an den zu suchenden Wörtern nichts geändert werden oder hinzugefügt werden, denn das wird nie passieren. Der Code, der aus unserem Arbeitsprogramm generiert wird, ist immer derselbe. Da wird nicht in nem halben Jahr ein neuer String hinzukommen oder sich ändern - er ist halt immer gleich. Daher finde ich es nicht schlimm, wenn das hardcoded im Quelltext ist, anstatt "dynamisch" in einer externen csv-Datei.

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.