wahlfreies Lesen in einer Datei?

  • Hallo,

    ich suche folgende Funktion:

    FileRead(filehandle or "filename"[, start [, count]])

    Es sollen ab Byte "start" (default: aktuelle Position) die Anzahl "count" Byte (default: 1) gelesen werden.

    Gibt es die schon und ich finde sie nur nicht oder gibt es etwas ähnliches?

    • Offizieller Beitrag

    Das Byte-weise einlesen ist kein Problem. Du kannst ja mit FileOpen() binäres Lesen/Schreiben festlegen.
    Allerdings ist mir bisher nicht bekannt, dass an einer 'aktuellen' Position begonnen werden kann. Woher soll auch diese Position kommen? Wenn du mit einem anderen Programm diese Datei vorher bearbeitet hast und die zuletzt bearbeitete Position z.B. 20 war, wird dieser Wert ja nicht mit gespeichert.
    Die Datei wird also immer 'jungfräulich' an Position 1 begonnen zu lesen, Zeichen- oder Byte- weise. Je nach FileOpen.

  • Gibt es AutoIt leider genausowenig wie ein Seek um den file position pointer zu setzen.
    Wäre aber ne nette neue Funktion :)

    Aber du kannst zumindest mit FileRead eine bestimmte Anzahl an Zeichen/Bytes (je nach FileOpen) einlesen.

    Viele Grüße
    Stilgar

  • [autoit]

    $displayendposition = StringInStr ($source, "start") ;start wird gesucht
    $displayendposition = $displayendposition - 5 ;zeiger wird 5 stellen zurückgesetzt

    [/autoit]

    Dann kannste mit Sringbetween weiterarbeiten oder StringLeft

    [autoit]

    StringLeft( $source, count )

    [/autoit]

    Irgendwie so hab ich das mal in nem alten script von mir gemacht.
    werds ma suchen aber keine garantie das ichs noch habe ^^

    PS: alles ausm kopf geschrieben also bitte ned meckern wegen fehlenden zeichen oder so :P

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.

    [autoit]

    If Not $Elephant Then $Irelephant = True

    [/autoit]

    Einmal editiert, zuletzt von Blubkuh (17. August 2007 um 15:31)

  • Zitat

    Original von Stilgar
    Gibt es AutoIt leider genausowenig wie ein Seek um den file position pointer zu setzen.


    Schade. Ich bin wohl doch zu sehr Rexx-verwöhnt.

  • Zitat

    Original von Stilgar
    REXX währe mir auch lieber :D , oder gibts ne Win-GUI für Regina?


    Nicht das ich wüßte. Wenn ja, dann hätte ich mich wahrscheinlich auch nicht nach einem VX-Rexx Ersatz unter Windows umgeschaut und wäre wohl somit auch nicht bei AutoIt gelandet.
    ooRexx hat da etwas zu bieten, aber ich habe festgestellt, dass es keine wirkliche Alternative zu AutoIt ist. Ausserdem erzeugten die Scripts bei mir eine deutlich höhere CPU-Last.

    Zitat

    Original von Stilgar
    Zurück zum Thema - hier gibts noch was - Seek nennt sich da ...SetPos

    http://www.autoitscript.com/forum/index.php?showtopic=12604


    Habe ich kurz mal überflogen. Ich denke, dass sollte ich mal testen. Danke für den Tipp.

  • Nach ein bisschen herumprobieren, habe ich gerade gemerkt, daß FileRead den FilePointer automatisch setzt. Also wenn ich ein FileRead($file,5) anfangs mache geht es beim nächsten FileRead ab Position 6 los.
    Vielleicht hilft dir das auch - ist aber auch nur ein sequentieller Zugriff.

  • Zitat

    Original von Stilgar
    Nach ein bisschen herumprobieren, habe ich gerade gemerkt, daß FileRead den FilePointer automatisch setzt. Also wenn ich ein FileRead($file,5) anfangs mache geht es beim nächsten FileRead ab Position 6 los.
    Vielleicht hilft dir das auch - ist aber auch nur ein sequentieller Zugriff.


    seq. Lesen ist schon klar. Ich schreibe derzeit an einem Script zum direkten Zugriff auf dbf-Dateien. Ist an sich auch kein Problem (derzeit nur lesend), aber permanent FileOpen() und FileClose() machen zu müssen ist nicht schön - vor allem wenn man weiß, dass es (u.a. unter Rexx) besser geht. Einmal Datei öffnen und in ihr sich frei bewegen -> das erscheint mir deutlich effektiver!

    Zitat

    Original von BugFix
    Das Byte-weise einlesen ist kein Problem. Du kannst ja mit FileOpen() binäres Lesen/Schreiben festlegen.
    Allerdings ist mir bisher nicht bekannt, dass an einer 'aktuellen' Position begonnen werden kann. Woher soll auch diese Position kommen? Wenn du mit einem anderen Programm diese Datei vorher bearbeitet hast und die zuletzt bearbeitete Position z.B. 20 war, wird dieser Wert ja nicht mit gespeichert.
    Die Datei wird also immer 'jungfräulich' an Position 1 begonnen zu lesen, Zeichen- oder Byte- weise. Je nach FileOpen.


    Ohne dir zu nahe treten zu wollen: du hast wahrscheinlich noch nie Dateien wirklich bearbeiten müssen. Es geht nicht darum zu wissen, an welcher Position irgend ein anderes Programm war! Je nach Struktur der zu bearbeitenden / zu behandelnden Datei und Aufgabenstellung/Anforderung ist es durchaus erstrebenswert, ab einer Position x eine Anzahl y Bytes zu lesen (oder auch zu [über]schreiben). Wenn eine (Lese)Anforderung auf eine Datei mehrfach und an unterschiedlichen Positionen x besteht, kann man einerseits die Datei öffnen-lesen-schließen-öffnen-lesen-schließen-öffnen... oder nur einmal öffnen und dann den (Schreib/Lese-)Positionszeiger immer an die gewünschte Position bewegen / zeigen lassen.
    Wie ich schon erwähnte, seq. Lesen (auch binär) ist für mich kein Problem. Ich lese die dbf-Datei(en) derzeit halt sequentiell und behelfe mir mit permanetem Öffnen und Schließen.

    Und sollte ich zur Überzeugung kommen, dass mein Script auch für andere nützlich werden könnte (z.Bsp. dbf umwandeln zu csv), dann werde ich es zu gegebener Zeit hier einstellen - und um Mitarbeit bitten, damit es ein korrektes UDF wird.