Ini Datei filtern

  • Hallo,
    gleich nach der Anmeldung und Vorstellung geht's gleich los mit ner Frage. :D

    Folgender Sachverhalt:
    Ich habe eine Ini Datei mit mehreren Sektionen und vielen Einträgen.

    Die Ini Datei sieht so oder so ähnlich aus.
    [Nationen]
    Nation1=Deutschland
    Nation2=Schweiz
    Nation3=Österreich
    Nation4=Frankreich
    .
    .
    .

    Jetzt will ich diese Ini Datei nach bestimmten Nationen filtern.
    Wenn diese Nationen(die ich mit einem Array festlege) in der Datei vorkommen, soll die ganze Zeile in eine andere Ini Datei geschrieben werden.
    z.B. steht Schweiz im Array, dann soll in der zweiten Ini Datei Nation2=Schweiz stehen.

    Ich hab schon ein paar kleinere Dinge versucht, aber nicht anständiges zu stande bekommen.
    Vielleicht bin ich mit meinem folgenden Beispiel auch auf dem komplett falschen Dampfer
    Wäre supernett wenn jemand einen Tipp/Trick für mich hätte. Bin offen für Ratschläge.

    Das ist bislang mein letzter Versuch. Als Fehlermeldung bekomm ich, dass was mit der Range des Arrays nicht stimmt. :?:

    Spoiler anzeigen
    [autoit]

    #Include <File.au3>
    #include <Array.au3>

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

    $nations = "Schweiz;Frankreich;Deutschland"
    $nations_array = Stringsplit($nations, ";")

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

    $var = IniReadSection("C:\Documents and Settings\User\Desktop\Test.ini", "Nationen")

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

    For $i = 1 To $var[0][0]

    Next


    if $nations_array[$i] = $var[$i][1] Then
    IniWrite("C:\Documents and Settings\User\Desktop\temp.ini", "Nationen", $var[$i][0], $var[$i][1])
    EndIf

    [/autoit]

    Wenn ich komplett falsch bin, sind neue und bessere Angehensweisen herzlich willkommen.
    Bin noch recht neu in AutoIT, also habt erbarmen mit mir. :D

  • War doch schon ein sehr guter Ansatz ;).

    Spoiler anzeigen
    [autoit]

    Global $Nations_Array[4] = ["", "Schweiz", "Frankreich", "Deutschland"]
    $var = IniReadSection("C:\Documents and Settings\User\Desktop\Test.ini", "Nationen")

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

    For $i = 1 To $var[0][0]
    For $j = 1 To UBound($Nations_Array) - 1
    If $Nations_Array[$j] = $var[$i][1] Then IniWrite("C:\Documents and Settings\User\Desktop\temp.ini", "Nationen", $var[$i][0], $var[$i][1])
    Next
    Next

    [/autoit]
  • Soll denn in der zweiten Ini, die selben Schlüssel verwendet werden die in der ersten drinstehen? Oder neue mit lfd. Nummer?

  • Danke blubbstar, aber wenn ich deins versuche bekomme ich "Subscript used with non-Array variable." bei For $i = 1 To $var^ ERROR als Fehlermeldung.

    M-obi. Der Schlüssel aus der ersten Datei soll auch in der zweiten Datei stehen.

  • Guck dir mal die Pfade an:

    Zitat

    "C:\Documents and Settings\User\Desktop\Test.ini"
    "C:\Documents and Settings\User\Desktop\temp.ini"

    Ich glaube, die existieren bei dir gar nicht, also kann der auch keinen Array ausgeben. Nimm am besten diese Pfade:

    [autoit]

    @ScriptDir & "\test.ini" / @ScriptDir & "\temp.ini"

    [/autoit]
    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • So hier:

    Spoiler anzeigen
    [autoit]

    Global $Nations_Array[3] = ["USA", "China", "Deutschland"]

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

    $var = IniReadSection(@DesktopDir & "\Test.ini", "Nationen")

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

    For $i = 0 To UBound($Nations_Array) - 1
    For $j = 1 To $var[0][0]
    If $Nations_Array[$i] = $var[$j][1] Then IniWrite(@DesktopDir & "\Temp.ini", "Nationen", $var[$j][0], $var[$j][1])
    Next
    Next

    [/autoit]
  • Danke, jetzt klappts.
    Hab ausversehen meinen Platzhalter mit User genommen. Wie peinlich. :D

    Jetzt hab ich die zweite Ini mit z.B. Nation2=Schweiz.
    Gibt es eine Möglichkeit eine Art Whitelist zu machen?
    Also jetzt soll die erste Ini wieder durchsucht werden. In jeder Sektion, in der Nation2(halt jeder Schlüssel, der in der 2.Ini steht) vorkommt, soll dieser Wert zur passenden Sektion in eine 3.Ini Datei geschrieben werden.

    Bei mir klappt das nur teilweise.
    Er schreibt die Schlüssel aus der zweiten Ini in jede Sektion. Leider wird der Wert(Value) mit überschrieben.
    Sollte am Ende so oder so ähnlich aussehen:
    [Nation]
    Nation2=Schweiz
    [Währung]
    Nation2=CHF
    [Bewohner]
    Nation2=8mio

    Was er bei mir grad macht ist:
    [Nation]
    Nation2=Schweiz
    [Währung]
    Nation2=Schweiz
    [Bewohner]
    Nation2=Schweiz

    Der fehlerhafte Code dazu:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $write = IniReadSectionNames(@ScriptDir & "\test.ini")

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

    For $z = 1 To $write[0]
    $var = IniReadSection(@ScriptDir & "\temp.ini", "Nationen")

    For $i = 1 To $var[0][0]
    IniWrite(@ScriptDir & "\ergebnis.ini", $write[$z], $var[$i][0], $var[$i][1])
    Next

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

    Next

    [/autoit]

    Danke

    Einmal editiert, zuletzt von Rei (28. Januar 2010 um 14:44)

  • Ist das immer noch die selbe ini??? Wahrscheinlich nicht, da mehr Sektionen hinzugekommen sind. Kannst du vielleicht mal einen beispielini posten? Kann mir im Moment schlecht vorstellen, was du willt (Whitelist ist klar, aber dein Script hat mich verwirrt, denn in der 3. ini steht dann das Selbe wie in der 2. ini)

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • 1)Die Test.ini ist die Ausgangsdatei(nur ein Auszug).
    2)Temp.ini ist die "Zwischenablage".
    3)Die Result.ini ist das Ergebnis.

    Je nachdem was in der Variable steht, soll das dann in der Result.ini stehen.
    In dem Fall der hochgeladenen Dateien stünden jetzt Schweiz und Spanien in der Variable bzw. Array.

    Ich habs mit der temp.ini im Zwischenschritt gemacht, vielleicht verwirrt das. Nur schaff ichs ohne nicht.
    Hoffentlich klärt das offene fragen.

  • So, habs:

    Spoiler anzeigen
    [autoit]

    $write = IniReadSectionNames(@ScriptDir & "\test.ini")
    $var2 = IniReadSection(@ScriptDir & "\test.ini", "Nationen")
    $var = IniReadSection(@ScriptDir & "\temp.ini", "Nationen")
    For $z = 1 To $write[0]
    $var3 = IniReadSection(@ScriptDir & "\test.ini", $write[$z])
    For $t = 1 To $var2[0][0]
    For $i = 1 To $var[0][0]
    If $var[$i][0] = $var2[$t][0] Then
    IniWrite(@ScriptDir & "\Result.ini", $write[$z], $var[$i][0], $var3[$i][1])
    EndIf
    Next
    Next
    Next

    [/autoit]
    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • @ m-obi:

    Ich hab eine riesige Ini-Datei.
    Wenn ich nach einem Land(oder mehreren) suchen will, dann soll mir in der Ergebnis.ini das Resultat angezeigt werden.

  • Lad dochmal die INI hoch, zum testen. Willst du nur nach Ländern suchen oder auch Einwohnerzahl oder so?