Programm schneller arbeiten lassen

  • Guten Tag allerseits^^
    Ich hab mir ein kleines Programm geschrieben, dass den Inhalt 2er Textdateien zusammenführen soll. Allerdings braucht das Programm bei größeren Inhalten viel zu lange und daher suche ich nach einer Alternative, damit es um einiges schneller arbeitet. Wenn jetzt aber als Beispiel In beiden Textdateien nun jeweils 100 Wörter in diesem Aufbau stehen, dann braucht das Programm schon ca 5 Minuten um deren Inhalte zu vergleichen und die neuen Wörter aus der 1. Textdatei in die 2. Textdatei zu kopieren. Das ist schon recht lange, finde ich. Daher bitte ich euch um Hilfe. Kennt ihr vielleicht schnellere und bessere Methoden als die, die ich angewandt hab?


    Beispiel des Aufbaus der 2 Textdateien:

    Textdatei 1:

    Code
    Auto
    Hahn
    Lexikon
    Buch

    Textdatei 2:

    Code
    Bulle
    Schmied
    Auto
    Gras
    Regenbogen
    [autoit]

    #include <file.au3>
    Dim $aRecords, $bRecords

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

    ; ------------------------- FIRST FILE ------------------------------------

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

    ; Shows the filenames of all files in the current directory.
    $search1 = FileFindFirstFile("output/*.txt")

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

    ; Check if the search was successful
    If $search1 = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf

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

    $fileread1 = FileFindNextFile($search1)
    $file1 = $fileread1
    ;~ MsgBox(4096, "File1:", $file1)

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

    ; Close the search handle
    FileClose($search1)

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

    ; ------------------------- NEXT FILE ------------------------------------

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

    ; Shows the filenames of all files in the current directory.
    $search2 = FileFindFirstFile("input/*.txt")

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

    ; Check if the search was successful
    If $search1 = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf

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

    $fileread2 = FileFindNextFile($search2)
    $file2 = $fileread2
    ;~ MsgBox(4096, "File2:", $file2)

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

    ; Close the search handle
    FileClose($search2)

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

    ;<< ------------------------- FILE Readed ------------------------- >>
    ;----------------------------------------------------------------

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

    ;--------------------------- Programm --------------------------
    If Not _FileReadToArray("input/" & $file2, $aRecords) Then
    MsgBox(4096, "Error", " Error reading log to Array2 error:" & @error)
    Exit
    EndIf
    If Not _FileReadToArray("output/" & $file1, $bRecords) Then
    MsgBox(4096, "Error", " Error reading log to Array1 error:" & @error)
    Exit
    EndIf
    For $x = 1 To $aRecords[0]
    ;Msgbox(0,'Record:' & $x, $aRecords[$x])
    $cRecords = True
    For $y = 1 To $bRecords[0]
    If $aRecords[$x] == $bRecords[$y] Then
    $cRecords = False
    EndIf
    Next
    If $cRecords == True Then
    $file = FileOpen("output/" & $file1, 1)
    FileWrite($file, @CRLF & $aRecords[$x])
    FileClose($file)
    EndIf
    Next
    MsgBox(64, "Status", "Dateivergleich abgeschlossen!")

    [/autoit]
  • Versuche bitte mal deine 2 Dateien nicht bei jedem Schleifendurchlauf zu öffnen und zu schließen! ;)
    Dann dürfte dein Script seeeehr vieeel schnelle durch rattern... :D

    LG
    Christoph

    LG
    Christoph :)

  • Ich musste auch mal 2 Files miteinander vergleichen, ich hab dann einfach mit StringInStr gearbeitet, das ist schon deutlich schneller.
    Es gibt aber wahrscheinlich noch eine bessere Lösung:D
    EDIT:
    Is jetzt nicht arg viel schönen, aber findet jetzt zumindest alles...

    Spoiler anzeigen
    [autoit]

    #include <File.au3>

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

    Global $sPath1 = ''
    Global $sPath2 = ''
    Global $sFinal = ''

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

    Dim $avFileLines
    If _FileReadToArray($sPath1, $avFileLines) = 0 Then
    MsgBox(4096, 'Error', 'Error _FileReadToArray ('&$sPath1&') - error:' & @error)
    Exit
    EndIf

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

    $hFile = FileOpen($sPath2, 0)
    If $hFile = -1 Then
    MsgBox(0, 'Error', 'Unable to open '&$sPath2)
    Exit
    EndIf
    $sFinal = @CRLF&FileRead($hFile)&@CRLF
    FileClose($hFile)

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

    $timer = TimerInit()
    For $iI = 1 To $avFileLines[0]
    If StringInStr($sFinal, @CRLF&$avFileLines[$iI]&@CRLF, 1) = 0 Then
    $sFinal &= $avFileLines[$iI]&@CRLF
    EndIf
    Next
    ConsoleWrite(TimerDiff($timer)&@CRLF)

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

    MsgBox(0, 'FERTIG!', 'Benötigte zeit: '&TimerDiff($timer)&'ms!')

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

    $sFinal = StringTrimLeft(StringTrimRight($sFinal, 2), 2)
    ClipPut($sFinal)

    [/autoit]


    Ich hab jetzt mal 2 Files mit jeweils 1000*1000 Buchstaben vergleichen lassen und es hat ca. 7 Sekunden gebraucht.

    Zitat

    You just keep on trying 'till you run out of cake. ;)


    [STEAM] Source UDF

    4 Mal editiert, zuletzt von K4z (29. März 2012 um 18:22)