Laden...

Komplexerer Vergleich zweier csv-Dateien

Erstellt von MrMerlin vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.652 Views
M
MrMerlin Themenstarter:in
3 Beiträge seit 2014
vor 8 Jahren
Komplexerer Vergleich zweier csv-Dateien

Hallo allerseits,

Ich stehe jetzt da vor einem Problem wie ein Ochse vorm Berg und kann mir keinen Lösungsreim basteln. Vielleicht kann mir von euch jemand einen Tip/Lösungsansatz geben. Bin noch relativ neu in der C#-Programmierung. Wäre toll, wenn ihr mir helfen könntet.

Folgende Aufgabenstellung:
Es existieren 2 csv-Dateien, wobei diese wie folgt aufgebaut sind:

Datei-1:
1.) Artikelnummer (besteht aus Zahlen und Buchstaben und hat eine variable Länge)
2.) Preis (und noch weitere Felder, die jedoch nicht relevant sind) ....

Datei-2:
1.) String (variable Größe), der die Artikelnummer (wie in Datei-1)+EAN-Code+Verfügbarkeit (letzte 3 Stellen) enthält.
2.) weitere nicht relevante Felder

Die Aufgabe ist es nun, die Artikelnummer und die Verfügbarkeit aus der Datei-2 zu separieren, mit der Artikelnummer der Datei-1 zu vergleichen und die Datei-1 um die Verfügbarkeit zu ergänzen und alles in eine neue Datei zusammen zu führen.

Irgendwie stehe ich auf meiner Leitung und weiß nicht, wie ich das ganze angehen soll.

Wäre um jede Anregung sehr dankbar.

lg

Steve

2.207 Beiträge seit 2011
vor 8 Jahren

Hallo MrMerlin,

du hast deine drei Aufgabenteile doch schon genannt 😉

Eine csv ist im Prinzip eine Textdatei in der mit einem bestimmten Zeichen getrennt Werte stehen.

Google-Suche nach c# read csv file strotz vor Ergebnissen.

Somit kannst du die Datei einlesen und mit dem richtigen Char splitten. Falls du Werte extrahieren willst kannst du dies mit Regex tun.

[Artikel] Regex-Tutorial

On-the-fly Regex-Tester: Regex-Lab

Dann ersetzt du deine Daten und speicherst wieder eine csv ab.

Wo hakt es denn? Was hast du bisher probiert?

Gruss

Coffeebean

T
2.219 Beiträge seit 2008
vor 8 Jahren

Klingt für mich nicht sonderlich komplex 😃
Aber wenn in der zweiten CSV die Artikelnummer im variablen String immer am Anfang steht, könntest du auch einfach mit StartsWith am Anfang des Strings nach der Artikelnummer aus der ersten CSV suchen.
Die Verfügbarkeit liest du dann mit Substring aus der gleichen Zeile der zweiten CSV eben mit den letzten 3 Stellen aus.

Klingt also nach einer 5 Min. Programmierung samt testen :p
Oder habe ich was übersehen?

Bsp. ungetestet und eben auf den Informationen von dir beruhend.


string[] csvLines1 = File.ReadAllLines("Datei1.csv");
List<string> csvLines2 = new List<string>(File.ReadAllLines("Datei2.csv"));

foreach(string csvLine1 in csvLines1)
{
    string[] csvLine1Parts = csvLine1.Split(';');
    string artikelNr = csvLine1Parts[0];

    string csvLine2 = csvLines2.Find(l => l.StartsWith(artikelNr));

    // In der zweiten Datei mit dem Variablen String gab es keinen Treffer!
    if(String.IsNullOrEmpty(csvLine2))
        continue;

    string verfuegbarkeit = csvLine2.Substring(csvLine2.Length - 4);

    // Hier kannst du deine Verfügbarkeit weiternutzen!
}

Nachtrag:
Der Code ist einfach runtergetippt.
Weder optimiert noch getestet :p
Also musst du schauen ob es so passt.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

