Textdatei splitten

  • Hi,

    ich stehe gerade vor folgendem Problem.
    Eine TXT Datei läßt sich auf Grund ihrer Größe (ca. 900MB - mit ca. 650.000 Zeilen) nicht öffnen.

    Meine Idee:
    Den Inhalt auf mehrere kleine Dateien verteilen.
    Gehe aber davon dass ich dafür nicht gerade den optimalen Weg gewählt habe.
    Es dauert jetzt schon 20min und bin erst in Zeile 12.000.

    [autoit]

    #include <file.au3>
    Global $d=1
    Global $z=1
    Global $a=1
    zeile()
    func zeile()
    $a=1
    do
    if FileReadLine(@ScriptDir&"\Test\DBDVFALT.TXT",$z)="" Then
    Exit
    Else
    FileWriteLine(@ScriptDir&"\Test\DBDVFALT_"&$d&".TXT",FileReadLine(@ScriptDir&"\Test\DBDVFALT.TXT",$z))
    SplashTextOn("","Datei: "&$d&@CRLF&"Zeile: "&$z,200,120)
    $a=$a+1
    $z=$z+1
    EndIf
    until $a=10000
    datei()
    EndFunc
    func datei()
    $d=$d+1
    FileWrite(@ScriptDir&"\Test\DBDVFALT_"&$d&".TXT","")
    zeile()
    EndFunc

    [/autoit]

    Einer von euch ne Idee?

    Einmal editiert, zuletzt von HaTe (1. August 2008 um 09:35)

  • Spoiler anzeigen
    [autoit]


    $file_count = 50
    $read = FileRead( @ScriptDir&"\Test\DBDVFALT.TXT" )
    $bsize = Ceiling( StringLen( $read ) / $file_count )

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

    For $i = 1 To $file_count
    ToolTip( ($i/$file_count)*100 & '%' )
    FileWrite( @ScriptDir&"\Test\DBDVFALT_" & $i & ".TXT", StringLeft( $read, $bsize ) )
    $read = StringTrimLeft( $read, $bsize )
    Next

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

    MsgBox( 0, '', 'Done' )

    [/autoit]

    Das wär mein Vorschlag x)
    Der Splitted die eine Datei auf eine gewünschte Anzahl..
    Einfach nach Belieben $file_count ändern.
    Ich weiß aber nicht, wie gut das mit so ner meega-Datei funzt, weil der erst
    die ganze Datei mit FileRead einliest.

    Du kannst das natürlich auch so machen:

    Spoiler anzeigen
    [autoit]


    $file_size = 10000000
    $file = FileOpen( @ScriptDir&"\Test\DBDVFALT.TXT", 0 )
    $a = 1
    Do
    $read = FileRead( $file, $file_size )
    $err = @error
    FileWrite( @ScriptDir&"\Test\DBDVFALT_" & $a & ".TXT", $read )
    $a += 1
    ToolTip( $a )
    Until $err = -1
    FileClose( $file )
    MsgBox( 0, '', 'Done' )

    [/autoit]

    Da wird die Datei nur geöffnet und Stück für Stück gelesen & geschrieben,
    da werden x Dateien erstellt mit der vorgegebenen Länge von $file_size.

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.