Datei teilen

  • Nabend zusammen,

    Ich möchte eine beliebige Datei (zb test.txt) öffnen und auslesen( soweit bin ich schon)
    Jetzt sollte die Datei in zb. 2 KBs große Strings aufgeteilt werden.
    Wenn man diese wieder zusammenfügt kommt wieder test.txt raus.
    Ist das realisierbar?


    Gruß
    Silverlight

  • ja, grundsätzlich ist das realisierbar.
    Das kommt auf die Codierung an.

    Solange man nur mit dem lateinischen Alphabet arbeitet, wird in der Regel für jedes Zeichen 1 Byte verwendet, wobei dann maximal 256 verschiedene Zeichen möglich sind. Nachdem von den 256 Zeichen normalerweise nur wenige häufig genutzt werden, lassen sich die Texte natürlich noch komprimieren.

    Wenn man auch andere Schriftzeichen braucht, reichen 256 verschiedene Zeichen u. U. nicht mehr aus, dann werden 2 Byte oder mehr pro Zeichen benötigt. Je nach Codierung wird dann aber gar nicht für jedes Zeichen die gleiche Anzahl von Bytes verwendet, bei UTF-8 wird für ASCII-Zeichen beispielsweise weiterhin nur 1 Byte benötigt, für die deutschen Umlaute, griechische oder kyrillische Buchstaben dagegen 2 Byte, und für exotischere Zeichen sogar 3 oder 4 Byte.

  • Aber wie sieht das Codemäßig aus?

    Also Codemäßig sieht das dann so aus das du zuerst den "rein kommenden" String in einzelne Zeichen zerlegen musst.
    Dann musst du überprüfen um welche zeichen es sich in dem String handelt.
    Anschliessend musst du halt zählen bzw rechnen wie viele Zeichen insgesammt 2kb(2 * 1024 Bytes) Ergeben.

    Dabei werden dir de String-Funktionen wie z.B.

    [autoit]

    Stringlen
    Stringmid

    [/autoit]


    Sowie die

    [autoit]

    For

    [/autoit]


    Schleife helfen
    Zudem würde ich vergleichsarrays erstellen.
    Viel spaß beim rechnen ;)

    Edit:
    Probier einfach mal ein wenig herrum. Falls es dann noch Probleme damit gibt, poste einfach deinen Lösungsansatz und dir wird geholfen :D

    Lg

  • Schöner geht es ohne viele Stringfunktionen: mit Filegetsize rechnest du aus wie viele Elemente du brauchst und mit einer for-schleife liest du die Anzahl aus, die du pro Stück haben willst, FileRead($handle, 1000) liest 1000 bytes aus

  • Direkt mal 2 Fragen :

    $size = FileGetSize("test.txt")
    $parts = $size / 1000
    $modded = StringFormat("%.0f",$parts)

    Kann man irgendwie in StringFormat einstellt das jede Zahl aufgerundet wird?

    $text = FileRead($datei, 1000)

    Und wie ließt er die nächsten 1000 aus?

    $text2 = FileRead($datei, 2000) wäre ja sinnlos :(

  • Schöner geht es ohne viele Stringfunktionen: mit Filegetsize rechnest du aus wie viele Elemente du brauchst und mit einer for-schleife liest du die Anzahl aus, die du pro Stück haben willst, FileRead($handle, 1000) liest 1000 bytes aus

    Dabei ist aber darauf zu achten wie du eine Datei öffnest. Zitat aus der Hilfe:

    Zitat von http://translation.autoit.de/onlinehilfe/functions/FileRead.htm

    Eine Datei kann binär (byteweise) ausgelesen werden wenn FileOpen mit dem Binärflag aufgerufen wird. In diesem Fall gibt count die Anzahl der Bytes an, nicht die der Zeichen.

    Zitat von Silverlight

    Und wie ließt er die nächsten 1000 aus?


    Das müsste mit

    [autoit]

    FileGetPos

    [/autoit]


    und

    [autoit]

    FileSetPos

    [/autoit]


    Gehen.

    Zitat von Silverlight

    Kann man irgendwie in StringFormat einstellt das jede Zahl aufgerundet wird?


    Runden macht man üblicherweise mit

    [autoit]

    Round

    [/autoit]

    Lg

  • Hi,
    wenn ich das jetzt richtig verstehe, möchtest du aus einer Textdatei mit dem Inhalt
    ABABABABAB....
    zwei Einzelstrings
    AAAAAAA... und BBBBBBB....machen und deise dann nachher wieder "zusammenkopieren"

    Dazu könntest du z.B. per fileread den Text in eine variable speichern und diese per

    [autoit]

    $a=stringsplit("ABABABAB","",3)
    _arraydisplay($a)

    [/autoit]


    in einzelne Buchstaben aufsplitten.
    dieses array dann in 2 oder auch mehrere Dateien aufzuteilen sollte dann kein Problem mehr sein

    [autoit]

    $a=stringsplit("ABABABAB","",3)
    ;oder $a=stringsplit(FileRead("textdatei.txt"),"",3)
    $ersterstring=""
    $zweiterstring=""
    for $i=0 to ubound($a)-1
    if mod($i,2)=1 Then
    $ersterstring&=$a[$i]
    else
    $zweiterstring&=$a[$i]
    endif
    next
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ersterstring = ' & $ersterstring & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $zweiterstring = ' & $zweiterstring & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]
  • Eingabe von
    *runden*
    als Suchbegriff in die Eingabezeile der AutoIt-Hilfe führt zu einigen Funktionen^^

  • Danke Oscar genau das was ich brauche :)

    Nein ich möchte eine beliebige datei in 1kB blöcke splitten, egal welche buchstaben etc drin vorkommen :)
    $text = FileRead($datei, 1000)
    ist ja schon mal ein guter Anfang allerdings blick ich FileSetPos nicht wirklich :(

  • Zitat

    Nein ich möchte eine beliebige datei in 1kB blöcke splitten, egal welche buchstaben etc drin vorkommen

    so?

    [autoit]

    $a=FileRead("perlin.au3")
    dim $block[500];blöcke
    for $i=1 to stringlen($a) step 1000
    $block[$i/1000]=stringmid($a,$i,1000)
    next

    [/autoit]
  • Spoiler anzeigen
    [autoit]

    Const $File = @ScriptFullPath ; Pfad der zu splittenden Datei
    Const $PartsDir = @ScriptDir & "\Teile" ; Verzeichnispfad für die Teildateien
    Const $PartsName = "\Teil_" ; führender Namensteil der Teildateien
    Const $PartsExt = ".txt" ; Extension der Teildateien
    Const $PartsLen = 128 ; Länge der Teile in Bytes (1 KB = 1024)

    [/autoit] [autoit][/autoit] [autoit]

    DirRemove($PartsDir, 1) ; Verzeichnis der Teildatenen löschen

    [/autoit] [autoit][/autoit] [autoit]

    ; TEILEN =================================================================================
    ; Die Aufteilung wird im Binärmodus durchgeführt
    $O = 0
    $Inp = FileOpen($File, 16)
    $Content = FileRead($Inp, $PartsLen)
    While Not @error
    $O += 1
    $Out = FileOpen($PartsDir & $PartsName & $O & $PartsExt, 2 + 8 + 16)
    FileWrite($Out, $Content)
    FileClose($Out)
    $Content = FileRead($Inp, $PartsLen)
    WEnd
    FileClose($Out)
    MsgBox(0, "Teile", $O & " Dateien erstellt!")
    ; ZUSAMMENSETZEN =========================================================================
    ; Jetzt werden die Teildateien wieder eingelesen und zusammengesetzt.
    ; Weil es eine Textdatei ist, geht das auch im Textmodus
    $I = 1
    $Content = FileRead($PartsDir & $PartsName & $I & $PartsExt)
    While Not @error
    $I += 1
    $Content &= FileRead($PartsDir & $PartsName & $I & $PartsExt)
    WEnd
    $I -= 1
    MsgBox(0, "Teile", $I & " Dateien gelesen!")
    ; FERTIG =================================================================================
    MsgBox(0, "Insgesamt", $Content)
    Exit

    [/autoit]