Infos aus 2 txt-Dateien lesen, vergleichen, in 3. schreiben

  • Hi all,

    ich habe 2 Textdateien mit Informationen (aus Excel exportiert und als CSV bzw TXT gespeichert), die wie folgt aussehen:

    PTNR.txt:
    10001071;Diverse Informationen 1
    36961238;Diverse Informationen 2

    KDNR.txt:
    10000675,10046615,10001071,;Diverse andere Informationen 1
    10039063,10000675,10046615,;Diverse andere Informationen 2

    Jetzt möchte ich die 8-stellige Zahl am Anfang der ersten Datei mit den Zahlen aus der zweiten Datei vergleichen und wenn diese drin vorkommt, in eine dritte Datei mit allen "Diverse Informationen" aus der entsprechenden Zeile ("KDNR" und "PTNR") schreiben.
    Allerdings sollen für "PTNR" maximal 4 "KDNR"-Einträge eingetragen werden (die bereits genutzten Zeilen können gelöscht werden).

    Edit: Doppelte aus der "KDNR" löschen ist Blödsinn, sorry! :) (also bitte drin lassen!)

    Mein Lösungsansatz wäre bis jetzt folgender:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>

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

    $x = 1

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

    $partner = FileOpen("PTNR.txt",0)
    $kunde = FileOpen("KDNR.txt",0)
    $kdpt = FileOpen("KDPT.txt",1)

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

    $rp = FileReadLine($partner,1)

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

    $rnum = StringLeft($rp,8)

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

    $rk = FileReadLine($kunde,1)

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

    if StringInStr($rk,$rnum) Then
    FileWriteLine($kdpt,$rp & ";" & $rk)
    _FileWriteToLine("PTNR.txt",$i,"",1)
    $x += 1
    EndIf

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

    if $x >= 4 Then
    _FileWriteToLine("KDNR.txt",1,"",1)
    $x = 1
    EndIf

    [/autoit]

    Da fehlt leider noch einiges, der Testlauf mit einem Testdatensatz in Zeile 1 hat funktioniert, aber leider wars das dann auch schon :(

    Hoffe ihr könnt mir helfen :)

    Grüße
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

    3 Mal editiert, zuletzt von x0r (5. April 2012 um 14:04)

  • ich würde den inhalt der txt - dateien erstmal komplett mit

    [autoit]

    _FileReadToArray($sFilePath, ByRef $aArray)

    [/autoit]

    einlesen und dann den inhalt der ersten txt - datei mit einer for schleife durchgehen...ungefähr so...

    [autoit]

    $i_counter = 0
    For $i = 1 To UBound($a_inhalt_von_txt_partner) - 1
    For $m = 1 To UBound($a_inhalt_von_txt_kunden) - 1
    $string = String($a_inhalt_von_txt_kunden[$m])
    $s_kennnummer = StringTrimLeft($string, StringLen($string) - 8)
    If StringInStr($a_inhalt_von_txt_partner[$i], $s_kennnummer) Then
    FileWrite("KDPT.txt", $string) ; die datei muss vorher mit mode = 2 geöffnet werden, damit der inhalt gelöscht wird
    $i_counter += 1
    ElseIf $i_counter = 4 Then
    ExitLoop
    EndIf
    Next
    If $i_counter = 4 Then ExitLoop
    Next

    [/autoit]


    natürlich ist der lösungsvorschlag ungetestet und nicht perfekt, aber ich hoffe ich konnte dir helfen ;)

  • danke, das hab ich schon so gebastelt, dass es einigermaßen hin haut :)

    code bis jetzt:

    Spoiler anzeigen
    [autoit]

    #include <file.au3>

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

    dim $a_inhalt_von_txt_partner, $a_inhalt_von_txt_kunden

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

    _FileReadToArray("Input_Partner.txt",$a_inhalt_von_txt_partner)
    _FileReadToArray("Input_Kunden.txt",$a_inhalt_von_txt_kunden)

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

    $output = FileOpen("Output_KP.txt",2)

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

    $i_counter = 0

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

    For $i = 1 To UBound($a_inhalt_von_txt_partner) - 1

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

    $partner_string = StringLeft($a_inhalt_von_txt_partner[$i],8)

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

    dim $a_inhalt_von_txt_kunden = ""

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

    _FileReadToArray("Input_Kunden.txt",$a_inhalt_von_txt_kunden)

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

    For $m = 1 To UBound($a_inhalt_von_txt_kunden) - 1

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

    If StringInStr($a_inhalt_von_txt_kunden[$m], $partner_string) Then
    FileWriteLine($output, $a_inhalt_von_txt_partner[$i] & ";EOP;SOA;" & $a_inhalt_von_txt_kunden[$m])
    _FileWriteToLine("Input_Kunden.txt",$m,"cleared",1)
    $i_counter += 1
    ElseIf $i_counter = 4 Then
    $i_counter = 0
    ExitLoop
    EndIf

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

    Next

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

    ;~ If $i_counter = 4 Then ExitLoop

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

    Next

    [/autoit]


    allerdings fügt er mir nun mehr als 4 partner mit entsprechenden kunden ein (kunden sind einzigartig, also das stimmt schonmal)
    und das andere problem ist, ich müsste zuerst die kunden mit weniger nummern dran nehmen, denn die werden sonst gar nicht mehr gezählt und fallen weg (reinfolgen-problem).

    soweit läuft aber schonmal was dank dir :)

    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • allerdings fügt er mir nun mehr als 4 partner mit entsprechenden kunden ein


    wie viele mehr sinds denn?? ;)

    und das andere problem ist, ich müsste zuerst die kunden mit weniger nummern dran nehmen, denn die werden sonst gar nicht mehr gezählt und fallen weg


    meinst du damit kunden die eine geringere anzahl an kundenziffern haben oder deren kundennummer vom wert her einfach nur kleiner ist?? :) wenn du meinst das sie einfach nur kleiner sind kannst du ja am anfang erst mal die 4 kleinsten nummer raus suchen ;) das geht mit

    [autoit]

    _ArrayMin(Const ByRef $avArray [, $iCompNumeric = 0 [, $iStart = 0 [, $iEnd = 0]]])

    [/autoit]

    ich habe bei deinem scribt mal ein paar sachen hinzu gefühgt und ein paar kommentare geschrieben da ich nicht ganz genau weiß was du damit bezwecken willst ....

    [autoit]

    #include <file.au3>

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

    dim $a_inhalt_von_txt_partner, $a_inhalt_von_txt_kunden

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

    _FileReadToArray("Input_Partner.txt",$a_inhalt_von_txt_partner)
    _FileReadToArray("Input_Kunden.txt",$a_inhalt_von_txt_kunden)

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

    $h_output = FileOpen("Output_KP.txt",2)

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

    $i_counter = 1
    For $i = 0 To UBound($a_inhalt_von_txt_partner) - 1
    For $m = 0 To UBound($a_inhalt_von_txt_kunden) - 1
    $string = String($a_inhalt_von_txt_kunden[$m])
    $s_kennnummer = StringLeft($string, StringInStr($string, ";")) ;stringinstr ist sicherer da, sobald ausversehen ein leerzeichen auftaucht eine fehlermeldung kommen wird ;)
    If StringInStr($a_inhalt_von_txt_partner[$i], $s_kennnummer) Then
    FileWriteLine($h_output, $a_inhalt_von_txt_partner[$i] & ";EOP;SOA;" & $a_inhalt_von_txt_kunden[$m])
    _FileWriteToLine("Input_Kunden.txt", $i_counter, $string, 1)
    ; du schreibst hier aber in eine input txt datei!!! wolltest du nicht in eine output datei schreiben???
    $i_counter += 1
    ElseIf $i_counter = 5 Then
    ExitLoop
    EndIf
    Next
    If $i_counter = 5 Then ExitLoop
    Next

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

    FileClose($h_output)

    [/autoit]
  • Edit: habs suboptimal gelöst, und zwar hab ich einfach pro partner je 1 kunden auslesen lassen und das ganze mit verschieden aufgereihten partnerlisten bewerkstelligt. reicht aber für meine zwecke, denke ich!

    Dickes Danke an Redhead! :thumbup:

    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

    2 Mal editiert, zuletzt von x0r (5. April 2012 um 14:06)

  • freut mich das ich dir helfen konnte ;)

    wollte eigentlich gerade eine möglichkeit posten dir mir eben eingefallen ist

    [autoit]

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

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

    dim $a_inhalt_von_txt_partner, $a_inhalt_von_txt_kunden
    $a_kunden_position_in_txt[1] = [""] ; ein leerer array wird erzeugt
    _FileReadToArray("Input_Partner.txt",$a_inhalt_von_txt_partner)
    _FileReadToArray("Input_Kunden.txt",$a_inhalt_von_txt_kunden)

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

    $h_output = FileOpen("Output_KP.txt",2)

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

    For $i = 0 To UBound($a_inhalt_von_txt_partner) - 1
    $i_counter = 0
    For $m = 0 To UBound($a_inhalt_von_txt_kunden) - 1
    $string = String($a_inhalt_von_txt_kunden[$m])
    $s_kennnummer = StringLeft($string, StringInStr($string, ";"))
    If StringInStr($a_inhalt_von_txt_partner[$i], $s_kennnummer) Then
    FileWriteLine($h_output, $a_inhalt_von_txt_partner[$i] & ";EOP;SOA;" & $a_inhalt_von_txt_kunden[$m])
    _FileWriteToLine("Input_Kunden.txt", $i_counter, $string, 1)
    _ArrayAdd($a_kunden_position_in_txt, $m); $m = position des kunden im array
    ; die position des kunden in der txt datei wir in einem array gespeichert damit der kunde später aus $a_inhalt_von_txt_kunden gelöscht werden können ;)
    $i_counter += 1
    ElseIf $i_counter >= 4 Then
    ExitLoop
    EndIf
    Next
    For $k = 1 To UBound($a_kunden_position_in_txt, 1) - 1
    _ArrayDelete($a_inhalt_von_txt_kunden, $a_kunden_position_in_txt[$k])
    Next

    Next

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

    FileClose($h_output)

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

    weiß natürlich nicht ob die überhaupt funktioniert ;)