ClusterFileDbPreparser

Gruppe

Preparser

Funktion

Sortiert und gruppiert große Eingangsdatenmengen vor dem Parsen mithilfe einer temporären Datenbank.

Konfigurationsdatei

./conf/samples/sample_ClusterFileDbPreparser.properties

Beschreibung


Unter Umständen ist es nötig, die Eingangsdaten vor dem Parsen zu sortieren, oder zu gruppieren. Dazu ist der ClusterFileDbPreparser bestimmt. Da es sich um sehr große Datenmengen handelt, verwendet dieser Preparser eine eigene temporäre Datenbank. Jeder Job verwendet eine eigene Datenbank, um gegenseitige Beeinflussung auszuschließen. Die Arbeit des Preparsers erfolgt in zwei Schritten.

Schritt 1

Die Eingangsdaten werden Zeile für Zeile gelesen. Mit einem regulären Ausdruck wird aus jeder Zeile ein Schlüssel ermittelt. Wenn der Schlüssel gefunden ist, wird ein Eintrag in die Datenbanktabelle data eingefügt. Diese Tabelle hat zwei Spalten, Spalte name für den Schlüssel und Spalte value für die ganze Zeile.

Schritt 2

Mit einem SELECT-Statement werden die Zeilen wieder aus der Datenbank gelesen und in den Ausgabe-Datenstrom des Preparsers eingefügt. Verwenden Sie die SQL-Klausel ORDER BY, bzw. GROUP BY für die Sortierung, bzw. Gruppierung der Datensätze. Optional kann in die Ausgabezeilen noch in bestimmten Abständen eine Trennzeile eingefügt werden (analog zum TokenFileSplitter), um große Datenmengen in mehrere Datenblätter parsen zu können.

Der Preparser erwartet zur Konfiguration eine Properties-Datei mit folgenden möglichen Parametern.


expression

(Pflicht) Regulärer Ausdruck, der innerhalb jeder Datenzeile einen Abschnitt selektiert, der dann als Schlüssel dient. Der Schlüssel wird dabei im Ausdruck mit Hilfe einer Gruppe (.*?) definiert.

stmt

SQL-Anweisung zum Auslesen der Daten in geordneter/gruppierter Reihenfolge. Die Feldnamen name und value müssen im Select-Statement explizit angegeben werden. Default: SELECT name,value FROM data ORDER BY name

header

Text einer Trennzeile zum Parsen in mehrere Datenblätter. Die Trennzeile wird als erste Zeile eingefügt und gegebenenfalls wiederholt (siehe: maxrows).

maxrows

Anzahl der Zeilen, nach denen eine neue Trennzeile eingefügt wird. Wenn nach gleichem Schlüsselwert gruppiert wird, wird die Trennzeile erst wieder eingefügt, wenn die Anzahl der Zeilen erreicht ist und die Gruppe vollständig ausgegeben wurde. Default: Vor jeder Gruppe.

groupnumber

(optional) Wenn der Ausdruck expression mehr als eine Gruppe enthält, definiert die erste (am weitesten links stehende) Gruppe den Schlüssel (name). Mit groupnumber kann eine andere Gruppe als Schlüssel festgelegt werden. Default: 1.

additional_groups

In diesem Parameter kann eine Liste mit Gruppennummern (mit , getrennt) angegeben werden, für die eine eigene Spalte in der temporären Tabelle aufgebaut wird. Die Gruppen müssen im regulären Ausdruck definiert werden. Die Spalten bekommen die Namen field1, field2, usw.

verbose

(optional) Schaltet die Debug-Ausgabe im Log ein. Achtung: Mit verbose=true werden unter Umständen sehr viele Logeinträge erzeugt, was die Konvertierung stark verlangsamen kann. Default: false.

Beispiele


Beispiel 1

Eine CSV-Datei mit dem Feldtrenner | hat jeweils in der vierten Spalte den Schlüsselwert, nach dem sortiert/gruppiert wird.


expression=^.*?\\|.*?\\|.*?\\|(.*?)\\|.*$


Der Ausdruck in Klammern referenziert den Schlüssel. Um den Schlüssel anschließend aus dem regulären Ausdruck herauslesen zu können, müssen alle Quantoren, hier z. B. * für beliebig viele oder auch gar keine Wiederholung, als "nicht gierig" (non-greedy) gekennzeichnet werden. Das geschieht durch das nachgestellte Fragezeichen. Hinter dem Schlüssel stehende Quantoren dürfen "gierig" sein.

