Arbeiten mit Arrays

  • Hallo,

    ich habe die ersten Schritte mit AutoIT gemacht und komme jetzt so recht nicht weiter .......

    Daher möchte ich hier kurz mein Problem beschreiben (wahrscheinlich ist das für einen Profis ganz leicht zu lösen)


    Problemstellung:

    Ich erhalte mehrmals täglich eine Liste von Tel-Vorwahlen (als csv Datei).
    Die einzelnen Einträge dort muss ich jetzt gegen eine andere Datei (auch csv) 'laufen' lassen und dort die entsprechenden Treffer auslesen und in eine neu Datei schreiben.
    Meine Idee ist jetzt die Liste mit Tel-Vorwahlen in ein Array zu lesen (das klappt auch schon), das File mit den Zusatzinfos ebenfalls (geht das w/der mehrerern 'Spalten') und dann in einer Schleife die Werte vom 1. Array einzeln gegen das 2. Array zu prüfen (analog zu einem SVerweis unter Excel)

    Und genau da komme ich nicht so recht weiter.

    Bsp.

    Text mit Vorwahlnummern
    089
    069
    0711
    030

    Text File mit Gesamtinfos
    089 - München - AAA +++
    0911 - Nürnberg BBB +
    069 - Frankfurt AAA ++
    0711 - Stutgart BBB 000
    030 - Berlin AA ---
    040 - Hamburg AAA +++

    Ergebnisdatei
    089 München AAA +++
    069 Frankfurt AAA ++
    0711 Stutgart BBB 000
    030 Berlin AA ---


    any ideas, helps .....

    Danke auf jedenfall schon einmal
    .....

  • Hi,

    für sowas gibt es mehrere Möglichkeiten.

    Du könntest z.b. ein drittes Array anlegen;
    In einer Schleife die Einträge des 1. Arrays mit den Einträgen des 2. Arrays vergleichen
    und alle übereinstimmungen in das 3. Array schreiben. Am Ende einfach das 3. Array ausgeben.

    Gruß

    Prajoss

    PS: Wenn du deinen Code posten würdest, könnte man viel genauer helfen

    "Never touch a running System!"

    • Offizieller Beitrag

    Das geht recht einfach:

    Spoiler anzeigen
    [autoit]

    Local $sVW = _ ; die Datei gleich mit _FileReadToArray einlesen
    '089' & @CRLF & _
    '069' & @CRLF & _
    '0711' & @CRLF & _
    '030' & @CRLF

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

    Local $sFull = _ ; ebenfalls mit _FileReadToArray einlesen
    '089 - München - AAA +++' & @CRLF & _
    '0911 - Nürnberg BBB +' & @CRLF & _
    '069 - Frankfurt AAA ++' & @CRLF & _
    '0711 - Stutgart BBB 000' & @CRLF & _
    '030 - Berlin AA ---' & @CRLF & _
    '040 - Hamburg AAA +++' & @CRLF

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

    Local $aVW = StringSplit($sVW, @CRLF, 1) ; Inhalt jetzt identisch, wie beim Einlesen mit _FileReadToArray
    Local $aFull = StringSplit($sFull, @CRLF, 1) ; Inhalt jetzt identisch, wie beim Einlesen mit _FileReadToArray
    Local $sOut = ''

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

    For $i = 1 To $aFull[0]
    For $j = 1 To $aVW[0]
    If StringLeft($aFull[$i], StringLen($aVW[$j]) +3) == $aVW[$j] & ' - ' Then $sOut &= StringRegExpReplace($aFull[$i], '(' & $aVW[$j] & '\s)(-\s)(.+)', '$1$3') & @CRLF
    Next
    Next
    ConsoleWrite($sOut & @CRLF)

    [/autoit]
  • Hallo Prajoss,

    hier der erste Ansatz


    #include <Array.au3>
    #include <file.au3>


    Dim $aVWRecords, $aGRecords, $aiResult


    FileInstall(".\VW_Nr.txt", ".\VW_Nr.txt")
    _FileReadToArray("VW_Nr.txt", $aVWRecords)
    _ArrayDisplay($aVWRecords, "Vorwahlen")

    FileInstall(".\GesamtInfos.txt", ".\GesamtInfos.txt")
    _FileReadToArray("GesamtInfos.txt", $aGRecords)
    _ArrayDisplay($aGRecords, "GesamtInfo")


    Damit funzt es nicht
    $aiResult = _ArrayFindAll($aGRecords, $aVWRecords)
    _ArrayDisplay($aiResult, "Ergebnis der Suche")


    Die beiden Arrays werden gefüllt.
    Wie suche ich jetzt mit dem 1. Wert aus VW_nr.txt in GesamtInfos.txt ?

    das in die Schleife zu bringen,um den 2. Wert aus VW_nr.txt wäre dann der nächste Schritt


    Gruss
    Sporty

  • Schau dir mal die Hilfe zu "Fileinstall()" an, der erste Parameter muss ein absoluter Pfad sein!

    Probier es mal so:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <file.au3>

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

    Dim $aVWRecords, $aGRecords, $aiResult
    ;~ Dim $aVWRecords[1000], $aGRecords[1000], $aiResult[1000]

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

    Global $r = 0

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

    _FileReadToArray("VW_Nr.txt", $aVWRecords)
    _ArrayDisplay($aVWRecords, "Vorwahlen")

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

    _FileReadToArray("GesamtInfos.txt", $aGRecords)
    _ArrayDisplay($aGRecords, "GesamtInfo")

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

    For $i = 1 To $aVWRecords[0] - 1

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

    Local $index

    $index = _ArraySearch($aGRecords, $aVWRecords[$i])

    If $index <> 0 Then

    $aiResult[$r] = $aGRecords[$i]
    $r = $r + 1

    EndIf

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

    Next

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

    _ArrayDisplay($aiResult, "Ergebnis der Suche")

    [/autoit]

    Evtl. muss du bei der Array-Deklaration die 2. Zeile nehmen anstatt der 1.

    "Never touch a running System!"

  • Hi,

    das mit dem FileInstall() funktioniert - null problemo

    Leider gibt Dein Beispiel kein Ergebnis


    Schaun mer mal

  • Hallo Bugfix,

    entweder ich habe es noch nicht verstanden aber so funzt es nicht - Kannst Du mir sagen was ich falsch mache ?

    Spoiler anzeigen

    #include <Array.au3>
    #include <file.au3>


    Dim $aVWRecords, $aGRecords, $aiResult, $Out


    FileInstall(".\VW_Nr.txt", ".\VW_Nr.txt")
    _FileReadToArray("VW_Nr.txt", $aVWRecords)
    _ArrayDisplay($aVWRecords, "Vorwahlen")

    FileInstall(".\GesamtInfos.txt", ".\GesamtInfos.txt")
    _FileReadToArray("GesamtInfos.txt", $aGRecords)
    _ArrayDisplay($aGRecords, "GesamtInfo")


    ;~ Local $aVWRecords = _ ; die Datei gleich mit _FileReadToArray einlesen
    ;~ '089' & @CRLF & _
    ;~ '069' & @CRLF & _
    ;~ '0711' & @CRLF & _
    ;~ '030' & @CRLF

    ;~ Local $aGRecords = _ ; ebenfalls mit _FileReadToArray einlesen
    ;~ '089 - München - AAA +++' & @CRLF & _
    ;~ '0911 - Nürnberg BBB +' & @CRLF & _
    ;~ '069 - Frankfurt AAA ++' & @CRLF & _
    ;~ '0711 - Stutgart BBB 000' & @CRLF & _
    ;~ '030 - Berlin AA ---' & @CRLF & _
    ;~ '040 - Hamburg AAA +++' & @CRLF

    ;~ $aVWRecords = StringSplit($aVWRecords, @CRLF, 1) ; Inhalt jetzt identisch, wie beim Einlesen mit _FileReadToArray
    ;~ $aGRecords = StringSplit($aGRecords, @CRLF, 1) ; Inhalt jetzt identisch, wie beim Einlesen mit _FileReadToArray
    $sOut = ''

    For $i = 1 To $aGRecords[0]
    For $j = 1 To $aVWRecords[0]
    If StringLeft($aGRecords[$i], StringLen($aVWRecords[$j]) +3) == $aVWRecords[$j] & ' - ' Then $sOut &= StringRegExpReplace($aGRecords[$i], '(' & $aVWRecords[$j] & '\s)(-\s)(.+)', '$1$3') & @CRLF
    Next
    Next
    ConsoleWrite($sOut & @CRLF)

  • Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <file.au3>

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

    Dim $aVWRecords[1000], $aGRecords[1000], $aiResult[1000]

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

    Global $r = 0

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

    _FileReadToArray("VW.txt", $aVWRecords)
    _ArrayDisplay($aVWRecords, "Vorwahlen")

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

    _FileReadToArray("GesamtInfos.txt", $aGRecords)
    _ArrayDisplay($aGRecords, "GesamtInfo")

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

    For $i = 1 To $aVWRecords[0] - 1

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

    Local $index

    $index = _ArraySearch($aGRecords, $aVWRecords[$i])

    If $index <> 0 Then

    $aiResult[$r] = $aGRecords[$i]
    $r = $r + 1

    EndIf

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

    Next

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

    _ArrayDisplay($aiResult, "Ergebnis der Suche")

    [/autoit]

    Hier noch meine verwendeten Textdokumente und ich kriege die richtigen Ergebnisse.

  • Hi Prajos,

    ja das funktioniert doch. Allerdings nur wenn in der VW.txt nach dem letzten Eintrag noch ein CRLF gesetzt ist, was letztlich im 1. Array ein leeres Element erzeugt.
    Wenn der CRLF nicht gesetzt ist, 'vergisst das Script das letzte Element (und wenn nur genau eine VW in der Datei ist, ist das Ergebnis 'LEER'R
    Problem kann aber werden, das die automatisierte Datei dies von Hause aus nicht mitbringt.
    Siehst Du eine Möglichkeit dies zu umgehen

    Gruss
    Sporty

  • Ich glaube das war mein Fehler,

    änder doch mal die Zeile

    [autoit]

    For $i = 1 To $aVWRecords[0] - 1

    [/autoit]

    auf

    [autoit]

    For $i = 1 To $aVWRecords[0]

    [/autoit]

    Gruß

    Prajoss

    "Never touch a running System!"

  • Hallo Bugfix,

    jetzt gehts ich hatte einen TYPO mit 'eingebaut'

    Vielen lieben Dank


    Gruss
    Sporty :rock: