Beispiel: Gruppieren von Datensätzen nach Schlüssel

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

Startseite >  Erstellen von Mappings > Gruppieren von Daten >

Beispiel: Gruppieren von Datensätzen nach Schlüssel

In diesem Beispiel wird gezeigt, wie Sie Datensätze mit Hilfe der group-by-Funktion gruppieren. Außerdem wird darin gezeigt, wie Sie Daten aggregieren. Das Demo-Mapping zu diesem Beispiel finden Sie unter dem folgenden Pfad: <Dokumente>\Altova\MapForce2019\MapForceExamples\GroupTemperaturesByYear.mfd. In diesem Mapping werden Daten aus einer XML-Datei ausgelesen, die ein Protokoll monatlicher Temperaturen enthält, siehe Codefragment unten:

 

<Temperatures>
  <data temp="-3.6" month="2006-01" />
  <data temp="-0.7" month="2006-02" />
  <data temp="7.5" month="2006-03" />
  <data temp="12.4" month="2006-04" />
  <data temp="16.2" month="2006-05" />
  <data temp="19" month="2006-06" />
  <data temp="22.7" month="2006-07" />
  <data temp="23.2" month="2006-08" />
  <data temp="18.7" month="2006-09" />
  <data temp="11.2" month="2006-10" />
  <data temp="9.1" month="2006-11" />
  <data temp="0.8" month="2006-12" />
  <data temp="-3.2" month="2007-01" />
  <data temp="-0.3" month="2007-02" />
  <data temp="6.5" month="2007-03" />
  <data temp="10.6" month="2007-04" />
  <data temp="19" month="2007-05" />
  <data temp="20.3" month="2007-06" />
  <data temp="22.3" month="2007-07" />
  <data temp="20.7" month="2007-08" />
  <data temp="19.2" month="2007-09" />
  <data temp="12.9" month="2007-10" />
  <data temp="8.1" month="2007-11" />
  <data temp="1.9" month="2007-12" />
</Temperatures>

 

Dieses Mapping hat zwei Aufgaben:

 

1.Zusammengruppierung der Temperaturen jedes Jahres
2.Eruierung der jeweiligen Minima, Maxima und Durchschnittstemperaturen jedes Jahres

 

Für Aufgabe Nr. 1 wird die Funktion group-by im Mapping aufgerufen. Für Aufgabe Nr. 2 werden die Aggregierungsfunktionen min, max und avg aufgerufen. Alle diese Funktionen sind vordefinierte MapForce-Funktionen, die Sie durch Ziehen aus dem Fenster "Bibliotheken" in jedes beliebige Mapping einfügen können, siehe Hinzufügen einer vordefinierten Funktion zum Mapping.

mf_GroupTemperaturesByYear_map

GroupTemperaturesByYear.mfd

Bei der Ausführung eines MapForce-Mappings (dies ist auch die empfohlene Methode, um ein Mapping zu lesen), wird mit dem obersten Datenelement der Zielkomponente begonnen. In diesem Beispiel wird für jede von der Funktion group-by zurückgegebene Gruppe ein YearlySales-Datenelement zurückgegeben. Die Funktion group-by nimmt als erstes Argument alle data-Datenelemente aus der Quellkomponente und gruppiert diese nach dem Input, der mit dem Input "key" verbunden ist. Da die Temperaturen nach Jahr gruppiert werden sollen, muss zuerst das Jahr ermittelt werden. Zu diesem Zweck extrahiert die Funktion substring-before das Jahr aus dem Attribut month der einzelnen data-Elemente. Dabei wird als Argument der Wert von month verwendet und es wird der Teil vor der ersten Instanz von substr zurückgegeben. Wie oben gezeigt, wird in diesem Beispiel für substr das Bindestrichzeichen definiert. Wenn die Funktion daher den Wert "2006-01" verarbeitet, ist das Ergebnis der Funktion "2006".

 

Die Werte von MinimumTemp, MaximumTemp und AverageTemp werden schließlich durch Verbinden dieser Datenelemente mit der jeweiligen Aggregationsfunktion min, max und avg ermittelt. Alle drei Funktionen erhalten als Input die aus der Quellkomponente ausgelesene Sequenz von Temperaturen. Für diese Funktionen wird kein parent-context-Argument benötigt, da sie bereits im Kontext der einzelnen Gruppen verwendet werden, d.h. es gibt eine übergeordnete Verbindung von data zu YearlyStats, die den Kontext für die einzelnen Aggrationsfunktionen liefert.

 

Um eine Vorschau auf die Mapping-Ausgabe zu sehen, klicken Sie auf das Register Ausgabe. Beachten Sie, dass die Anzahl der Gruppen der Anzahl der in der Quelldatei vorhandenen Jahre entspricht, z.B.:

 

<Temperatures>
  <YearlyStats Year="2006">
    <MinimumTemp>-3.6</MinimumTemp>
    <MaximumTemp>23.2</MaximumTemp>
    <AverageTemp>11.375</AverageTemp>
  </YearlyStats>
  <YearlyStats Year="2007">
    <MinimumTemp>-3.2</MinimumTemp>
    <MaximumTemp>22.3</MaximumTemp>
    <AverageTemp>11.5</AverageTemp>
  </YearlyStats>
</Temperatures>

 

Anmerkung:Die oben gezeigten Codefragmente enthalten aus Gründen der Einfachheit weniger Daten als die tatsächliche Input- und Output-Datei aus dem Demo-Mapping.

© 2019 Altova GmbH