Text einlesen & und verschieden TXT files Splitten.

  • Guten Abend alle Zusammen.

    Ich habe momentan keine Idee wie folgende Idee verwirklichen sollte:

    Ich lese eine Txt Datei ein; ca. 10 MB Groß!

    Das script sollte die Datei einlesen; das habe ich natürlich ganz einfach mit FileOpen("file.txt,0") und FileReadLine("file.txt") (Grund Unten) gelöst.

    Jetzt möchte ich den Inhalt in 1 MB große Text Dateien Splitten.

    Also habe ich folgendes gemacht:


    [autoit]


    For $i = 1 To 1000 Step 1

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

    $open = FileOpen("textfile.txt", 0)

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

    $readedline = FileReadLine($open, $i) ;Zeile für Zeile, damit er später auch prüfen kann wie groß die Datei ist; Bei FileRead würde er ja den Kompletten Text schreiben.

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

    If $i = 1 Then
    FileWrite($open, $readedline)
    Else
    FileWrite($open, @CRLF & $readedline)
    EndIf

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

    FileClose($open) ;Weil sonst ja noch nichts in die Datei geschrieben wird !? Datei größe würde denke ich bei 0 bleiben.

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

    If FileGetSize("1.txt") > "1048576" Then ; 1MB
    $i = 1000
    EndIf
    Next
    ;???? Hier soll er denn ja eine neue datei mit dem Namen 2.txt erstellen - Kein Problem
    ;Allerdings weiß ich nicht wie ich jetzt den Text WEITER schreibe, d.h. den Inhalt aus 1.txt weglassen

    [/autoit]


    Die weiteren Fragen hab ich ja direkt ins Script geschrieben.

    Es wäre Super wenn ihr mir Helfen könntet!

    Vielen Vielen Dank im Vorraus,

    LG,

    Lenny

    Jaja, Moo does the Cow!

    • Offizieller Beitrag

    Habe jetzt gerade keine 10 MB Textdatei zur Hand, aber das sollte eigentlich funktionieren:

    [autoit]


    Global $hFile, $iCount = 1, $sBuffer = ''

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

    $hFile = FileOpen(@ScriptDir & '\textfile.txt', 0)
    While True
    $sReadLine = FileReadLine($hFile)
    If @error = -1 Then
    FileWrite($iCount & '.txt', $sBuffer)
    ExitLoop
    EndIf
    $sBuffer &= $sReadLine
    If StringLen($sBuffer) >= 1048576 Then
    FileWrite($iCount & '.txt', $sBuffer)
    $iCount += 1
    $sBuffer = ''
    EndIf
    WEnd
    FileClose($hFile)

    [/autoit]
  • Hi!


    Nein - Leider geht es nicht. Aber ich kann das Scipt auch noch nicht ganz nachvoll ziehen:

    [autoit]


    Global $hFile, $iCount = 1, $sBuffer = ''

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

    $hFile = FileOpen(@ScriptDir & 'file.txt', 0) ;Zulesende Datei öffnen
    While True
    $sReadLine = FileReadLine($hFile) ;Zeile 1 Wird gelesen
    If @error = -1 Then ; Wenn ein Fehler -1 auftritt
    FileWrite($iCount & '.txt', $sBuffer);Schreibe in die $count (1).txt , $sBuffer; $sBuffer =& die gelsene Zeile
    ExitLoop; Die bedingung @error = -1 wird nicht erfüllt
    EndIf
    $sBuffer &= $sReadLine ; $sBuffer &= (? Wofür steht &=)Die gelsene Zeile
    If StringLen($sBuffer) >= 1048576 Then ;Wenn die $sBuffer + die Zeile größer als 1048576 Zeichen (Bytes) sind denn
    FileWrite($iCount & '.txt', $sBuffer) ;Schreibe in die Counter (1) $sBuffer
    $iCount += 1 ; Counte = +1 für 2.txt
    $sBuffer = ''
    EndIf
    WEnd
    FileClose($hFile)

    [/autoit]


    Ich verstehe den Ablauf nicht ganz ...


    Abbber .... Kann es dadran liegen das er die 1.txt nicht seperat öffnet ?

    Vielen Dank im Vorraus

    Liebe Grüße

    Lenny

    P.s. Es wird keine Neue 1.txt erstellt und in 1.txt schreibt er auch nicht

    Jaja, Moo does the Cow!

  • Hi!

    Das die Zeile komplett bleibt ist mir eindeutig wichtiger ^^

    Jaa ich weiß das sowas auch mit WinZip geht, aber mit AutoIt muss das ja auch gehen =)

    LG


    Lenny

    Jaja, Moo does the Cow!

    • Offizieller Beitrag

    Ich habe das Script mal ein wenig geändert:

    Spoiler anzeigen
    [autoit]


    Global $hFile, $iCount = 1, $sBuffer = ''

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

    $hFile = FileOpen(@ScriptDir & '\textfile.txt', 0) ; Datei zum Lesen öffnen
    While True
    $sReadLine = FileReadLine($hFile) ; eine Zeile auslesen
    If @error = -1 Then ; wenn das Dateiende erreicht ist, dann...
    If $sBuffer <> '' Then ; wenn noch Daten im Zwischenspeicher stehen, dann...
    $hWrite = FileOpen($iCount & '.txt', 2+8) ; Datei zum schreiben öffnen/erstellen
    FileWrite($hWrite, $sBuffer) ; Zwischenspeicher in die Datei schreiben
    FileClose($hWrite) ; Datei schließen
    EndIf
    ExitLoop ; While...WEnd-Schleife verlassen
    EndIf
    $sBuffer &= $sReadLine ; Die eingelesene Zeile dem Zwischenspeicher hinzufügen ($sBuffer = $sBuffer & $sReadline)
    ToolTip(StringLen($sBuffer)) ; dient nur zum testen
    If StringLen($sBuffer) >= 1048576 Then ; wenn der Zwischenspeicher 1MB erreicht hat, dann...
    $hWrite = FileOpen($iCount & '.txt', 2+8) ; Datei zum schreiben öffnen/erstellen
    FileWrite($hWrite, $sBuffer) ; Zwischenspeicher in die Datei schreiben
    FileClose($hWrite) ; Datei schließen
    $iCount += 1 ; Zähler um eins erhöhen für den nächsten Dateinamen
    $sBuffer = '' ; Zwischenspeicher leeren
    EndIf
    WEnd
    FileClose($hFile) ; textfile.txt schließen

    [/autoit]
  • Hi!

    Ja es funktioniert Super!

    Kann man es auch irgendwie hinbekommen das er leerzeilen mit schreibt? Ihr / du braucht nicht nohc mal ein Script sagen, sondern eher:

    Erkennt Fileread Leerzeilen ?

    Wenn Ja: Wie kann man abfragen ob er eine gelesen hat?

    Das mit den Kommentierungen fand ich übrigens sehr Hilfreich!

    Vielen Dank ;)


    Und Vielen Dank auch im Vorraus


    Liebe Größe,

    Lenny

    Edit1: Mir ist da noch etwas aufgefallen:

    Wenn ich die Txt mit einem Editor öffne ist die erste Zeile:

    0&²uŽfϦÙ

    Wenn ich die 1.txt öffne ist die erste Zeile:

    0&²uŽfϦ٬ÔÖd"8FÈONÌ ¶A^¸}ÖbàÒ1Ôî”Æ«T‘`räÏ™Ô`P¥I ª*

    Auch Komisch^^

    Liebe Grüße, Lenny

    Jaja, Moo does the Cow!

    Einmal editiert, zuletzt von Lenny (28. August 2008 um 23:25)

  • Hallo!

    Sollte es sich um keine reinen Text handeln, dann hilft dir das vielleicht weiter.

    [autoit]

    Global $i = 1

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

    $Ort = FileOpenDialog("Datei zum Splitten aussuchen", "","Alle Dateien (*.*)",1)
    $Datei = FileOpen($Ort,4)
    While 1
    $String = FileRead($Datei, 1048576)
    If @error = -1 Then ExitLoop
    $Neue_Datei = FileOpen("Part"&$i&".txt", 18)
    FileWrite($Neue_Datei, $String)
    FileClose($Neue_Datei)
    $i += 1
    WEnd

    [/autoit]


    EDIT: 'ensplit' klingt wirklich nicht sehr gut. Wie wäre es mit 'File-Joiner' ?

  • Wow!


    Gefällt mir!^^ Funktioniert Super und verständlilch und kurz! Liegt es jetzt dadran das die Datei im Raw Read mode geöffnet wurde ?

    Es geht aufjeden Fall blitz schnell ^^:thumbup::thumbup::thumbup:


    Vielen Dank euch beiden,Oscar und Funkey!

    Lg,

    Lenny


    Edit:

    Ich habe jetzt auch noch mal das Gegenstück gebastelt:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <File.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("FileSplitter", 192, 146, 193, 125)
    $Button1 = GUICtrlCreateButton("Split File", 8, 120, 83, 17, 0)
    $Button2 = GUICtrlCreateButton("EnSplit File", 96, 120, 83, 17, 0)
    $Pic1 = GUICtrlCreatePic("", 8, 8, 172, 100, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    _splitfile()
    Case $Button2
    _ensplitfile()
    EndSwitch
    WEnd

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

    Func _splitfile()
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    Global $i = 1

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

    $setting = 0

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Progress", 615, 37, 284, 540, BitOR($WS_EX_TOPMOST, $WS_MINIMIZEBOX, $WS_POPUP, $WS_GROUP, $WS_BORDER))
    $Label1 = GUICtrlCreateLabel("", 0, 0, 615, 37, -1, $GUI_WS_EX_PARENTDRAG)
    $Progress1 = GUICtrlCreateProgress(0, 0, 615, 37)
    GUISetState(@SW_HIDE)
    #EndRegion ### END Koda GUI section ###

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

    $Ort = FileOpenDialog("Datei zum Splitten aussuchen", "", "Alle Dateien (*.*)", 1)

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

    $Datei = FileOpen($Ort, 4)

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

    $size = FileGetSize($Ort)

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

    ClipPut($size)

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

    GUISetState(@SW_SHOW)

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

    While 1
    $String = FileRead($Datei, 1048576)

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

    If @error = -1 Then ExitLoop

    $Neue_Datei = FileOpen("Part" & $i & ".txt", 18)

    FileWrite($Neue_Datei, $String)

    $status = $size / 1024 / 1000

    $real = 100 / $status

    $setting += $real

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

    GUICtrlSetData($Progress1, $setting)

    FileClose($Neue_Datei)

    $i += 1

    WEnd

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

    GUISetState(@SW_HIDE)

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

    EndFunc ;==>_splitfile

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

    Func _ensplitfile()
    $saveit = FileSaveDialog("Save your File", @WorkingDir, "All Files (*.*)")

    $search = FileFindFirstFile("*.txt")

    $i = 0

    $complete = ""

    If $search = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf

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

    While 1

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

    $file = FileFindNextFile($search)

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

    If @error Then ExitLoop

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

    $fileo = FileOpen($file, 16)

    $readed = FileRead($fileo)

    FileClose($fileo)

    $re = FileOpen($saveit, 1 + 8)

    FileWrite($re, $readed)

    FileClose($re)

    WEnd

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

    FileClose($search)

    EndFunc ;==>_ensplitfile

    [/autoit]

    Bitte fragt mich nicht nach dem Sinn.... So 100 % weiß ich es auch noch nicht ... Aber für Große "Urlaub Videos" zum Hochladen schon mal ganz okay ^^ ;)


    Achja ... Und es wäre Super wenn ihr mir das Gegenteil von FileSplitter sagen könntet ... EnSplitter ist es ja bestimmt nicht ;)

    Lg,

    Lenny

    Jaja, Moo does the Cow!

    Einmal editiert, zuletzt von Lenny (29. August 2008 um 12:26)