Beispiel: Ersetzen von leeren CSV-Feldern

www.altova.com Dieses Kapitel drucken Vorherige Seite Eine Ebene nach oben Nächste Seite

Startseite >  Funktionen > Standardwerte und Node-Funktionen >

Beispiel: Ersetzen von leeren CSV-Feldern

In diesem Beispiel wird gezeigt, wie Sie ein MapForce Mapping erstellen, in dem Daten aus einer CSV-Datei ausgelesen und in eine andere CSV-Datei geschrieben werden. Ziel ist es, alle leeren Felder aus der CSV-Quelldatei durch einen benutzerdefinierten Wert ("n/a") zu ersetzen. Angenommen, die CSV-Quelldatei sieht folgendermaßen aus:

 

H,111,332.1,22537.7,,Container ship,,,

D,111,A-1579-227,10,3,400,Microtome,,

D,111,B-152-427,7,6,1200,Miscellaneous,,

H,222,978.4,7563.1,,Air freight,,,

D,222,ZZ-AW56-1,10,5,10000,Gas Chromatograph,,

 

Dann soll die gewünschte Mapping-Ausgabe folgendermaßen aussehen:

 

H,111,332.1,22537.7,n/a,Container ship,n/a,n/a,n/a

D,111,A-1579-227,10,3,400,Microtome,n/a,n/a

D,111,B-152-427,7,6,1200,Miscellaneous,n/a,n/a

H,222,978.4,7563.1,n/a,Air freight,n/a,n/a,n/a

D,222,ZZ-AW56-1,10,5,10000,Gas Chromatograph,n/a,n/a

 

Sie finden das in diesem Beispiel erstellte Mapping unter dem folgenden Pfad: <Dokumente>\Altova\MapForce2019\MapForceExamples\ReplaceEmptyFields.mfd. Die CSV-Quelldatei für dieses Mapping hat den Namen Orders.csv und befindet sich im selben Ordner. Die CSV-Zieldatei wird von MapForce generiert.

 

Um das gewünschte Mapping-Ergebnis zu erzielen, erstellen wir eine einzige Node-Funktion, die jeden leeren Wert durch "n/a" ersetzt. Wie unten gezeigt, wird diese Funktion nur einmal definiert, aber auf mehrere untergeordnete CSV-Felder angewendet.

 

Schritt 1: Hinzufügen der CSV-Quelldatei zum Mapping

Sie können die CSV-Quelldatei folgendermaßen zum Mapping hinzufügen:

 

1.Klicken Sie im Menü Einfügen auf Textdatei.
2.Wählen Sie die Option Einfache Verarbeitung für Standard-CSV (getrennt) und/oder FLF-Dateien (feste Länge) verwenden (nur MapForce Enterprise Edition) und klicken Sie auf Weiter.
3.Klicken Sie auf Eingabedatei und navigieren Sie zur folgenden Datei: <Dokumente>\Altova\MapForce2019\MapForceExamples\Orders.csv.

 

Wenn das Kontrollkästchen Leere Felder als nicht vorhanden behandeln aktiviert ist, deaktivieren Sie es. Wenn dieses Kontrollkästchen aktiviert ist, werden leere Werte unterdrückt, wodurch die Node-Funktion nicht funktioniert. Nähere Informationen finden Sie unter Definieren der CSV-Optionen.

 

4.Klicken Sie auf OK.
5.Wenn Sie aufgefordert werden, die Komponentennamen in "Orders" zu ändern, klicken Sie auf die gewünschte Option (z.B. Komponentennamen unverändert lassen).

 

Nähere Informationen zu CSV-Komponenten in MapForce finden Sie unter CSV- und Textdateien.

 

Schritt 2: Hinzufügen der CSV-Zieldatei zum Mapping

Sie können die CSV-Zieldatei folgendermaßen zum Mapping hinzufügen:

 

1.Klicken Sie im Menü Einfügen auf Textdatei.
2.Wählen Sie die Option Einfache Verarbeitung für Standard-CSV (getrennt) und/oder FLF-Dateien (feste Länge) verwenden (nur MapForce Enterprise Edition) und klicken Sie auf Weiter.
3.Die Zieldatei muss gleich viele Felder wie die Quelldatei haben. Klicken Sie daher mehrmals auf die Schaltfläche Feld anhängen, um neun Felder hinzuzufügen.
4.Klicken Sie auf OK.

 

