Datei in array

  • Hallo Leute,
    ich sitze mal wieder vor einem Projekt und habe gerade keine Ahnung, wie ich das realisieren soll.

    Es geht darum das eine Datei, wie die folgende

    Spoiler anzeigen


    Vergleichen der Dateien C:\UPDATE\filesbefore.fildb und C:\UPDATE\FILESSAFTER.FOLDB
    ***** C:\UPDATE\filesbefore.fildb
    C:\Dokumente und Einstellungen\All Users\Startmenü\Programme\D-GISS\D-GISS 2009-2010 Externer Etikettendruck.lnk
    C:\Dokumente und Einstellungen\All Users\Startmenü\Programme\Informatik\bluej.exe.lnk
    ***** C:\UPDATE\FILESSAFTER.FOLDB
    C:\Dokumente und Einstellungen\All Users\Startmenü\Programme\D-GISS\D-GISS 2009-2010 Externer Etikettendruck.lnk
    C:\Dokumente und Einstellungen\All Users\Startmenü\Programme\IcoFX 1.6\IcoFX on the Web.lnk
    C:\Dokumente und Einstellungen\All Users\Startmenü\Programme\IcoFX 1.6\IcoFX.lnk
    C:\Dokumente und Einstellungen\All Users\Startmenü\Programme\IcoFX 1.6\Uninstall\Uninstall IcoFX.lnk
    C:\Dokumente und Einstellungen\All Users\Startmenü\Programme\Informatik\bluej.exe.lnk
    *****

    ***** C:\UPDATE\filesbefore.fildb
    C:\Dokumente und Einstellungen\Lokaler Benutzer\Anwendungsdaten\Macromedia\Flash Player\#Security\FlashPlayerTrust\air.1.0.trus
    .cfg
    ***** C:\UPDATE\FILESSAFTER.FOLDB
    C:\Dokumente und Einstellungen\Lokaler Benutzer\Anwendungsdaten\IcoFX\colors.dat
    C:\Dokumente und Einstellungen\Lokaler Benutzer\Anwendungsdaten\IcoFX\config.cfg
    C:\Dokumente und Einstellungen\Lokaler Benutzer\Anwendungsdaten\IcoFX\quickcolors.dat
    C:\Dokumente und Einstellungen\Lokaler Benutzer\Anwendungsdaten\Macromedia\Flash Player\#Security\FlashPlayerTrust\air.1.0.trus
    .cfg
    *****

    ***** C:\UPDATE\filesbefore.fildb
    C:\Programme\gs\gs8.70\lib\zeroline.ps
    C:\Programme\Informatic\ORFO 8.0\Add_Remove.exe
    ***** C:\UPDATE\FILESSAFTER.FOLDB
    C:\Programme\gs\gs8.70\lib\zeroline.ps
    C:\Programme\IcoFX 1.6\IcoFX.exe
    C:\Programme\IcoFX 1.6\IcoFX.url
    C:\Programme\IcoFX 1.6\library.dll
    C:\Programme\IcoFX 1.6\unins000.dat
    C:\Programme\IcoFX 1.6\unins000.exe
    C:\Programme\IcoFX 1.6\html\Error.html
    C:\Programme\IcoFX 1.6\html\logo.jpg
    C:\Programme\IcoFX 1.6\Languages\Deutsch.lng
    C:\Programme\IcoFX 1.6\Languages\English.lng
    C:\Programme\IcoFX 1.6\Languages\Español.lng
    C:\Programme\IcoFX 1.6\Languages\French.lng
    C:\Programme\IcoFX 1.6\Languages\Italiano.lng
    C:\Programme\IcoFX 1.6\Languages\Japanese.lng
    C:\Programme\IcoFX 1.6\Languages\Korean.lng
    C:\Programme\IcoFX 1.6\Languages\Magyar.lng
    C:\Programme\IcoFX 1.6\Languages\Readme.txt
    C:\Programme\IcoFX 1.6\Languages\Russian.lng
    C:\Programme\IcoFX 1.6\Objects\film.png
    C:\Programme\IcoFX 1.6\Objects\frame.png
    C:\Programme\IcoFX 1.6\Objects\picture.png
    C:\Programme\IcoFX 1.6\Objects\seal.png
    C:\Programme\IcoFX 1.6\Objects\stamp.png
    C:\Programme\IcoFX 1.6\Palettes\Blue.pal
    C:\Programme\IcoFX 1.6\Palettes\Cyan.pal
    C:\Programme\IcoFX 1.6\Palettes\Default.pal
    C:\Programme\IcoFX 1.6\Palettes\Grayscale.pal
    C:\Programme\IcoFX 1.6\Palettes\Green.pal
    C:\Programme\IcoFX 1.6\Palettes\Macintosh16.pal
    C:\Programme\IcoFX 1.6\Palettes\Macintosh2.pal
    C:\Programme\IcoFX 1.6\Palettes\Macintosh256.pal
    C:\Programme\IcoFX 1.6\Palettes\Magenta.pal
    C:\Programme\IcoFX 1.6\Palettes\Red.pal
    C:\Programme\IcoFX 1.6\Palettes\Windows16.pal
    C:\Programme\IcoFX 1.6\Palettes\Windows2.pal
    C:\Programme\IcoFX 1.6\Palettes\Yellow.pal
    C:\Programme\Informatic\ORFO 8.0\Add_Remove.exe
    *****

    verglichen wird, sodass ein array zurückegegeben wird, das alle "neuen" Elemente, wie folgt enthält:

    Spoiler anzeigen


    $array[0]=Anzahl der Elemente des Arrays
    $array[1]=C:\Dokumente und Einstellungen\All Users\Startmenü\Programme\IcoFX 1.6\IcoFX on the Web.lnk
    $array[2]=C:\Dokumente und Einstellungen\All Users\Startmenü\Programme\IcoFX 1.6\IcoFX.lnk
    $array[3]=C:\Dokumente und Einstellungen\All Users\Startmenü\Programme\IcoFX 1.6\Uninstall\Uninstall IcoFX.lnk
    $array[4]=C:\Dokumente und Einstellungen\Lokaler Benutzer\Anwendungsdaten\IcoFX\colors.dat
    $array[5]=C:\Dokumente und Einstellungen\Lokaler Benutzer\Anwendungsdaten\IcoFX\config.cfg
    $array[6]=C:\Dokumente und Einstellungen\Lokaler Benutzer\Anwendungsdaten\IcoFX\quickcolors.dat

    usw...

  • Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #include <Array.au3>
    Local $aRecords,$aArray[1]
    _FileReadToArray("Test.txt", $aRecords)
    For $i = 2 To UBound($aRecords)-1
    If StringInStr($aRecords[$i],"***") Or Not StringInStr($aRecords[$i],'C:\') Then ContinueLoop
    If $aRecords[$i] = '' Then ContinueLoop

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

    _ArrayAdd($aArray,$aRecords[$i])
    Next
    _ArrayDisplay($aArray)

    [/autoit]

    Gruß Marvin

  • Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>
    Local $aRecords,$aArray[1]
    _FileReadToArray("Test.ini", $aRecords)
    _Array2DDblDel($aRecords, 1)
    _ArrayDisplay($aRecords)

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

    ;----------------------------------------------------------------------------------------------------------------------
    ; Function _Array2DDblDel(ByRef $ARRAY [, $CASESENS=0])
    ;
    ; Description - From an 1D/2D Array will delete double entries (2D -> combination by '[n][0]' to '[n][x]').
    ; - Autodetection 1D/2D Array
    ; - By using string, you can choose case sensitivity.
    ;
    ; Parameter $ARRAY: Array to sort
    ; optional $CASESENS: Case sensitivity off[0] or on[1] (default 0)
    ;
    ; Return Succes ByRef Array without doubles
    ; Count of doubles
    ; Failure 0 and set @error = 1; no array
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    Func _Array2DDblDel(ByRef $ARRAY, $CASESENS=0)
    Local $arTmp[1] = [''], $dbl = 0, $count = 0, $x, $l, $val, $valTmp, $i, $k
    If ( Not IsArray($ARRAY) ) Then
    SetError(1)
    Return 0
    EndIf
    Local $Ubound2nd = UBound($ARRAY,2)
    If @error = 2 Then
    For $i = 0 To UBound($ARRAY)-1
    $dbl = 0
    For $k = 0 To UBound($arTmp)-1
    Switch $CASESENS
    Case 0
    If $arTmp[$k] = $ARRAY[$i] Then
    $dbl = 1
    $count += 1
    EndIf
    Case 1
    If $arTmp[$k] == $ARRAY[$i] Then
    $dbl = 1
    $count += 1
    EndIf
    EndSwitch
    Next
    If $dbl = 0 Then
    If $arTmp[0] = "" Then
    $arTmp[0] = $ARRAY[$i]
    Else
    ReDim $arTmp[UBound($arTmp)+1]
    $arTmp[UBound($arTmp)-1] = $ARRAY[$i]
    EndIf
    Else
    $dbl = 0
    EndIf
    Next
    Else
    ReDim $arTmp[1][$Ubound2nd]
    $arTmp[0][0] = ''
    $x = 0
    For $i = 0 To UBound($ARRAY)-1
    $dbl = 0
    $val = ''
    $valTmp = ''
    For $l = 0 To $Ubound2nd-1
    $val &= $ARRAY[$i][$l]
    Next
    For $k = 0 To UBound($arTmp)-1
    For $l = 0 To $Ubound2nd-1
    $valTmp &= $arTmp[$k][$l]
    Next
    Switch $CASESENS
    Case 0
    If $valTmp = $val Then
    $dbl = 1
    $count += 1
    EndIf
    Case 1
    If $valTmp == $val Then
    $dbl = 1
    $count += 1
    EndIf
    EndSwitch
    $valTmp = ''
    Next
    If $dbl = 0 Then
    If $x = 1 Then ReDim $arTmp[UBound($arTmp)+1][$Ubound2nd]
    For $l = 0 To $Ubound2nd-1
    If $arTmp[0][0] = '' Or $x = 0 Then
    $arTmp[0][$l] = $ARRAY[0][$l]
    If $l = $Ubound2nd-1 Then $x = 1
    Else
    $arTmp[UBound($arTmp)-1][$l] = $ARRAY[$i][$l]
    $x = 2
    If $l = $Ubound2nd-1 Then $x = 1
    EndIf
    Next
    Else
    $dbl = 0
    EndIf
    Next
    EndIf
    $ARRAY = $arTmp
    Return $count
    EndFunc ; ==>_ArrayDblDel

    [/autoit]
  • XD was davon willst du denn haben? die Keys? den Inhalt der Keys? oder ggf nur die Oberstrucktur? haha

    Gruß Marvin

  • Die Datei ist vom Aufbau her eine ini-Datei.
    Schau dir daher die Ini-Funktion von AutoIt an:

    [autoit]

    IniReadSectionNames
    IniReadSection
    IniRead

    [/autoit]

    Wie man sie benutzt steht ausführlich in Hilfe - vor allem in den Beispielen.
    Nur bei den mehrzeiligen Einträgen musst du dir was eigenes basteln.

  • XD was davon willst du denn haben? die Keys? den Inhalt der Keys? oder ggf nur die Oberstrucktur? haha

    Gruß Marvin

    Es geht primär darum, die Unterschiede festzustellen und diese auszugeben z.B. so z.B.

    Spoiler anzeigen

    $array[0][0]="HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 1\Logical Unit Id 0"
    $array[0][1]="Type"
    $array[0][2]="CdRomPeripheral"
    $array[0][3]="REG_SZ"
    $array[0][4]="+" (+ für neu; ~ für verändert, - für gelöscht)

    Allerdings unter der Vorraussetzung, dass der Key in der 1.Datei nicht vorhanden ist, aber in der 2.Datei.
    Wenn das jemand hinkriegen würde, wäre das super :) .

  • Soweit ich dass sehe dauert es eine Weile das Script dafür zu schreiben, wie wäre es selber erstmal damit anzufangen und dann Fragen zu stellen und nicht nach einem fertigem Script zu verlangen, wir sind hier doch ein Hilfe und Support und kein Fourm was fertige Lösungen anbietet dann könnten wir ja auch gleich Geld verlangen..

    EDIT: ggf hilft dir hier eine Funktion von BugFix weiter https://autoit.de/index.php?page…60542#post60542
    Gruß Marvin

    Einmal editiert, zuletzt von Protex (15. März 2012 um 07:41)