Importmodul IV: Importprofil |
Wie bereits in den bisherigen Beispielen angedeutet, dienen die Spalten der Quelldateien als Bausteine für die Datengrundlage der Zieltabellen. Eine Quellspalte ist funktional nur eine Liste von Zeichenketten. Eine einzelne Zeichenkette, zusammen mit der Angabe einer Anzahl, kann deshalb als Ersatz für eine "echte" Quellspalte dienen. Daher ist es möglich, einer Zielspalte eine einzelne Zeichenkette (frei definiert oder einer der Spezialwerte) als Datenquelle zuzuordnen, wenn es für den entsprechenden Datentyp mindestens eine Zielspalte gibt, der eine echte Quellspalte zugeordnet ist, so dass die Anzahl der Datensätze feststeht.
Dieser Ansatz lässt sich verallgemeinern. Im Prinzip ist jede Art, auf der Grundlage der vorhandenen Quellspalten, eine eindeutig definierte Liste von Zeichenketten zu konstruieren, ein adäquater Ersatz für eine echte Quellspalte. Es gibt im recotech Importmodul mehrere verschiedene Arten von Quellspalten, die teilweise durch logische Bedingungen qualifiziert werden.
Definition und Konstruktion dieser Datenspalten und der sie konstituierenden logischen Funktionen erfordern teilweise eine gewisse Vertrautheit mit Programmierung, Datenstrukturen und formaler Logik. Deshalb ist ihre Beschreibung auf zwei Kapitel verteilt. In diesem werden die Definitionen vorgestellt, die intuitiv leicht verständlich sind. Das folgende Kapitel enthält die komplizierteren. Beide Kapitel sind eher informell. Im Anhang finden sich die formalen Definitionen.
Aus mehreren Quellspalten lässt sich eine neue konstruieren, indem die Zeichenketten aneinander gehängt werden. Die entsprechende Deklaration in der Profildatei ist wie folgt:
$TargetColumn Comment |
Personen.Nachname + ", " + Personen.Vorname |
In die Kommentar-Zielspalte einer Importtabelle würden dann Einträge wie 'Müller, Peter' stehen. Diese Art der Quellspaltenkonstruktion kann nur dann funktionieren, wenn alle beteiligten Quellspalten die gleiche Zeilenanzahl haben. Streng genommen: die gleiche oder keine definierte. Im obigen Beispiel sind nämlich nicht zwei, sondern tatsächlich drei Quellspalten verknüpft. Die Zeichenkette '", "' definiert ebenfalls eine Quellspalte: Eine Liste von Zeichenketten, die alle nur aus einem Komma gefolgt von einem Leerzeichen bestehen. Und zwar so viele, wie aus dem Kontext heraus benötigt werden.
Die Zitatzeichen deuten dem Importmodul an, dass hier eine buchstabengetreue Zeichenkette steht, die nicht interpretiert werden soll. Die Anführungsstriche werden nicht als Teil dieser Zeichenkette gelesen.
Auf der Grundlage einer Quellspalte lässt sich eine neue konstruieren, indem sie kopiert und manche Werte durch andere Werte ersetzt werden. Die Deklaration
$TargetColumn Comment |
FullReplace(Personen.Kommentar, "bitte nachtragen", Personen.Kommentar = "") |
definiert eine neue Quellspalte, die der Spalte Personen.Kommentar entspricht, in der aber in allen dort leeren Feldern 'bitte nachtragen' steht. Diese Quellspalte wird der Kommentarspalte einer Importtabelle zugeordnet.
Die Deklaration einer solchen durch bedingte Ersetzung zu konstruierenden Quellspalte wird mit dem Schlüsselwort 'FullReplace' eingeleitet. In Klammern dahinter und durch Kommata getrennt, müssen drei weitere Angaben stehen: die als Grundlage dienende Quellspalte, die neuen Werte und eine Bedingung.
Als neuer Wert kann, wie im obigen Beispiel, eine feste Zeichenfolge dienen. Es kann an dieser Stelle aber auch jede andere Quellspalte verwendet werden. Zum Beispiel die vorher definierte kommagetrennte Verkettung von Nach- und Vorname:
20 |
$TargetColumn Comment |
21 |
FullReplace(Personen.Kommentar, Personen.Nachname + ", " + |
|
Personen.Vorname, Personen.Kommentar = "") |
22 |
|
Wenn die Seitenbreite dieses Dokuments einen Zeilenumbruch erzwingt, werden in den Beispielen graue Zeilennummern vorangestellt. Diese sind nicht Teil der Profildatei und die genauen Zahlen sind irrelevant. Sie sollen nur andeuten, dass die hier umgebrochen dargestellte Zeile in der Profildatei in einer Zeile stehen muss. |
Die oben vorgestellte Ersetzung kopiert die Quellspalte und tauscht einige Werte durch andere aus. Eine andere Möglichkeit der Ersetzung besteht darin, nur Teile eines Wertes zu ersetzen. Die entsprechende Definition lautet:
$TargetColumn Comment |
PartialReplace(Punkte.Nr, "P", "") |
Auf AutoCAD basierende Schnittstellen, wie zum Beispiel auch das von recotech eingesetzte und empfohlene hylasFM, exportieren die Reihenfolge der Punkte eines Polygons oft mit Angaben im Format P1, P2, …. Diese Zeichenketten lassen sich zwar als Zeichenketten sortieren, aber ohne weitere Interpretation mit dem Ergebnis P1, P10, P11, P2, P3, … Deshalb fordert die Importschnittstelle, dass die Daten in der Spalte Nummer der Punkttabelle als Zahl interpretiert werden können. Die obige Ersetzung ermöglicht genau das. |
Die Deklaration einer solchen Quellspalte wird mit dem Schlüsselwort 'PartialReplace' eingeleitet. In Klammern dahinter und durch Kommata getrennt müssen drei weitere Angaben stehen: die als Grundlage dienende Quellspalte, die zu ersetzenden Teile und die Ersetzungen. Eine zusätzliche Bedingung ist hier nicht notwendig. Die Ersetzung findet nur statt, wenn die zu ersetzende Zeichenkette gefunden wird.
Diese beiden Ersetzungen ändern nicht die als Grundlage dienenden Quellspalten, sondern erzeugen neue. Dies gilt generell für alle Deklarationen von eigens definierten Quellspalten. |
Wie bereits angedeutet, können Quellspalten beliebig verschachtelt werden: Die aus der Verkettung der Namen entstandene Quellspalte diente als Lieferant der neuen Werte in einer durch FullReplace definierten Quellspalte. Diese könnte selbst wiederum als Bestandteil weiterer Quellspalten-Definitionen dienen.
Weil solche längeren Konstruktionen schnell unübersichtlich werden, können eigens definierte Quellspalten auch mit einem Alias versehen werden. Wie auch bei den Aliasen der Dateien und Spalten sind nur alphanumerische Zeichen sowie der Unterstrich erlaubt. Eine solche Definition wird mit dem Schlüssel 'SourceColumn' eingeleitet:
30 |
$SourceColumn NamensKombo Personen.Nachname + ", " + Personen.Vorname |
31 |
$SourceColumn NameOderKommentar FullReplace(Personen.Kommentar, |
NamensKombo, Personen.Kommentar = "") |
|
32 |
|
33 |
$TargetColumn Comment |
34 |
NameOderKommentar |
Bei der Deklaration der eigens definierten Quellspalten sind deren Aliase frei wählbar, deswegen sind sie in den Beispielen in schwarzer Schrift dargestellt. Bei ihrer Verwendung sind sie, genau wie der Datei-Alias 'Personen', ein vordefiniertes Wort, das interpretiert wird und deshalb dort in grüner Schrift gehalten. |
In den bisherigen Beispielen war die einzige Bedingung die Gleichheit mit der leeren Zeichenkette. Umgekehrt kann man auch die Ungleichheit testen. Dazu wird statt '=' '!= ' verwendet.
An Stelle der leeren Zeichenkette kann eine Bedingung auch mit jeder beliebigen Zeichenkette formuliert werden:
31 |
$SourceColumn K1 FullReplace (Personen.Kommentar, "keine Angabe", |
Personen.Kommentar = "nn") |
|
32 |
$SourceColumn K2 FullReplace (K1, "keine Angabe", K1 = "NN") |
33 |
$SourceColumn K3 FullReplace (K2, "keine Angabe", K2 = "na") |
34 |
$SourceColumn K4 FullReplace (K3, "keine Angabe", K3 = "NA") |
35 |
$SourceColumn K5 FullReplace (K4, "keine Angabe", K4 = "ka") |
36 |
$SourceColumn K6 FullReplace (K5, "keine Angabe", K5 = "KA") |
37 |
|
38 |
$TargetColumn Comment |
39 |
K6 |
Hier werden eine Reihe von Quellspalten definiert, die letztlich auf der Spalte Personen.Kommentar beruhen, in denen aber schrittweise die Werte 'nn', 'NN', 'na', 'NA', 'ka' und 'KA' durch 'keine Angabe' ersetzt werden.
Der Vergleich mit einer explizit gegebenen Zeichenkette ist wieder nur ein Spezialfall. Je zwei gültige Deklarationen einer Quellspalte können mit '=' oder '!=' auf Gleichheit bzw. Ungleichheit getestet werden:
31 |
$SourceColumn KommentarMitAnmerkung Replace(Personen.Kommentar, |
Personen.Kommentar + " (Namen überprüfen)", |
|
Personen.Vorname = Personen.Nachname) |
|
32 |
|
33 |
$TargetColumn Comment |
34 |
KommentarMitAnmerkung |
Mit diesen Deklarationen wird an die Kommentare der Zusatz '(Namen überprüfen)' angehängt, wenn Vor- und Nachname gleich sind.
Bedingungen spielen bei der Definition von Quellspalten eine große Rolle. Wie auch bei den Quellspalten selbst gibt es verschiedene Möglichkeiten sie zu definieren und ineinander zu schachteln. Das nächste Kapitel geht näher auf die Bedingungen ein. Die vollständige formale Definition aller Bedingungen befindet sich im Anhang.
Neben der Verwendung in der Deklaration von Quellspalten mittels FullReplace können mit Bedingungen Auslassungsklauseln definiert werden. Es gibt zwei Stellen der Datenextraktion, an denen es sinnvoll und möglich ist, bestimmte Zeilen bzw. Datensätze zu ignorieren: Beim Einlesen der Dateien und beim Erzeugen der Importobjekte. Beide Fälle seien am Beispiel der folgenden Excel Datei erläutert:
1 |
Platzanspruch |
Typ |
Abteilung |
Vorname |
Nachname |
Kommentar |
2 |
Controlling |
|
|
|
|
|
3 |
SA1_Con |
Sachbearbeiter |
Controlling |
Peter |
Müller |
|
4 |
SA2_Con |
Sachbearbeiter |
Controlling |
Maria |
Meier |
|
5 |
SA3_Con |
Sachbearbeiter |
Controlling |
Klaus |
Schneider |
|
6 |
SA4_Con |
Sachbearbeiter |
Controlling |
Ingo |
Schmidt |
|
7 |
AL_Con |
Abteilungsleiter |
Controlling |
Ines |
Schulz |
|
8 |
Conf_Con |
Besprechung |
Controlling |
|
|
|
9 |
|
|
|
|
|
|
10 |
CAD |
|
|
|
|
|
11 |
SA1_CAD |
Sachbearbeiter |
CAD |
Axel |
Bauer |
|
12 |
SA2_CAD |
Sachbearbeiter |
CAD |
Maria |
Meier |
|
13 |
AL_CAD |
Abteilungsleiter |
CAD |
Helge |
Schulze |
|
14 |
Plotter_CAD |
Technik |
CAD |
|
|
|
Aus dieser Tabelle sollen die Platzansprüche und die Personen ausgelesen werden. Die entsprechende Dateideklaration sieht wie folgt aus:
$File |
Personal.csv |
$Alias |
Personal |
$Headline |
True |
$ColumnNumber |
6 |
$ColumnSeperator |
; |
$QuoteChar |
" |
$Encoding |
|
$Columns |
|
Platzanspruch |
0 |
Typ |
1 |
Abteilung |
2 |
Vorname |
3 |
Nachname |
4 |
Kommentar |
5 EmptyString |
|
|
$SourceIgnore |
Personal.Typ = "" |
Die erste Zeile der aus der Tabelle generierten CSV-Datei wird durch die Angabe, dass sie eine Kopfzeile enthält, ignoriert. Die beiden gelben Zeilen und die Leerzeile zwischen den beiden Blöcken enthalten keine Daten. Um sie schon beim Einlesen der Datei zu ignorieren, wird vor der nächsten Dateideklaration die Zeile mit dem Schlüssel SourceIgnore eingefügt.
Damit wird das Importmodul angewiesen, in der Datei alle Zeilen zu ignorieren, in denen in der Spalte Typ nichts steht. Die sechs deklarierten Quellspalten haben damit nur zehn Zeilen. Die drei personenrelevanten Quellspalten haben allerdings immer noch zwei Zeilen ohne Information (Zeile 8 und 14). Diese sollen nur bei der Verwendung in der Personen-Importtabelle ignoriert werden.
Die entsprechenden Deklarationen der Zielspalten für die Personen-Importtabelle lauten wie folgt:
$Type XPerson |
|
$TargetIgnore LastName = "" |
|
$TargetColumn XId |
AutoString |
|
$TargetColumn FirstName (Identifying) |
Personal.Vorname |
|
$TargetColumn LastName (Identifying) |
Personal.Nachname |
|
$TargetColumn Comment |
Personal.Kommentar |
|
$TargetColumn Command |
InsertString |
Die zusätzliche Anweisung mit dem Schlüssel TargetIgnore weist das Importmodul an, bei der Erstellung der Personen-Importobjekte alle auszulassen, die in der Eigenschaft LastName eine leere Zeichenfolge hätten.
Der Unterschied zwischen den beiden Auslassungsklauseln SourceIgnore und TargetIgnore ist nicht nur der Zeitpunkt, zu dem sie ausgewertet werden, sondern vor allem folgender: Die Bedingungen in den ersten Klauseln werden mit Quellspalten definiert; die Bedingungen in den letzteren mit Zielspalten.
Nach dem Schlüsselwort SourceIgnore erwartet das Importmodul die Deklaration einer Quellbedingung, die für die Datei definiert ist, in deren Deklarationsblock die Auslassungsklausel steht.
Nach dem Schlüsselwort TargetIgnore erwartet das Importmodul die Deklaration einer Zielbedingung, die für den Datentyp definiert ist, in dessen Deklarationsblock die Auslassungsklausel steht.
Die vollständigen Listen der Quell- und Zielbedingungen und ihre genaue Syntax finden sich im Anhang.