Zeilen -1

  • Ich habe eine Textdatei in der sind pro Zeile 192 Zeichen gesetzt, nur die letzte, die kann 192 oder weniger Zeilen lang sein.

    Wie zähle ich die Zeilen in einer Textdatei, die 192 Zeichen lang sind?

    $_zeilen = verwendete Zeilen der Länge 192

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Habe jetzt folgende Lösung geschrieben.

    Kann man das oder sollte man das noch ändern / verbessern? "In der Kürze, soll liegen die Würze". ;)

    Spoiler anzeigen

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Performance ist halt bei Tweaky's erstem Vorschlag besser.

  • sollte passen :)

    Ja, von der Funktion passt es. Es kommen richtige Ergebnisse raus.
    Die Variable $Zeilenanzahl ist ja das, was ich brauche.


    Hatte erst an Mod 192 gedacht, aber dann doch auf die obere Lsg. gekommen.
    Gibt aber bestimmt mehrere Lösungswege. Kürzen kann man bestimmt immer,
    wenn es von mir kommt. *fg*

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Performance ist halt bei Tweaky's erstem Vorschlag besser.

    Das glaube ich Dir gerne. Aber ist das bei maximal 2.304.000 Byte in der Textdatei (12.000 Zeilen) zu beachten?

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Da wird es nicht spürbar sein :)

  • Da wird es nicht spürbar sein :)

    Habe ich mir auch gedacht.
    Das Weiterte was ich vor habe, da muss ich wohl drauf achten, was die Performance betrifft. Da sind dann maximal 12.000 Schleifendurchläufe nötig.
    Erst mal weiter machen und dann sehen wo der Schuh zu eng ist, wenn es passieren sollte.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Performance ist halt bei Tweaky's erstem Vorschlag besser.

    Mit _FileReadToArray() einlesen und dann mit StringLen() jede Zeile zählen.

    Bei der Variante ist die Performance schlechter als in Alinas Variante - zumindest nach meinen Tests (einfach ausführen):

    Was mich aber viel mehr interessiert:

    Ich habe eine Textdatei in der sind pro Zeile 192 Zeichen gesetzt, nur die letzte, die kann 192 oder weniger Zeilen lang sein.

    Warum möchtest du die Längen aller anderen Zeilen ermitteln wenn du doch bereits weißt, dass sie immer 192 Zeichen lang sind?!? :/

    Du interessierst dich doch offensichtlich nur für die Länge der letzten Zeile.

    Hierfür muss man doch aber gar nicht die ganze Datei durchgehen:

    AutoIt
    $iLen = StringLen(FileReadLine("test.txt", -1))
    MsgBox(0, "", "Länge der letzten Zeile: " & $iLen)

    Einmal editiert, zuletzt von AspirinJunkie (29. Oktober 2023 um 14:25)

  • Was mich aber viel mehr interessiert :

    Warum möchtest du die Längen aller anderen Zeilen ermitteln wenn du doch bereits weißt, dass sie immer 192 Zeichen lang sind?!?

    Du interessierst dich doch offensichtlich nur für die Länge der letzten Zeile.

    Hierfür muss man doch aber gar nicht die ganze Datei durchgehen:

    Falls ich es korrekt verstehe möchte Alina die Anzahl aller Zeilen mit Zeichenlänge 192 ermitteln.

    Alle Zeilen - bis auf die letzte - sind immer 192 Zeichen lang.

    Es geht, wie Du richtig angeregt hast, also nur um die Zeichenlänge der letzten Zeile.

    AutoIt
    $iLen = StringLen(FileReadLine("test.txt", -1))
    MsgBox(0, "", "Länge der letzten Zeile: " & $iLen)

    Hiermit wird aber nur die Zeichenlänge der letzten Zeile geprüft - nicht die Anzahl der vorangegangenen Zeilen ermittelt.

    Wäre es so nicht besser ? :

    AutoIt
    [... Testdatei generieren]
    
    Global $iCountLines, $iT
    $iT = TimerInit()
    $iCountLines = _FileCountLines("test.txt") ; Anzahl aller Zeilen in Datei
    If StringLen(FileReadLine("test.txt", -1)) <> 192 Then $iCountLines -= 1 ; Falls letzte Zeile <> 192 Zeichen, dann abziehen
    $iT = TimerDiff($iT)
    ConsoleWrite(StringFormat("% 20s:\t%10.6f ms\t% 6d\n", "_FileCountLines", $iT, $iCountLines))
    
    ....

    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 :

    Ich habe mal eine Zeitberechnung (wie in dem Script von AspirinJunkie ) laufen lassen, allerdings die reale Zeit ohne Berücksichtigung eines Overheads.

    Hinzugefügt habe ich die Variante mit _FileCountLines

    (Testdatei : 12000 Zeilen , die ersten 11999 Zeilen mit Länge 192, Zeile 12000 (die letzte) mit weniger als 192 Zeichen)

    Ergebnis :

    Code
                name             time       result
    ----------------------------------------------
         _FileCountLines:         97.3117 ms     11999
        _FileReadToArray:        140.5026 ms     11999
            FileReadLine:        110.7730 ms     11999
         FileReadToArray:         70.4800 ms     11999
     StringRegExpReplace:         73.0387 ms     11999

    Hier das modifizierte Testskript :

    Spoiler anzeigen

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

    2 Mal editiert, zuletzt von Musashi (29. Oktober 2023 um 18:07) aus folgendem Grund: Korrektur

  • Die letzte Zeile ist mir für mein weiteres Vorhaben nicht relevant. Also genau anders wie ihr gedacht habt.

    Wobei ich aus den Beiträgen einiges dennoch gelernt habe, sage ich DANKE !!!

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Moin,

    wenn jede Zeile bis auf die letzte immer 192 Zeichen lang ist, ist jede dieser Zeilen unter Windows in der per FileRead() beschickten Variablen 194 Zeichen lang (CRLF). Dann sollte Folgendes funktionieren:

    AutoIt
    $sDateiName = "Meinetextdatei.txt"
    $sDateiInhalt = FileRead($sDateiName)
    $iZeichen = Stringlen($sDateiInhalt)
    $iZeilen = Floor($iZeichen / 194)
    If Mod($iZeichen, 194) = 192 Then $iZeilen += 1 ; es gibt eine letzte Zeile mit genau 192 Zeichen
    MsgBox(0, "Anzahl Zeilen", $iZeilen)
  • Moin,

    wenn jede Zeile bis auf die letzte immer 192 Zeichen lang ist, ist jede dieser Zeilen unter Windows in der per FileRead() beschickten Variablen 194 Zeichen lang (CRLF). Dann sollte Folgendes funktionieren:

    Das bitte ich einmal zu erklären.

    Bis jetzt dachte ich immer 1 Byte = 1 Buchstabe / Zahl / ....
    alle Zeilen haben 192, außer ggf. die Letzte Zeile, die aber auch 192 lange sein kann.

    Aber wie oben geschrieben, es ist alles geklärt und funktioniert.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hallo,

    in einer Textdatei gibt es Zeilenumbrüche. Die bestehen unter Windows normalerweise aus 2 Zeichen CR und LF (@CRLF). So sind die führenden Zeilen mit 192 Zeichen tatsächlich 194 Zeichen lang.

  • Ja, okay.
    Aber der String selber ist ja 192 Zeichen lang und das meine ich habe ich doch in meiner Lösung richtig gemacht.

    Wenn ich die Zeichen händisch zähle sind es auch 192 sichtbare Zeichen. @CRLF sind unsichtbar und ich habe die ja auch händisch nicht mitgezählt.
    Weiß jetzt nicht, was ich denken soll. Bin total verwirrt. War das eine allgemeine Information von Dir odr ein HInweis, das der o. g. Skript doch nicht fehlerfrei ist?
    :/ :/ :/ :/

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Weiß jetzt nicht, was ich denken soll. Bin total verwirrt.

    Da Du die Zeilen mit FileReadLine einliest, gilt (aus der Hilfe) :

    Bemerkungen

    Gibt eine Textzeile zurück. Die am Zeilenende eingelesenen Zeilenumbrüche (@CR oder @LF) werden automatisch entfernt.

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

  • Moin Alina,

    tut mir leid, wenn ich Dich irritiert habe. Mit meinem Beitrag wollte ich nicht sagen, dass die bereits vorgestellten Lösungen falsch sind. Ich wollte nur für diesen speziellen Fall, wenn alle Zeilen bis auf die letzte gleich lang sind, noch eine Alternative aufzeigen, die die Datei nicht zeilenweise bearbeitet. Die StringRegExReplace() Variante von AspirinJunkie aus Beitrag #10 verarbeitet den Dateiinhalt auch als Block.

  • Okay, dann weiß ich bescheid. DANKE !!!

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl