ArraySearch Problem.

  • Hallo,

    ich habe eine CSV Datei mit 3200 Rufnummern. 1 Zeile befindet sich die PC nummer, zweite Vorwahl und in der dritten die Rufnummer.

    Die Datei lese ich mit _FileReadToArray ein. Das klappt alles. Leider sind die PC-Nummern nicht durchnummeriert von 1 bis 3200.

    Folgenes funktioniert.

    Spoiler anzeigen
    [autoit]


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

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

    _FileReadToArray("pcliste.csv", $rufnummer)

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

    $pcnummer = InputBox("PC", "Welcher PC:")

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

    $index = _ArraySearch($rufnummer, $pcnummer & ";", 1, 0, 0, 1)
    $nummer = StringSplit($rufnummer[$index], ";", 2)
    $telefon = $nummer[1] & $nummer[2]

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

    MsgBox(4096, "Test", $telefon) ; eigendlich wird die Rufnummer ans Telefon übertragen.

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

    Funktioniert einwandfrei, ABER beispiel: suche ich nach dem PC 5208 findet der die Zahl in einer Vorwahl vom PC 3117..

    Wie kann ich angeben, dass der NUR in der ersten Spalte sucht.

    Bitte um Hilfe... oder hat jemand eine andere Idee, wie ich das Realisieren kann.

    Einmal editiert, zuletzt von Schickedim (22. März 2012 um 16:01)

  • Dafür müsstest du ein 2D array verwenden, was ich ohnehin bevorzugen würde bei CSV Dateien.
    Wenn du _filereadtoarray weiter verwenden willst und das nicht komplett selbst realisieren magst kann das erste Array relativ einfach in ein 2D Array gewandelt werden:


    [autoit]


    $rufnummer=_transform1Dto2D($rufnummer,";",3)

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

    func _transform1Dto2D($array,$delimiter,$colums)

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

    local $aReturn[ubound($array)][$colums]

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

    for $i=0 to ubound($array)-1
    $aRow=stringsplit($array[$i],$delimiter,2)
    for $j=0 to $colums-1
    if ubound($aRow)-1 < $j then exitloop
    $aReturn[$i][$j]=$aRow[$j]
    next
    next

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

    return $aReturn

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

    endfunc

    [/autoit]

    Den Index suchen kannst du dann indem du bei _arraysearch() mit dem 8. Parameter die richtige Suchspalte (subitem) angibst.

    EDIT:

    Dabei bin ich mal davon ausgegangen dass du nicht Zeilen sondern Spalten meintest, also eine CSV nach diesem Schema:

    Code
    pcnr;vorwahl;nummer
    pcnr2;vorwahl2;nummer2

    Meine Transform funktion ist im übrigen ungetestet und nur schnell im forum zusammengebastelt, ggf. sind Denkfehler enthalten.

    Ausgabe des Suchergebnisses:

    [autoit]


    $telefon= $rufnummer[$index][1] & $rufnummer[$index][2]

    [/autoit]

    4 Mal editiert, zuletzt von misterspeed (21. März 2012 um 20:51)

  • Ahja man könnte es im übrigen auch ohne arraysearch und mit einem 1D Array realisieren:


    [autoit]


    _FileReadToArray("pcliste.csv", $rufnummer)
    $pcnummer = InputBox("PC", "Welcher PC:")

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

    $index=_search($rufnummer,";",$pcnummer,0)
    if $index=-1 then exit msgbox(0,"","nix gefunden")

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

    $nummer = StringSplit($rufnummer[$index], ";", 2)
    $telefon = $nummer[1] & $nummer[2]

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

    MsgBox(4096, "Test", $telefon) ; eigendlich wird die Rufnummer ans Telefon übertragen.

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

    func _search($array,$delimiter,$suchbegriff,$column)

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

    for $i=1 to ubound($array)-1
    $aRow=stringsplit($array[$i],$delimiter,2)
    if ubound($aRow)-1 >= $column then
    if $aRow[$column]=$suchbegriff then return $i
    endif
    next

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

    return -1
    endfunc

    [/autoit]

    3 Mal editiert, zuletzt von misterspeed (21. März 2012 um 21:20)