Schritt 3: Ziehen der Mapping-Verbindungen

Das Mapping enthält zu diesem Zeitpunkt zwei Komponenten: die CSV-Datei und die Zieldatei. Klicken Sie in der Quellkomponente neben dem Datenelement Zeilen auf den Output-Konnektor mf_ic_output_connectorund ziehen Sie den Cursor auf den Input-Konnektor mf_ic_output_connectordes Datenelements Zeilen in der Zielkomponente. MapForce verbindet dabei unter Umständen abhängig von Ihren Einstellungen automatisch alle untergeordneten Datenelemente und erstellt eine sogenannte "Alles kopieren"-Verbindung. Dies geschieht nur, wenn die Symbolleistenoption Aktiviert/Deaktiviert die automatische Verbindung von Sub-Einträgen ic-conn-child aktiv ist. Wie zuvor erwähnt, werden Node-Funktionen nicht auf untergeordnete Datenelemente von "Alles kopieren"-Verbindungen angewendet. Die "Alles kopieren"-Verbindung muss daher zuerst in eine Standardverbindung geändert werden. Verbinden Sie dazu Field1 aus der Quellkomponente mit Field1 aus der Zielkomponente. Wenn Sie gefragt werden, klicken Sie auf Verbindung ersetzen und anschließend auf "Alles kopieren"-Verbindung auflösen.

 

Wenn die Option Aktiviert/Deaktiviert die automatische Verbindung von Sub-Einträgen ic-conn-child nicht aktiv ist, können Sie folgendermaßen Verbindungen zwischen der Quell- und der Zielkomponente erstellen:

 

1.Verbinden Sie das Datenelement Zeilen in der Quellkomponente mit dem Datenelement Zeilen in der Zielkomponente.
2.Klicken Sie mit der rechten Maustaste auf die Verbindung und wählen Sie im Kontextmenü den Befehl Idente Sub-Einträge verbinden.
3.Deaktivieren Sie das Kontrollkästchen "Alles kopieren"-Verbindungen erstellen.
4.Klicken Sie auf OK.

 

Ihr Mapping sollte nun folgendermaßen aussehen:

mff_nodefunc_ex1

 

Schritt 4: Erstellen der Node-Funktion

Sie können eine Node-Funktion entweder unmittelbar, nachdem die Daten die Quellkomponente verlassen, oder unmittelbar, bevor sie in die Zielkomponente geschrieben werden, erstellen. Erstellen wir zum Zweck dieses Beispiels die Node-Funktion auf der Input-Seite der Zielkomponente, d.h. im Prinzip "unmittelbar, bevor die Daten in die Zielkomponente geschrieben werden". Nähere Informationen dazu finden Sie unter Auswahl der Input- oder Output-Seite.

 

Klicken Sie mit der rechten Maustaste in der Zielkomponente auf das Datenelement Zeilen und wählen Sie im Kontextmenü die Option Node-Funktionen und Standardwerte | Input-Node-Funktionen und Standardwerte. Am oberen Rand des Mapping-Fensters wird nun ein leeres Raster angezeigt.

mff_nodefunc_ex2

Klicken Sie als nächstes links vom Raster auf die Schaltfläche Funktion hinzufügen mf_ic_add_nodefunc. Im Mapping werden nun der Input ("raw_value") und der Output ("result") der Funktion angezeigt.

mff_nodefunc_ex3

Wie bereits erwähnt, sollen mit Hilfe der Funktion alle leeren Werte in den String "n/a" konvertiert werden. Fügen wir zu diesem Zweck die folgenden Zusatzkomponenten zum Mapping hinzu:

 

