Moin,
divanebabas Tipp hinsichtlich des Schreibens auf Platte könnte/sollte schon etwas bringen. Die von
haichen genannte Bibliothek mag auch hilfreich sein, ich schrecke aber immer davor zurück, relativ einfach selbst zu erledigende Probleme mit dem Knüppel einer 'eierlegenden Wollmilchsau' zu erschlagen, deren Code man im Zweifel vielleicht nicht nachvollziehen kann.
In diesem Fall gehe ich davon aus, dass jede
ProduktID in Stocks.csv nur einmal vorkommt, und dass es auch in der Produkte.csv in jedem Satz ein Feld mit der ProduktID gibt. Das schreit geradezu danach, als Erstes aus der Stocks.csv ein assoziatives Array mit der ProduktID zu machen:
Code: Select all
BestandsArray := {}
Loop, Parse, Bestaende, `n, `r
{
If (A_LoopField = "")
Continue
Felder := StrSplit(A_LoopField, ";")
BestandsArray[Felder[1]] := {EAN: Felder[2], Count: Felder[3], Found: 0}
}
Der Schlüssel
Found dient nur dazu, die im Bestand aber nicht in der Produktdatei vorhandenen ProduktIDs ausgeben zu können. Wenn Du das nicht brauchst, kann er weg.
Wir haben jetzt
eine Schleife über 6500 Zeilen durchlaufen.
Jetzt folgt die Verarbeitung der Produktdatei mit
einer Schleife über 40.000 Zeilen:
Code: Select all
Ausgabe := ""
Loop, Parse, Produkte, `n, `r
{
If (A_LoopField = "")
Continue
Felder := StrSplit(A_LoopField, ";")
; IndexderProduktID bitte durch zutreffenden Wert ersetzen
If (Bestand := BestandsArray[Felder[IndexderProduktID])
{
Ausgabe .= Felder[IndexderProduktID] . ";" . Bestand.EAN . ";" . Felder[6] . ";" . Felder[4] . ";"
. Bestand.Count . ";" . Felder[3] . "`n"
Bestand.Found := True
}
Else
Ausgabe .= Felder[IndexderProduktID] . ";" . Felder[6] . ";" . Felder[4] . ";" Felder[3]
. ";;Nicht im Bestand!`n"
}
Wenn jetzt noch die ProduktIDs aus dem Bestand, die nicht in der Produktliste vorhanden sind, ausgegeben werden sollen, folgt noch
eine Schleife über 6500 Zeilen:
Code: Select all
For ProduktID, Produkt In BestandsArray
If !Produkt.Found
Ausgabe .= ProduktID . ";" . Produkt.EAN . ";" . Produkt.Count . ";;;Nicht in der Produktliste!`n"
Die Ausgabe ist jetzt fertig und kann in eine Datei geschrieben werden. Insgesamt sollte das keine 8 Minuten dauern.
Bitte beachten: Der obenstehende Code ist nur beispielhaft und praktisch nicht getestet! Ich hoffe, es hilft Dir trotzdem weiter.
@haichen:
Code: Select all
loop, % obj0.MaxIndex(){
BIndex:= obj0[a_index]["ID"]
PIndex:= obj1[a_index]["ID"]
...
}
Ich habe mir
ObjCSV_CSV2Collection() nicht angeschaut, aber: Der Code ist zwar schnell, ich glaube aber nicht, dass die Schleife vollständig ist, wenn die Arrays unterschiedlich viele Elemente enthalten.