Zeile löschen mit _FileWriteToLine funktioniert nicht mehr

  • Hallo zusammen.

    Ich habe schon lange ein Autoit Skript laufen, welches CSV Dateien ausließt, umsortiert usw... Der Inhalt der Dateien und auch des Skriptes soll an dieser Stelle weitgehend egal sein, es geht lediglich um den Befehl _FileWriteToLine. Und zwar ist mir folgendes aufgefallen:

    Mein Skript läuft schon länger und tut was es soll, u.a. immer die erste Zeile einer Textdatei (bzw. CSV) entfernen, und zwar mit folgendem Befehl:

    Code
    _FileWriteToLine($sDateipfad , 1 , "" , True )

    Das steht auch so inder Hilfe: If _FileWriteToLine() is called with $iOverWrite as 1 and $sText as "", it will delete the line.

    Nun ist mir zufällig aufgefallen, dass die Folgeoperationen meines Skriptes nicht mehr richtig funktionieren und nach kurzer Suche bin ich drauf gestoßen: Die erste Zeile wird nicht mehr gelöscht. Nur warum?

    Ich habe vor einiger Zeit mal den Entwicklungsrechner gewechselt und dort ohne groß nachzudenken Autoit heruntergeladen und installiert, und zwar die Version v3.3.14.5 . Nach dieser Installation habe ich das Skript noch mal kompiliert, um ein paar Kleinigkeiten anzupassen, die nichts mit dem o.g. Befehl zu tun haben.

    Nun habe ich mir mal den Installer vom alten Rechner geholt und diesen durchlaufen lassen und siehe da, mit dieser Version, der v3.3.14.2 funktioniert das erneut kompilierte Skript wieder und die erste Zeile wird mit o.g. Befehl gelöscht.

    Hat jemand eine Idee, warum das in der neuen Version nicht mehr klappt? Ist das vielleicht ein Bug?

    ---

    Nachtrag: Ich sehe gerade, dass in der v3.3.14.5 für den Befehl _FileWriteToLine() der Parameter $bFill hinzugekommen ist, siehe Hilfe und siehe Changelog #3093.

    Es ist aber egal, ob man diesen Parameter auf TRUE oder FALSE setzt, also

    Code
    _FileWriteToLine($sDateipfad , 1 , "" , True , True)
    oder
    _FileWriteToLine($sDateipfad , 1 , "" , True , False)

    Mit dem Befehl wird die Zeile nun nicht mehr gelöscht, sondern es bleibt eine leere Zeile stehen. In der Hilfe steht aber nach wie vor, dass die Zeile gelöscht wird, wenn abeim dritten Parameter "" und beim vierten TRUE angibt.

    Einmal editiert, zuletzt von Schokolade (3. Dezember 2018 um 16:47)

    • Offizieller Beitrag

    Ja, das ist ein Bug!

    Wenn die Zeile gelöscht werden soll, wird trotzdem ein @CRLF eingefügt. Das ist natürlich Unsinn!

    Ich habe die Funktion mal entsprechend abgeändert:

  • Das wird gerade auch im engl. Forum diskutiert.
    Es gibt unterschiedliche Sichtweisen, ob eine Funktion, die Daten in eine Datei schreibt, auch Daten löschen soll.
    Das Ergebnis ist, glaube ich, noch offen.

  • Es gibt unterschiedliche Sichtweisen, ob eine Funktion, die Daten in eine Datei schreibt, auch Daten löschen soll.

    Überschreiben ist auch schreiben... der vierte Parameter dieser Funktion ($bOverWrite) ist ja wohl genau dafür gedacht... und der Inhalt der angegebenen Zeile wird ja auch gelöscht... aber das @CRLF bleibt stehen, und das ist falsch, denke ich.

    Edit: Hier der Grund...

    Code
    In dieser Zeile (in der Funktion _FileWriteToLine) wird "" in das Array eingefügt, wenn $bOverWrite = True und $sText = "" ist...
    $aArray[$iLine - 1] = ($bOverWrite ? $sText : $sText & @CRLF & $aArray[$iLine - 1])
    ;                                    ^^^^^^
    
    ; ...aber hier wird dann an allen Zeilen ein @CRLF angehangen... und das ist falsch... die gelöschte Zeile dürfte in diesem Fall gar nicht mehr im Array sein.
    
    For $i = 0 To $iUBound
        $sData &= $aArray[$i] & @CRLF
    ;                           ^^^^^
    Next

    2 Mal editiert, zuletzt von Bitnugger (3. Dezember 2018 um 23:00)

  • Hier die Diskussion im engl. Forum.
    Ich, für meinen Teil, bin da leidenschaftslos.

  • Hallo zusammen und danke für die zahlreichen Antworten und Hinweise!!!

    Oscar : Vielen Dank aber das hast du jetzt ja nur so geändert, dass man es bei sich lokal anpassen kann, aber wenn man auf einem weiteren Rechner die aktuelle Autoit Version herunterlädt und installiert ist der vermeintliche Bug noch da, muss man also aufpassen.

    Habe mir jetzt nicht den ganzen englischen Thread durchgelesen - hat jemand eine Vermutung wie das ausgehen wird? So lange bleibe ich dann doch erst mal bei der v3.3.14.2 :)

  • Mehr Info als im Thread steht haben wir leider auch nicht. Keine Ahnung, was am Ende rauskommt ;)

  • Nicht wirklich, sowas wird meistens im blauen Forum diskutiert.

    Wenn du über Änderungen bei den verschiedenen Versionen den Überblick behalten möchtest kannst du dir immer die Changelog History anschauen, dort steht was über die Versionen hinweg verändert wurde und ob das dein Skript so verändert, das es nicht mehr lauffähig ist. http://www.autoitscript.com/autoit3/docs/history.htm

    Oder du schaust mal im Bugtracker vorbei, dort wird sowas auch diskutiert.

  • Hallo Schokolade !

    Oscar: Vielen Dank aber das hast du jetzt ja nur so geändert, dass man es bei sich lokal anpassen kann, aber wenn man auf einem weiteren Rechner die aktuelle Autoit Version herunterlädt und installiert ist der vermeintliche Bug noch da, muss man also aufpassen.

    Oscar hat keine Entscheidungsfreiheit, WAS im Standard geändert wird. Das legt das Entwicklerteam von AutoIt fest. Daher kann er Dir 'nur' eine individuelle Lösung anbieten.

    Du kannst aber eine eigene UDF erstellen, in der Du Dir nützlich erscheinende Funktionen sammelst, und diese in neue Installationen einbinden (Funktions- Variablennamen etc beachten).

    Die Wartung der UDF liegt dann aber auch in Deinem Verantwortungsbereich !

    Die Diskussion im engl. Forum selbst ist interessant, sollte sich jeder Interessierte mal durchlesen.

    Lustig finde ich den Kommentar von BrewManNH zu _ArrayDisplay :

    Reminds me of what happened to _ArrayDisplay before it was renamed to _Debug_ArrayDisplay, none of the changes should have been in there because it was a debugging function, not a lazy man's listview.

    Frei übersetzt :

    Das erinnert mich daran, was mit _ArrayDisplay passiert ist bevor sie (die Funktion) zu _Debug_ArrayDisplay umbenannt wurde. Keine der Änderungen hätten gemacht sollen, da sie ursprünglich als Debugging-Funktion gedacht war, nicht als ListView des faulen Mannes.

    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."

  • Auch interessant - ein Überblick über die Script Breaking Changes: https://www.autoitscript.com/autoit3/docs/s…ing_changes.htm