die vordefinierte MapForce-Funktion empty. Diese Funktion gibt "true" zurück, wenn der als Argument bereitgestellte Wert leer ist. Andernfalls wird "false" zurückgegeben. Sie können die Funktion aus dem Fenster "Bibliotheken" in das Mapping ziehen oder einfach ins Mapping doppelklicken und "empty" eingeben, siehe auch Hinzufügen einer vordefinierten Funktion zum Mapping.
einen Textwert "n/a". Um diesen Wert hinzuzufügen, doppelklicken Sie auf einen leeren Bereich des Mappings und geben Sie "n/a" innerhalb von doppelten Anführungszeichen ein, siehe auch Hinzufügen einer Konstante zum Mapping.
eine If-Else-Bedingung. Um diese zum Mapping hinzuzufügen, klicken Sie auf die Symbolleisten-Schaltfläche If-Else-Bedingung ( mff_ic_if_else ) . Nähere Informationen zu solchen Komponenten finden Sie im Beispiel: Rückgabe eines Werts auf Basis einer Bedingung.

 

Erstellen Sie mit Hilfe dieser Komponenten die folgende Funktion:

mff_nodefunc_ex4

Das oben gezeigte Mapping-Design funktioniert folgendermaßen: Alle Input-Werte aus dem äußeren Mapping werden zuerst über den Input raw_value (Rohwert) in die Funktion eingespeist. Der Rohwert wird anschließend als Input für die Funktion empty bereitgestellt. Anschließend wertet die If-Else-Komponente das von der empty-Funktion zurückgegebene Boolesche Ergebnis (true oder false) aus. Wenn das Ergebnis true ist, erhält die Funktion die Konstante "n/a" als Ergebnis. Wenn das Ergebnis false ist, erhält die Funktion den Input-Rohwert als Ergebnis. Das Ergebnis (result) der Funktion (welches entweder "n/a" oder raw_value ist) wird anschließend an das äußere Mapping zurückgeben.

 

Klicken Sie auf mf_ic_exit_door Zurück (oder drücken Sie Escape), um den Bearbeitungsbereich für die Funktion zu verlassen.

mff_nodefunc_ex5

Beachten Sie im oben gezeigten Mapping die folgenden Punkte:

 

Der Text am oberen Rand des Fensters gibt genau an, wo die Funktion definiert ist. Dies ist v.a. in Situationen, in denen für dieselbe Komponente mehrere Node-Funktionen definiert sind, hilfreich.
Die Option Anwenden auf im Raster ist auf Alle untergeordneten Datenelemente gesetzt. Dies ist in diesem Beispiel das beabsichtigte Verhalten, d.h. alle untergeordneten Datenelemente von Zeilen sind betroffen, falls die Funktion darauf angewendet werden kann. Wie Sie im Mapping sehen, werden auf der linken (Input)-Seite der Zielkomponente mehrere mf_ic_node_func_applied Symbole angezeigt, obwohl die Funktion nur einmal für das übergeordnete Datenelement definiert wurde.
Die Option Datentyp ist auf "string" gesetzt. Da wir es in diesem Beispiel mit Textdaten zu tun haben, ist dies das beabsichtigte Verhalten. Es ist gleichzeitig auch das Standardverhalten.
Über die Schaltfläche Bearbeiten können Sie zur Funktionsdefinition zurückgehen und diese gegebenenfalls ändern. Wenn diese Schaltfläche nicht angezeigt wird, klicken Sie zuerst auf das Symbol mf_ic_node_func_defined.

 

Schritt 5: Ausführen des Mappings

Um direkt in MapForce eine Vorschau auf das Mapping-Ergebnis anzuzeigen, klicken Sie auf das Register Ausgabe. Falls es zu Validierungsfehlern kommt, werden diese im Fenster Meldungen angezeigt, siehe Validieren von Mappings. Bei Erfolg wird die erzeugte CSV-Datei im Fenster Ausgabe angezeigt.

 

Sie können solche Mappings auch auf einem Server-Rechner mit Hilfe der MapForce Server Advanced Edition auf eine der folgenden Arten ausführen:

 

Wenn Sie eine MapForce Server Advanced Edition Standalone-Lizenz haben, kompilieren Sie das Mapping zu einer Ausführungsdatei und kopieren Sie diese auf den Zielrechner, siehe Kompilieren von Mappings zu MapForce Server-Ausführungsdateien.
Wenn Sie sowohl für FlowForce Server als auch für die MapForce Server Advanced Edition eine Lizenz haben, können Sie das Mapping direkt auf FlowForce Server bereitstellen und es als Auftrag für die Ausführung nach einem Zeitplan oder bei Bedarf konfigurieren, siehe Bereitstellen von Mappings auf FlowForce Server.

© 2019 Altova GmbH