Veröffentlicht 2. März 201213 j Hi, folgendes Problem: es müssen zwei grosse Exceldateien durchlaufen werden. Es soll geprüft werden, ob Spalte A von Exceldatei 1 in Spalte B, C oder D von Exceldatei 2 enthalten ist. Das Ganze ist mittels foreach- Schleifen durch zwei DataTables und der Regex- Funktion sehr zeitintensiv und schreit nach Optimierung! Leider bin ich mit Dictionary nicht wirklich weitergekommen, da Spalte A d. Exceldatei 1 nicht eindeutig ist. Bin für jeden Tipp dankbar! Besten Dank und Gruss! sessai
2. März 201213 j Einmalig oder regelmäßig? Weil, wenn einmalig, dann dürfte Zeit nicht das Problem sein. Wenn regelmäßig, schreit es nach einer Datenbanklösung. Ist Access vorhanden?
2. März 201213 j Hi, folgendes Problem: es müssen zwei grosse Exceldateien durchlaufen werden. Es soll geprüft werden, ob Spalte A von Exceldatei 1 in Spalte B, C oder D von Exceldatei 2 enthalten ist. Das Ganze ist mittels foreach- Schleifen durch zwei DataTables und der Regex- Funktion sehr zeitintensiv und schreit nach Optimierung! Leider bin ich mit Dictionary nicht wirklich weitergekommen, da Spalte A d. Exceldatei 1 nicht eindeutig ist. Bin für jeden Tipp dankbar! Besten Dank und Gruss! sessai Statt einem Dictionary könnte man eine Collection vom Typ KeyValuePair nutzen. Ein Ansatz wäre hier vielleicht LINQ (to Objects bzw to DataSet / DataTable) --> Join ListeA mit ListeB Dabei würde alle Datensätze herausfallen, bei denen die (INNER) JOIN-Klausel nicht zutrifft.
2. März 201213 j Hi, folgendes Problem: es müssen zwei grosse Exceldateien durchlaufen werden. Es soll geprüft werden, ob Spalte A von Exceldatei 1 in Spalte B, C oder D von Exceldatei 2 enthalten ist. Das Ganze ist mittels foreach- Schleifen durch zwei DataTables und der Regex- Funktion sehr zeitintensiv und schreit nach Optimierung! Leider bin ich mit Dictionary nicht wirklich weitergekommen, da Spalte A d. Exceldatei 1 nicht eindeutig ist. Bin für jeden Tipp dankbar! Besten Dank und Gruss! sessai Warum nicht per Hashtable / Dictionary ? Als Key den inhalt der Spalte A Zellen, als Value ob es on B,C,D von File 2 enthalten ist. Wenn Spalte A doppelte Einträge hat, dann musst du das ja nicht mehr doppelt prüfen. Ich würd das in das Dictionary schreiben, und halt per Contains prüfen ob es den Wert schon im Dictionary gibt, damit ich nicht in die Exception renn. Ansonsten würd ich eventuell die Daten erstmal sortieren, und z.b. mit Binärer Suche arbeiten, anstatt auf gut Glück durch File 2 zu loopen. Es gibt ja den ein oder anderen Suchalgorhytmus der etwas effektiver ist als bootforce. Gruß Sven
2. März 201213 j Weil es zu langsam sind. Mit LINQ wird nicht nur vertikal, sondern auch horizontal gesucht. Das bietet dir hier einigen Performance Gewinn.
2. März 201213 j Könntest Du evtl. ein Beispiel nennen, wie genau das "Suchen" verlaufen soll? Im Grunde geht es darum: Tabelle 1 Spalte A 123456789 Tabelle 2 Spalte B 543217893 Tabelle 2 Spalte C 123456789 Tabelle 2 Spalte D 523453453 Und die Antwort wäre in dem Fall: (D) Meinst Du das so?
4. März 201213 j Antwort C wäre doch jetzt mein Treffer!? Bei einem Treffer müsste ich den entsprechenden Datensatz inkl. weiteren Spalten zwischenspeichern bzw. später ausweisen. Geht das alles mit einem Dictionary? Das Ganze muss wöchentlich laufen. Eine Oracle- DB steht zur Verfügung.
4. März 201213 j Huch, äh, natürlich C Die Frage ist: was willst Du mit einem Dictionary erreichen? Letztlich geht es um einen effizienten Suchalgortihmus, der nach Übereinstimmungen sucht. Da in Deinem Fall die komplette Spalte übereinstimmen muss, ist der Algorithmus recht simpel: 1) Prüfe, ob Zeile 1 der Spalte mit der Referenzzeile übereinstimmt. 2) Wenn "Nein", Spalte verwerfen und (wenn vorhanden) mit nächster Spalte weitermachen => (1). 3) Wenn "Ja", dann solange mit dem Spaltenvergleich fortfahren, bis alle relevanten Werte als übereinstimmend erkannt worden sind - bzw. beim ersten Unterschied, Spalte wieder verwerfen und bei (2) wieder einsteigen Fertig. Alternativ: Wenn die Spalten unterschiedliche Länge haben, könntest Du zuerst die Länge abgleichen, dann die erste Zeile überprüfen und dann den Inhalt. Durch die entsprechenden Überprüfungen sparst Du schon ein wenig an Laufzeit, bzw. mit einem break kannst Du den Loop jederzeit verlassen. Das wäre jetzt meine Vorgehensweise aus der Hüfte geschossen.
5. März 201213 j Ich tu mich da ein bisschen schwer das Ganze umzusetzen ... meine Exceldateien sind folgendermassen aufgebaut: Excel 1: Spalte LASTNAME, FIRSTNAME, MIDDLENAME Excel 2: Spalte NAME, VORNAME, GEBURTSNAME zu Excel 2: hier können Werte mehrfach vorkommen, die Spalte KTO wäre mein eindeutiger Schlüssel, meine Idee war dass ich für den Key ein CONCAT von KTO und den restlichen Spalten mache?! Der Check: es soll geprüft werden ob Excel1.LASTNAME, VORNAME und MIDDLENAME in einer der Spalten von Excel 2 vorhanden ist. Und hier frag ich mich ob das mit einer Hashtable so alles möglich ist?! Ich bin dankbar für jeden Tipp!
5. März 201213 j tja, und genau da fängt's schon an: dann hab ich zwei DataTables und kann diese mittels LINQ auswerten bzw. mein Ergebnis in eine neue DataTable schreiben? ich hab noch nie mit LINQ gearbeitet, wenn auch schon davon gelesen bzw. gehört. wie fang ich da am besten an?
5. März 201213 j Windows 101 LINQ Samples Ich bin ja mal gespannt, wie das sich hier entwickelt. Ich hab keinen blassen Schimmer, wieso hier jemand ein Dictionary einsetzen will, bzw. meint, mit LINQ an sein Ziel zu kommen. Vielleicht steh ich auch nur auf dem Schlauch ...
6. März 201213 j Vielleicht kommst du mit dem Open XML SDK 2.0 for Microsoft Office weiter. Du kannst dir mal Using LINQ to Query Tables in Excel 2007 anschauen. Einfach mal ausprobieren.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.