Hinweis: Um innerhalb der Datensätze, die den gleichen Schlüssel haben, nach einem zweiten Kriterium und eventuell noch weiteren Kriterien zu sortieren, muss der reguläre Ausdruck expression mehrere Gruppen (.*?) enthalten. In diesem Fall kann über die Parameter groupnumber und additional_groups festgelegt werden, welcher Klammerausdruck den Schlüssel definiert und welche weiteren Sortierkriterien verwendet werden sollen. Siehe dazu das folgende Beispiel.

Beispiel 2

Eine CSV-Datei mit dem Feldtrenner | hat jeweils in der ersten Spalte den Schlüsselwert, nach dem sortiert wird. Zusätzliche Sortierfelder sind die erste und die vierte Spalte.


expression=^(.*?)\\|(.*?)\\|(.*?)\\|(.*?)\\|.*$


Alle Spalten bis zur fünften müssen als (.*?) geschrieben werden. Um nun zu bestimmen, dass die erste Spalte, also die erste Gruppe, das Schlüsselfeld ist, wird groupnumber=1 definiert. Als weiteres Sortierkriterium soll die erste Spalte, also die erste Gruppe, und danach die vierte Spalte, also die vierte Gruppe, verwendet werden. Dazu wird additional_groups=1,4 definiert. Dadurch werden in der Tabelle die Felder field1 (für Spalte 1) und field2 (für Spalte 4) erzeugt.

Das stmt lautet dann: SELECT name,value FROM data ORDER BY field1,field2

Beispiel-Datei


expression=^(.*?)\\|(.*?)\\|(.*?)\\|(.*?)\\|.*$
stmt=select name,value from data order by field1,field2
#header=Trennzeile
#maxrows=0
groupnumber=1
additional_groups=1,4
#verbose=true

Beispiel-Profil


Im Beispiel-Profil unten möchten wir folgende, vereinfachte Eingangsdaten sortieren nach Artikelnummer und Kundennummer (in der Praxis wären diese natürlich deutlich umfangreicher).

Importieren Sie einfach einmal das Profil, testen Sie es und sehen Sie sich die Konfigurationsdatei des Preparsers an.


special_price.csv
#Article_number|Description_product|Class|Customer_no|Special_price
12061_16|Melon Water|FRAGUM_S2|100033|31.2
12061_16|Melon Water|FRAGUM_S6|100097|27.6
12061_16|Melon Water|FRAGUM_S2|100194|31.2
12061_16|Melon Water|FRAGUM_S2|100206|31.2
12061_16|Melon Water|FRAGUM_S6|100284|27.6
12055_12|Melon Charentais|FRAGUM_S2|100033|22.8
12055_12|Melon Charentais|FRAGUM_S6|100097|21.6
12055_12|Melon Charentais|FRAGUM_S2|100194|22.8
12055_12|Melon Charentais|FRAGUM_S2|100206|22.8
12055_12|Melon Charentais|FRAGUM_S6|100284|21.6
12055_12|Melon Charentais|FRAGUM_S2|100332|22.8
12055_12|Melon Charentais|FRAGUM_S5|100364|21.6
12061_16|Melon Water|FRAGUM_S2|100332|31.2
12061_16|Melon Water|FRAGUM_S5|100364|27.6
12061_16|Melon Water|FRAGUM_S7|100392|25.2
12061_16|Melon Water|FRAGUM_S7|100446|25.2
12061_16|Melon Water|FRAGUM_S2|100667|31.2
12061_16|Melon Water|FRAGUM_S2|100768|31.2
12061_16|Melon Water|FRAGUM_S6|100777|27.6
12055_12|Melon Charentais|FRAGUM_S7|100392|19.8
12055_12|Melon Charentais|FRAGUM_S7|100446|19.8
12055_12|Melon Charentais|FRAGUM_S2|100667|22.8
12055_12|Melon Charentais|FRAGUM_S2|100768|22.8
12055_12|Melon Charentais|FRAGUM_S6|100777|21.6
12055_12|Melon Charentais|FRAGUM_S2|100780|22.8


Profil: Profile-Import_specialprice.pak (siehe Abschnitt Manueller Export und Import von Profilen)

Eingangsdaten: special_price.csv