Problem mit _ArraySearch

  • Hallo,

    ich habe irgendwie ein kleines indirektes Problem mit Arraysearch. und zwar:

    [autoit]

    $referenz = @scriptdir & "\referenz.txt"
    Global $areferenz
    _FileReadToArray($referenz, $areferenz)
    for $g = 1 to ubound($csv) - 1
    $swinreferenz = _ArraySearch($areferenz, $csv[$g][0])
    if $swinreferenz > 0 Then
    if $swinreferenz < 100 Then
    $csv[$swinreferenz][2] = "X"
    EndIf
    EndIf
    Next

    [/autoit]

    Damit vergleich ich den Inhalt von einem 1D-Array und der ersten Spalte von einem 2D-Array.
    Wenn der Inhalt gefunden wurden, dann soll ein X in die 3. Spalte des Arrays ($csv) geschrieben werden.
    In welche Zeile geschrieben wird, bestimme ich ja durch _ArraySearch. Das funktioniert nur zum Teil.
    Wenn $swinreferenz = _ArraySearch($areferenz, $csv[$g][0]) größer als 99 wird (und das wird es)
    Dann gibt er mir aus:
    "Error: Array variable has incorrect number og subscripts or subscript dimension range exceeded."

    So wie oben, funktionierts halt. Aber das bringt mich nicht weiter, da ich auch Zeilen oberhalb der 99
    ändern möchte. Wenn ich jetzt $csv[$swinreferenz][2] = "X" in z. B. $csv[105][2] = "X" ändere, dann funktionierts...

    2 Mal editiert, zuletzt von Scritch (10. Mai 2011 um 11:19)

  • Keiner eine Idee?
    Habe gestern eine Alternativlösung gefunden:

    [autoit]

    $referenz = @scriptdir & "\referenz.txt"
    Global $areferenz
    _FileReadToArray($referenz, $areferenz)
    for $g = 1 to ubound($csv) - 1
    $swinreferenz = _ArraySearch($areferenz, $csv[$g][0])
    $swinreferenzanders = $swinreferenz
    if $swinreferenz > 0 Then
    $csv[$swinreferenz][2] = "X"
    EndIf
    Next

    [/autoit]


    Funktionierte gestern soweit, heute funktioniert es wieder nicht...

  • Doch, ich hab da eine Idee ;)
    Die Fehlermeldung besagt, das du auf ein Arrayelement zugreifen möchtest, welches nicht existiert.

    Das Problem entsteht, wenn das Array $aReferenz grösser ist als $aCSV

    Beispiel
    [autoit]

    Dim $aReferenz[4] = ["bla", "blub", ,"blablub","blubber"]
    Dim $aCSV[3][3] = [["hallo", "", ""],["blubber", "", ""],["welt", "", ""]]
    For $g = 1 To UBound($acsv) - 1
    $sWinreferenz = _ArraySearch($aReferenz, $aCSV[$g][0])
    If $sWinreferenz > 0 Then
    If $sWinreferenz < 100 Then
    $aCSV[$sWinreferenz][2] = "X"
    EndIf
    EndIf
    Next

    [/autoit]


    _ArraySearch() wird hier den Index 3 zurückgeben ("blubber" gefunden). Dann versuchst du,auf diesen Index in $aCSV zuzugreifen ($aCSV[$sWinreferenz][2] = "X"). Diesen Index gibt es aber nicht. $aCSV hat nur 3 Elemente. Du müsstest also vorher prüfen, ob $sWinreferenz < Ubound($aCSV)-1 ist.

  • Verstehe ich trotzdem nicht: Wenn das zu durchsuchende Array ($aReferenz) größer als das andere Array ist, wo die "Sucbegriffe drinstehen,
    kann doch trotzdem in $aReferenz gesucht werden...
    Wenn $aReferen 1000 Einträge hat, kann ich doch trotzdem nach den Einträgen aus $aCSV suchen, auch wenn $aCSV nur 3 Einträge hat...
    Ich arbeite doch eig. gar nicht mit der Anzahl der Einträge in $aReferenz, außer bei der Ausgabe. Und diese Ausgabe benutze ich ja nicht
    in Verbindung mit $aCSV.


    Wenn $aReferenz größer ist als $aCSV, soll die Suche nicht abgebrochen werden. Was kann ich da machen, außer $aCSV neu zu dimensionieren?

  • Das Problem ist nicht das Suchen an sich, sondern das Eintragen in $aCSV.
    Wenn $aCSV nur 100 Elemente hat und du irgendwas in $aReferenz[200] findest, dann kannst du halt nichts in $aCSV(200][2] schreiben.

    Irgendwie verstehe ich das Skript sowieso nicht. Du möchtest jedes Wort aus $aCSV[n][0] in $aReferenz suchen. Wenn es gefunden wird, dann soll in $aCSV[n][2] ein Kreuz gesetzt werden? Wenn ja, dann müsste es $csv[$g][2] = "X" heissen.

    Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ;2011-05-10 12:26:33
    #EndRegion - Timestamp
    #include <array.au3>
    Dim $aReferenz[4] = ["bla", "blub", "blablub","blubber"]
    Dim $aCSV[3][3] = [["hallo", "", ""],["blubber", "", ""],["welt", "", ""]]
    For $g = 1 To UBound($acsv) - 1
    $sWinreferenz = _ArraySearch($aReferenz, $aCSV[$g][0])
    ConsoleWrite($sWinreferenz & @CRLF)
    If $sWinreferenz > 0 Then
    If $sWinreferenz < 100 Then
    $aCSV[$g][2] = "X"
    EndIf
    EndIf
    Next
    _ArrayDisplay($acsv)

    [/autoit]


    Es ergibt für mich irgendwie keinen Sinn, ein Kreuz bei einem Index zu setzen, der rein garnichts mit dr Suche zu tun hat.

  • Es ergibt für mich irgendwie keinen Sinn, ein Kreuz bei einem Index zu setzen, der rein garnichts mit dr Suche zu tun hat.

    Du hast Recht. Da bin ich gar nicht drüber gestolpert :pinch:
    Peinlich :D

    [autoit]

    $referenz = @scriptdir & "\referenz.txt"
    Global $areferenz
    _FileReadToArray($referenz, $areferenz)
    for $g = 1 to ubound($areferenz) - 1
    $swinreferenz = _ArraySearch($csv, $areferenz[$g])
    if not $swinreferenz = (-1) Then
    if $swinreferenz > 0 Then
    $csv[$swinreferenz][2] = "Ja"
    EndIf
    EndIf
    Next

    [/autoit]