Laden...

2 CSV vergleichen, ohne dass enthaltene Musterdatensätze stören

Erstellt von Hobelschlunze vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.551 Views
Hobelschlunze Themenstarter:in
16 Beiträge seit 2014
vor 9 Jahren
2 CSV vergleichen, ohne dass enthaltene Musterdatensätze stören

Hallo,

ich muss 2 csv Dateien vergleichen und die gleichen Zeilen in eine Datei speichern und die Zeilen die nur in der ersten Datei waren und die Zeilen die nur in der zweiten Datei waren auch extra abspeichern.

Die 2 Dateien werden nur anhand einer Nummer verglichen die in jeder Datei an einer anderen Stelle vorkommen können.

ich hatte es mit

 Dictionary<string,string> 

gelöst.

nun habe ich aber festgestellt das es Musterdatensätze in der csv gibt, die immer die gleiche Nummer besitzen und dann funktioniert an dieser stelle das Dictionary nicht mehr da die nummer z.b. 99999 schon vorhanden ist.

Ich weiß nicht ob die Mustersätze immer die nummer 99999 besitzen.

hat jms eine Idee wie ich das Problem lösen kann?

So sehen die 2 Dateien ungefähr aus:

Datei1:
ID;Vorname;Nachname
1;Max;Mustermann
2;Maria;Musterfrau
3,NurIn;Datei1
99999;Muster;Datensatz
99999;Muster;Datensatz

Datei2:
PLZ;Wohnort;ID
12345;Zuhause;1
12345;Zuhause;2
85548;NurInDatei2,50
45678;Muster;99999
45678;Muster;99999

Mein alter code mit den Dictionarys:


            foreach (var Zeile in datei1Dictionary)
            {
                if (datei2Dictionary.ContainsKey(Zeile.Key))// Werte die in beiden Dateien vorhanden sind.
                {
                    string Treffer1 = Zeile.Value; // Ermittelt aus der aktuellen Zeile (=1ne Zeile aus Dictonary) den Wert.
                    string Treffer2 = datei2Dictionary[Zeile.Key];// Ermittelt aus dem Dictionary den Wert über den Key
                    string neueZeile = Treffer1 + ";" + Treffer2;

                    strWriter.WriteLine(neueZeile);// in beiden gleich

                }
                else
                {
                    strWriter2.WriteLine(Zeile.Value);
                    // nur in Datei1
                }

            }
            foreach (var Zeile in datei2Dictionary) // Prüfung welche Zeile aus Datei2 nicht in Datei 1 vorhanden ist
            {
                if (!datei1Dictionary.ContainsKey(Zeile.Key))
                {
                    strWriter3.WriteLine(Zeile.Value);// nur in Datei2
                }
            }

Azubi im 2ten Lehrjahr (Fachinformatiker Anwendungsentwicklung)

Codieren Sie immer so, als wäre der Typ, der den Code pflegen muss, ein gewaltbereiter Psychopath, der weiß, wo Sie wohnen.

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo Hobelschlunze,

im Grunde ist es doch ganz einfach. Du musst die Musterdatensätze erkennen und überspringen, bevor du die ID des aktuellen Satzes dem Dictionary hinzufügst.

Woran du die Mustersätze erkennen kannst, musst du wissen oder erfragen. Möglicherweise erkennt man sie an der Id 99999, was ich für wahrscheinlich halte oder man erkennt sie an anderen Kriterien, bei denen ich oder wir aber nur raten können. Deshalb musst du eben selbst schauen, ob du das oder die Kriterien erkennst oder du musst jemanden fragen, der sie kennt.

herbivore

B
357 Beiträge seit 2010
vor 9 Jahren

Dann überspring doch das erneute hinzufügen zum Dictionary, wenn die Nummer schon vorhanden ist. Try-Catch könnte da schon helfen. Da kannst du die ArgumentException von Dictionary.Add abfangen und den Datensatz dann halt entsprechend nicht hinzufügen.

Besser ist es aber, die Mustersätze wohl schon vorher auszumachen und gar nicht erst hinzuzufügen. Dass diese kein einheitliches Erkennungsmuster haben, halte ich für unwahrscheinlich oder wenigstens aber unglücklich.

S
145 Beiträge seit 2013
vor 9 Jahren

Dann überspring doch das erneute hinzufügen zum Dictionary, wenn die Nummer schon vorhanden ist. Try-Catch könnte da schon helfen. Da kannst du die ArgumentException von Dictionary.Add abfangen und den Datensatz dann halt entsprechend nicht hinzufügen.

Dictionary bietet dafür extra schon ContainsKey oder TryGetValue Methoden an.

Hobelschlunze Themenstarter:in
16 Beiträge seit 2014
vor 9 Jahren

vielen dank für die schnellen Antworten.

ich werde dann mal ein bisschen rumprobieren 😃

Azubi im 2ten Lehrjahr (Fachinformatiker Anwendungsentwicklung)

Codieren Sie immer so, als wäre der Typ, der den Code pflegen muss, ein gewaltbereiter Psychopath, der weiß, wo Sie wohnen.