Beiträge von Musashi

    Hier auf die Schnelle eine Lösung (ohne RegEx) aus dem engl. Forum :

    Autor : Chimp

    Quelle : https://www.autoitscript.com/f…ndComment&comment=1225680


    Sieht natürlich erst mal gewaltig aus ^^.

    Den verkürzten HTML-Code habe ich zum Test als Textdatei beigefügt.


    Gruß Musashi

    Dateien

    • Testhtml.txt

      (1,05 kB, 2 Mal heruntergeladen, zuletzt: )

    Für Interessierte ein Beispiel, um einen Bereich von Zeilen mittels RegEx aus dem Text zu entfernen (kann man ggf. ja mal gebrauchen ;)) :

    AutoIt
    Global $g_sText, $g_sTextNew, $g_iDelStart, $g_iDelEnd
    $g_sText = "Zeile1" & @CR & "Zeile2" & @CR & "Zeile3" & @LF & "Zeile4" & @CR & "Zeile5" & @CRLF & "Zeile6" & @CR
    ConsoleWrite("! >>>>> VORHER <<<<< " & @CRLF & $g_sText)
    ; Zeilen 2 bis 5 löschen :
    $g_iDelStart = 2
    $g_iDelEnd = 5
    $g_sTextNew = StringRegExpReplace($g_sText, "(?s)((\V*\v*){" & $g_iDelStart - 1 & "})(\V+\v*){" & ($g_iDelEnd - $g_iDelStart + 1) & "}(.*$)", "\1\4")
    ConsoleWrite("+ >>>>> NACHHER <<<<< " & @CRLF & $g_sTextNew)


    ( Mikki : Ich empfehle Dir aber eine der o.a. Lösungen)


    Gruß Musashi

    MsgBox hat gegenüber ConsoleWrite den Vorteil, dass das Script an der Stelle anhält.

    Hi BananaJoe !

    Ich wollte die MsgBox-Option auch keineswegs schlecht machen ;) - sie hat, an den richtigen Stellen, durchaus ihre Berechtigung. Mir ging es darum, dass erstaunlich viele User die Möglichkeiten der Konsolenausgabe / eines LOG-Files nicht kennen bzw. nicht nutzen. Bei z.B. der Prüfung von aktuellen Variablenwerten ist der massenhafte Stop des Skriptes ja häufig eher unerwünscht/nervig.


    Gruß Musashi

    Ein funktionierender Debugger kann durchaus hilfreich sein (auch wenn ich ihn in meinen 14 Jahren mit AutoIt nie wirklich vermisst habe).

    Ich programmiere jetzt so ca, 14 Jahre in AutoIt, aber einen Debugger habe ich nie gebraucht/vermisst. Die Consolenausgabe reicht mir

    Das geht mir, offen gesagt, ähnlich !

    Auch ich habe einen Debugger in den vergangenen Jahren nicht wirklich vermisst.

    Ich verwende ConsoleWrites und/oder das Schreiben in LOG-Dateien. Diese Operationen werden über ein globales Flag $DEVMODEON (Boolean) nach Bedarf aktiviert/deaktiviert. Das mag geringe negative Auswirkungen auf die Laufzeit haben, ist mir bei einer Skriptsprache aber egal.


    Die technische Frage, also ob ein Debugger überhaupt realisierbar ist und wenn ja, in welcher Tiefe, lasse ich mal weg. Wie BugFix bereits schrieb, würde ein Debugger bei AutoIt architekturbedingt eh nicht den Leistungsumfang erreichen (können), wie bei einer Compilersprache.


    Die für mich wesentlicheren Fragen lauten :

    • wieviele 'Standard-'User würden einen solchen Debugger überhaupt einsetzen
    • lohnt sich der Aufwand einen Debugger (light) zu erstellen, oder gibt es nicht ggf. andere Problembereiche, in denen diese Zeit besser verwendet wäre
    • wer soll das umsetzen und vor allem langfristig pflegen. Die Foren (DE/EN) sind voll von interessanten Projekten, die beim Stand von 60% -70% im Sande verlaufen sind. Dann ist die anfängliche Begeisterung aufgebraucht und es beginnt üblicherweise die Phase der Quälerei ;)

    Ich denke, ein aktuelles Tutorial "wie debugge ich richtig" (gibt es z.T. wohl bereits schon), ergänzt um einige elegante Ausgabefunktionen (schöne Formatierung usw.), würde den meisten Usern ebenso helfen. Wenn ich mir insbesondere Einsteigerfragen durchlese (DE/EN) dann stelle ich fest, dass viele noch nicht einmal ConsoleWrite und StringFormat kennen, sondern nur mit MsgBoxen arbeiten.


    Gruß Musashi

    Nachtrag : Mikki

    Hier eine verkürzte Variante bei Verwendung der optionalen Parameter von _FileWriteFromArray :

    Gruß Musashi

    Viele Funktionen wie _ArrayToString oder _FileWriteFromArray haben das was du da mit _Arraydelete zusammenbastelst schon eingebaut.

    Ich weiß ;).

    Bei _FileWriteFromArray kann man den Startindex des Arrays und den letzten Index, der in die Datei geschrieben werden soll direkt mittels optionaler Parameter festlegen.

    Das Beispiel sollte Mikki auch mehr das Prinzip nahebringen, falls er z.B. einen Bereich "aus der Mitte" entfernen möchte.


    Gruß Musashi

    P.S. : an Dich, Familie und Freunde ==> bleibt gesund :thumbup:

    Nachtrag :


    Mikki :

    Beim Ansatz von _mk_ werden die ersten 8 und die letzten 15 Zeilen des Array nicht zurückgeschrieben, anstatt sie vor einem _FileWriteFromArray aus dem Array zu entfernen. Das geht natürlich auch.

    Bei seinem aktuellen Beispiel gilt es aber zu beachten, dass ALLE Textdateien des Verzeichnisses bearbeitet werden, was Du ggf. (noch) nicht möchtest !


    _mk_ (nur so am Rande) :

    Variablendeklarationen mit Dim werden i.a. nicht (mehr) empfohlen.

    Man verwendet i.d.R. Global oder Local , je nach Scope.


    Mikki : EDIT -> viele Wege führen nach Rom (na ja, in Corona-Zeiten wohl eher nicht :()

    Man könnte sicher auch die Datei einlesen und mittels RegEx die Bereiche (anhand der Zeilenumbrüche) herausfiltern usw.. Wichtig ist aber, wie immer, dass Du den Vorgang nachvollziehen kannst !


    Gruß Musashi

    Habe soweit alles verstanden bis auf Zeile 25 [...] die Arrays verstehe ich. Meine Frage ist: Da steht ja schon -15. Warum dahinter also noch mal -1?

    Zeile 25 = $g_sRange = String(UBound($g_aFileArr) - 15) & "-" & String(UBound($g_aFileArr) -1)

    Hier wird eine Range (also ein im Array zu entfernender Bereich) festgelegt.

    Bei den ersten 8 Zeilen ist die Range immer 0-7 (bzw. 1-8, wenn [0] die Anzahl der Elemente enthält).

    Bei den letzten 15 Zeilen wird die Range berechnet, da die Dateien ja eine unterschiedliche Anzahl an Zeilen haben können. Außerdem wurden die ersten 8 Zeilen bereits entfernt.

    Lasse Dir $g_sRange mal mit ConsoleWrite ausgeben.

    Das Beispiel ist, wie gesagt nur ein möglicher Ansatz.


    Gruß Musashi

    Dateien

    • Demotext.txt

      (298 Byte, 3 Mal heruntergeladen, zuletzt: )

    So könnte eine Variante aussehen :


    Gruß Musashi

    Du könntest die jeweilige Datei in ein Array einlesen.

    -> prüfen, ob überhaupt genügend Zeilen vorhanden sind

    -> die entsprechenden Indices aus dem Array löschen

    -> Array als Datei (zurück-)speichern (overwrite)


    EDIT : Stichworte _FileReadToArray , _ArrayDelete , _FileWriteFromArray


    Gruß Musashi

    Nachtrag :

    Im Prinzip könntest Du auch die Hashwerte der Dateien vergleichen, also z.B. :

    (die Wahrscheinlichkeit einer sog. Kollision ist sehr gering)

    Gruß Musashi

    Bilder

    • Pic1.jpg
    • Pic2.jpg

    Das ist ein eher ungewöhnliches Beispiel. Der 'klassische' Unterschied zwischen = und == ist, dass die doppelte Variante case-sensitiv ist.

    Der wesentliche Unterschied ist (meines Wissens), dass der Operator == die Operanden zwingend in Strings konvertiert. Der anschließende (String-)Vergleich ist dann, wie Du schon sagst, case-sensitive.

    (Nebenbei : Um nummerische Werte zu vergleichen ist der Operator = daher geeigneter)


    Ich wollte Racer nur ganz allgemein darauf hinweisen, diesen Aspekt zu beachten;).

    Danke - wäre ich nie darauf gekommen das es auch so geht!

    Du solltest ggf. aber darauf achten, dass es einen Unterschied zwischen = und == gibt !

    (google mal nach AutoIt vergleichende Operatoren)

    Code
    Local $bResult
    $bResult = "999.90," = 999.9
    ConsoleWrite('@@ Operator = -> ' & $bResult & @CRLF)
    $bResult = "999.90," == 999.9
    ConsoleWrite('@@ Operator == -> ' & $bResult & @CRLF)

    Gruß Musashi

    zu 2. : Du weist der Variablen $sMain das Ergebnis des Vergleichs $sSub1 & "|" = $sSub2 zu, und der ist False. Bei 3. ist er True, da $sSub1 = $sSub1 ist.