Keys aus einer ini auslesen und vergleichen

  • hallo ich hab folgendes problem
    ich habe ein script das verschidene zahlen in EINE ini schrebt unter fortlaufenden keys
    sprich:

    Zitat

    [temp]
    1=3120528
    2=3120528
    3=2932864
    usw.

    gibt es nun eine möglichkeit gleiche zahlen zu finden und auszugeben?
    tia

  • So?

    Spoiler anzeigen
    [autoit]

    $zahl1 =IniRead ( "ini name", "temp",1, "not found" )
    $zahl2 =IniRead ( "ini name", "temp",2, "not found" )

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

    if $zahl1 = $zahl2 Then
    ...

    [/autoit]
  • Wahrscheinlich ist das jetzt viel zu kompliziert,
    aber ich habs mal versucht ^^
    Also in $com[$x][0] steht die Zahl, in [$x][1] die Ini-Keys, die diese Zahl als Wert haben.
    Hoffe das funzt ;)

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $ini = IniReadSection( 'n.ini', 'temp' )
    If @error Then Exit
    Dim $com[1][2]
    $a = 0
    For $i = 1 To $ini[0][0]
    For $j = 1 To $ini[0][0]
    If $ini[$i][1] = $ini[$j][1] And $ini[$i][1] <> '' And $i <> $j Then
    $found = False
    For $c = 1 To UBound( $com ) -1
    If $com[$c][0] = $ini[$i][1] Then
    If Not StringInStr( $com[$c][1], $i ) Then $com[$c][1] &= ',' & $i
    If Not StringInStr( $com[$c][1], $j ) Then $com[$c][1] &= ',' & $j
    $found = True
    EndIf
    Next
    If Not $found Then
    $com[$a][0] = $ini[$i][1]
    $com[$a][1] = $i & ',' & $j
    $a += 1
    ReDim $com[$a+1][2]
    EndIf
    EndIf
    Next
    Next
    _ArrayDisplay( $com )

    [/autoit]


    mfg limette

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

  • Hi wenn du das Programm selber geschrieben hast, welches die INI-Datei befüllt, dann prüfe einfach vorher mit einem INIread ob die Zahl schon in der INI steht. Wenn ja dann net reinschreiben und wenn nei doch reinschreiben.

    Wenn du nur die INI-Datei auswerten möchtest, die Datei komplett auslesen (array) und vieleicht mit _ArraySearch dann as Array überprüfen ob der Eintrag schon vorhanden ist.
    Es gibt glaube ich unter Autoit keine Arrayfunktion die gleiche Werte ermittelt. Seiden BugFix hat da schon was geschrieben ;)

    MfG
    Der_Doc

  • _Array2DDblDel von Bugfix sucht doppelte Einträge und löscht die ggf. auch.

    Das sollte Dir dabei helfen.

    Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Zitat von laku

    gibt es nun eine möglichkeit gleiche zahlen zu finden und auszugeben?


    Also für mich heißt das nicht, dass er doppelte Einträge löschen, sondern wissen wil,
    welche Keys (1,2,3,4,...) denselben Wert haben.
    _Array2DDblDel hört sich nach löschen an, ich kenn die Funktion allerdings nicht und kann
    daher nicht beurteilen, wie sie funktioniert und was sie ausgibt.
    Daher nochmal mein eigener Code dazu ;)

    Dieser Code:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $ret = _IniGetMultiOcc( 'n.ini', 'temp' )
    _ArrayDisplay( $ret )

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

    ; Name...........: _IniGetMultiOcc
    ; Description ...: Überprüft die Sektion einer Ini auf mehrere Vorkommen desselben Wertes
    ; Syntax.........: _IniGetMultiOcc( $ini_path, $ini_section )
    ; Parameters ....: $ini_path = Pfad zur Ini
    ; $ini_section = Zu lesende Sektion
    ; Return values .: Success - Gibt eine Zweidimensionale Array zurück:
    ; $array[x][0] = Wert
    ; $array[x][1] = Keys der Ini mit diesem Wert, getrennt durch ','
    ; Failure - 0, sets @error to 1
    ; Author ........: limette

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

    ; Note: Endlich hab ich auch mal einen Grund eine Beschreibung anzufügen xD
    ; Irgendwie. Sinnlos. - kannste löschen ;)
    Func _IniGetMultiOcc( $ini_path, $ini_section )
    Local $ini = IniReadSection( $ini_path, $ini_section )
    If @error Then Return SetError( 1, 0, 0 )
    Local $com[1][2]
    Local $a = 0, $p, $pi, $i, $j, $c, $found

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

    For $i = 1 To $ini[0][0]
    $p = False
    For $pi = 0 To UBound( $com ) -1
    If $com[$pi][0] = $ini[$i][1] Then ;Eintrag bereits in $com enthalten
    $p = True
    ExitLoop
    EndIf
    Next
    If Not $p Then ;Wenn Eintrag noch nicht enthalten:
    For $j = 1 To $ini[0][0] ;Gehe alle Werte durch
    If $ini[$i][1] = $ini[$j][1] And $ini[$i][1] <> '' And $i <> $j Then ;Wenn der Wert gleich ist, aber nicht dasselbe Element
    For $c = 0 To UBound( $com ) -1
    If $com[$c][0] = $ini[$i][1] Then ;Check, ob inzwischen ein Eintrag angelegt wurde
    If Not StringInStr( $com[$c][1], $i ) Then $com[$c][1] &= ',' & $i ;adden, wenn nicht enthalten
    If Not StringInStr( $com[$c][1], $j ) Then $com[$c][1] &= ',' & $j ; - " -
    $p = True ;Merke: es existiert bereits ein Eintrag
    ExitLoop
    EndIf
    Next
    If Not $p Then ;Wenn keiner existiert:
    $com[$a][0] = $ini[$i][1]
    $com[$a][1] = $i & ',' & $j ;lege einen an.
    $a += 1
    ReDim $com[$a+1][2]
    $p = True
    EndIf
    EndIf
    Next
    If Not $p Then ;Wenn nach allen Durchgängen für das eine $i immernoch kein Eintrag existiert, gibt es $i nur 1x und wird hier hinzugefügt
    $com[$a][0] = $ini[$i][1]
    $com[$a][1] = $i
    $a += 1
    ReDim $com[$a+1][2]
    EndIf
    EndIf
    Next
    ReDim $com[UBound( $com )-1][2]
    Return $com
    EndFunc ;==> _IniGetMultiOcc

    [/autoit]


    Gibt bei dieser Ini

    Spoiler anzeigen


    das hier aus

    Spoiler anzeigen
    Zitat von Ausgabe


    [0] | 3120528 | 1,2,5,8,12
    [1] | 2932864 | 3,6
    [2] | 1252784 | 4,7,9,10
    [3] | 4465783 | 11

    Ich denke das sind Wertem mit denen man arbeiten kann.
    Hoffe geholen zu haben ;)

    mfg limette

    Edit: Streich den Monstercode da oben. Geht viiieeel einfacher x)

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $arr = _IniGetMultiOcc( 'n.ini', 'temp' )
    _ArrayDisplay( $arr )

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

    Func _IniGetMultiOcc( $sini, $isection )
    FileDelete( @TempDir & '\temp.ini' )
    $ini = IniReadSection( $sini, $isection )
    If @error Then Return SetError( -1, 0, 0 )
    For $i = 1 To $ini[0][0]
    $wr = IniRead( @TempDir & '\temp.ini', 'temp', $ini[$i][1], '' )
    If $wr <> '' Then $wr &= ','
    $wr &= $ini[$i][0]
    IniWrite( @TempDir & '\temp.ini', 'temp', $ini[$i][1], $wr )
    Next
    Return IniReadSection( @TempDir & '\temp.ini', 'temp' )
    EndFunc

    [/autoit]

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

    Einmal editiert, zuletzt von limette (31. August 2008 um 11:27)

  • Hallo limette,

    habe ein ähnlich gelagertes Problem und ich weiß nicht so recht wie ich es lösen soll. Vielleicht kannst Du (oder ein anderer Forumsteilnehmer) behilflich sein.

    Also meine cfg -> sprich ini sieht so aus:

    [15]
    Available=1
    Visible=0
    Plausibl=1
    [16]
    Available=0
    Visible=0
    Plausibl=1
    [17]
    Available=0
    Visible=0
    Plausibl=1

    ...das sind programminterne Speicherplätze für Wettersensoren, wobei Programmplatz [15] belegt ist und die anderen Beiden noch frei. Nun brauche ich eine Datei, in der steht welche Plätze noch frei ("Available=0") sind. Bezogen auf diesen kleinen Ausschnitt der *cfg sollte dann in der Datei stehen:

    16,17


    -volker-

    • Offizieller Beitrag

    Hi,
    ist nicht sehr kompliziert:

    [autoit]

    $INI = 'Dateipfad_Deiner.INI'
    $arSections = IniReadSectionNames($INI)
    $Free = ''
    For $i = 1 To UBound($arSections) -1
    If IniRead($INI, $arSections[$i], 'Available', -1) = 0 Then $Free &= $arSections[$i] & ','
    Next
    If StringLen($Free) > 0 Then
    $Free = StringTrimRight($Free, 1)
    Else
    $Free = 'Keine'
    EndIf
    MsgBox(0, '', 'Freie Speicherplätze: ' & $Free)

    [/autoit]
  • Geil - klappt wunderbar. Jetzt komme ich wieder weiter.

    ...schönen lieben Dank für Deine Zeit.


    -volker-