M
MrMerlin Themenstarter:in
3 Beiträge seit 2014
vor 8 Jahren
Danke für die Tipps

Danke für die raschen Antworten. Mit diesen Lösungsansätzen komme ich weiter.
Leider kann ich nicht einfach die ersten Zeichen der Artikelnummer verwenden, da diese in ihrer Länge unterschiedlich ist. Außerdem Beginnt der Sting, der die Artikelnummer enthält in der Datei-2 nicht mit der eigentlichen Artikelnummer sondern mit unterschiedlichen Präfixes, die leider nicht durch ein Zeichen getrennt werden.

Aber ich glaube, dass ich so jetzt weiterkomme. Wie gesagt, ich stand offenslichtlich auf der Leitung beim Lösungsansatz.

Ich seit spitze. Danke nochmals.

lg
Steve

T
2.219 Beiträge seit 2008
vor 8 Jahren

Dann nimm bei der Suche nicht StartsWith sondern Contains.
Dann kannst du prüfen ob die Artikelnummer in der ersten Spalte der zweiten Datei steht.
Ich denke mal, dass es keine Artikelnummer gibt die durch die Kombinationen aus den Datei zufällig vorkommen kann.
Also das ein Teil einer Artikelnummer EAN eine andere Artikelnummer ergeben.
Kannst du aber sicher auch noch abfangen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

D
985 Beiträge seit 2014
vor 8 Jahren

Ich gehe so etwas immer strukturiert an:

Für jede CSV-Datei erstelle ich mir eine Klasse, die exakt die Struktur der Datei wiederspiegelt. Mit den FileHelpers bekomme ich dann die CSV-Datei als IEnumerable<T> und der Rest ist dann ein bisschen Linq etc.

Die Liste der neuen Daten mit den FileHelpers einfach wieder als CSV zurückschreiben.

Der Kontakt mit solchen Schnittstellen sollte sich immer auf ein Mindestmass reduzieren und auch nur an den Randbereichen der Anwendung abspielen.

T
2.219 Beiträge seit 2008
vor 8 Jahren

@Sir Rufo
Klingt zwar nett aber für solche Trivialen Daten eigene Strukturen zu schreiben ist aus meiner Sicht unnötiger Aufwand.
Da ist es billiger direkt die zwei Spalten auszulesen und dann durchzugehen.

Bei kompelxeren bzw. einfach dickeren Dateien mit mehr als 5 Spalten würde ich sowas machen.
Aber bei kleinen CSV Dateien ist das aus meiner Sicht etwas Overhead.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

D
985 Beiträge seit 2014
vor 8 Jahren

Triviales mit Billigem zu lösen geht aber auch gerne in die Hose.

Schaffe ich mir vernünftige und testbare Strukturen wird die Lösung robuster als irgendein Spaghetti-Code Gefrickel.

Und 3 Klassen sind nun nicht wirklich eine grosse Komplikation. Vor allem, wenn ich damit den Aufbau der CSV Dateien festlgelegt und damit auch gleich im Code dokumentiert habe, ist es eher der einfachere Weg - sehe ich wenigstens so.

T
2.219 Beiträge seit 2008
vor 8 Jahren

Wenn vorhersehbar ist, dass sich das Format der CSV mal ändern kann oder es vielleicht mal ausgeweitet wird, würde ich auch sagen das sich der Aufwand lohnen würde.
Aber wenn es eben nur eine zwei Spalten CSV ist, wäre eine weitere Library und eine zusätzliche Klasse eher Overhead.
Ist aber im Endeffekt für mich Situationsabhängig.

Nachtrag:
Um wieder zum Thema zu kommen, hier sollte soweit alles klar sein.
Da der TE auch soweit versorgt ist, können wir das eigentliche Thema abhacken. :p
Hoffe doch, dass die Ansätze von uns soweit auch zur finalen Lösung beigetragen haben.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.