Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
Unsere Seminarverwaltung lebt unter anderen davon, dass Bestellungen über ein Shopsystem eingehen. Hier nutzen wir elopage, einen Anbieter, mit dem man verschiedene digitale Dienstleistungen online verkaufen kann. elopage übernimmt dabei einige Aufgaben wie etwa die Bereitstellung von Produkt- und Bestellseiten. Nachdem eine Bestellung erfolgt ist, landen die Daten des Kunden inklusive der Daten zum bestellten Artikel in der Datenbank von elopage. Die Bestelldaten können wir per CSV-Datei exportieren und in unsere Seminarverwaltung einlesen. Dazu verwenden wir das NuGet-Paket CsvHelper, das wir in zwei weiteren Artikeln bereits vorgestellt haben. Der vorliegende Artikel zeigt, wie wir die beschriebenen Techniken für den Import in einem konkreten Anwendungsfall nutzen können.
Schritt für Schritt
Wir wollen den Import der CSV-Datei in die einzelnen Tabellen der Anwendung in mehreren Schritten vollziehen:
- Als Erstes wollen wir die Daten aus der CSV-Datei in einer einzigen Klasse verfügbar machen, damit wir komfortabler auf die enthaltenen Daten zugreifen können. Dazu erstellen wir eine Klasse, die für jede Spalte der CSV-Datei ein Feld enthält. Das wird hier und da etwas aufwendiger, wie wir glelich sehen werden.
- Die einzelnen Objekte mit den Daten aus jeweils einer Zeile fügen wir zu einer Auflistung hinzu.
- Danach durchlaufen wir die Auflistung mit allen Datensätzen und lesen daraus die Informationen aus, die wir den einzelnen Entitäten unseres Entity Data Models zuweisen wollen. Diese legen wir dann an und speichern die enthaltenen Daten in der zugrunde liegenden Datenbank.
Herausfordernde CSV-Datei
Die von elopage exportierte Datei liefert uns einige Herausforderungen. Sie sieht wie in Bild 1 aus.
Bild 1: Der CSV-Export des Shopsystems
Die Herausforderung ist, dass wir die Felder möglichst so wie in der Kopfzeile dargestellt in Objekten einer neuen Klasse namens ImportBestellung abbilden wollen – um möglichst ein 1:1-Mapping zu realisieren:
TOKEN;PRODUKT;ERSTELLT;ZAHLUNGSSTATUS;METHODE;PLAN;TESTZEITRAUM;ANZAHL ZAHLUNGEN;BEZAHLT;PRODUCT ID;FUER PS;FAELLIGER BETRAG;WAEHRUNG;UNTERNEHMEN;PLAN;ZAHLUNGSPLAN;ZAHLUNGSPLAN ID;GUTSCHEINCODE;CAMPAIGN-ID;MIT TESTZEITRAUM;FIXER FAELLIGKEITSTAG;PRODUKTNAME;EVENT;ORT;EVENT-DATUM;TICKETANZAHL;TICKET CODE;VORNAME;NACHNAME;E-MAIL;TELEFON;LAND;STADT;STRASSE;HAUSNUMMER;PLZ;UNTERNEHMEN;UST-IDNR.;EMPFAENGER NAME;EMPFAENGER E-MAIL-ADRESSE;EMPFAENGER TELEFON;EMPFAENGER LAND;EMPFAENGER STADT;EMPFAENGER STRASSE;EMPFAENGER HAUSNUMMER;EMPFAENGER PLZ;EMPFAENGER FIRMA;NUTZER;PUBLISHER ID;AELTESTE BEZAHLTE RATE;FAELLIGKEITSDATUM;BESTELL-ID;"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";""
Sie sehen hier aber direkt einige Elemente mit Namen, die so nicht als Eigenschaften einer .NET-Klasse verwendet werden können. Einige der Spaltenüberschriften enthalten Leerzeichen (zum Beispiel PRODUCT ID oder FAELLIGER BETRAG), andere entsprechen reservierten Begriffen (EVENT), wieder andere kommen doppelt vor (UNTERNEHMEN). Zum Glück bietet das CsvHelper-Paket Möglichkeiten, solche Felder über entsprechende Data Annotations zuzuordnen.
Wir haben im Folgenden die Klasse ImportBestellung ausschnittsweise abgebildet und vor allem die Spezialfälle aufgeführt. Die Klasse verwendet einige zusätzliche Namespaces:
Imports CsvHelper Imports CsvHelper.Configuration Imports CsvHelper.Configuration.Attributes
Die Klasse selbst sieht wie folgt aus:
Public Class ImportBestellung Public Property TOKEN As String ... <Name("PLAN")> <NameIndex(0)> Public Property PLAN1 As String ''Kommt zwei Mal vor Public Property TESTZEITRAUM As String <Name("ANZAHL ZAHLUNGEN")> Public Property ANZAHLZAHLUNGEN As String ''Enthält Leerzeichen <Name("PRODUCT ID")> Public Property PRODUCT_ID As String ''Enthält Leerzeichen <Name("FUER PS")> ... <Name("UNTERNEHMEN")> <NameIndex(0)> Public Property UNTERNEHMEN As String ''Kommt zwei Mal vor. <Name("PLAN")> <NameIndex(1)> Public Property PLAN2 As String Public Property ZAHLUNGSPLAN As String <Name("EVENT")> Public Property Event1 As String ''Event ist ein reserviertes Schlüsselwort <Name("EVENT-DATUM")> Public Property Event_DATUM As String ''Enthält Leerzeichen <Name("UNTERNEHMEN")> <NameIndex(1)> Public Property UNTERNEHMEN_1 As String ''Zweites Vorkommen <Name("UST-IDNR.")> ... End Class
Die vollständige Klasse finden Sie im Beispielprojekt zu diesem Artikel.
Importieren der CSV-Datei