Nachträge zu Kapitel 7.1 bis 7.5

This commit is contained in:
Felix Lohmeier 2017-01-03 20:08:25 +01:00
parent 45b86e80c0
commit d35e2937ad
6 changed files with 160 additions and 101 deletions

View File

@ -1,6 +1,6 @@
# 7.1 Facetten und Text Filter
Alle folgenden Übungen in den Kapiteln 7.1 bis 7.3 führen wir zunächst mit einer einzigen Datei aus dem Download durch. Diese Datei beinhaltet "nur" 100 Datensätze, mit denen wir beispielhaft arbeiten. In den Kapitel 7.4 und 7.5 werden wir dann die gelernten Transformationen auf alle 450.000 Datensätze anwenden.
Alle folgenden Übungen in den Kapiteln 7.1 bis 7.3 führen wir zunächst mit einer einzigen Datei aus dem Download durch. Diese Datei beinhaltet "nur" 100 Datensätze, mit denen wir beispielhaft arbeiten. In den Kapiteln 7.4 und 7.5 werden wir dann die gelernten Transformationen auf alle 450.000 Datensätze anwenden.
OpenRefine "versteht" das MARC-Format nicht. Es interpretiert die Daten daher genauso wie jede andere XML-Datei. Wenn Sie die Daten erstmalig in OpenRefine öffnen, sehen Sie daher die üblichen Nummern und Codes für die jeweiligen MARC-Felder in der Baumstruktur der XML-Datei. Die Bedeutung der MARC-Nummern und Codes müssen Sie nachschlagen. Der GBV bietet meines Wissens nach keine Beschreibung der Feldbelegungen an. Zur Orientierung können Sie die [Arbeitstabelle der Deutschen Nationalbibliothek](http://www.dnb.de/SharedDocs/Downloads/DE/DNB/standardisierung/marc21FeldbeschreibungTitelExcel032016.zip) in der [Dokumentation des MARC21-Formats](http://www.dnb.de/DE/Standardisierung/Formate/MARC21/marc21_node.html) verwenden.

View File

@ -22,12 +22,16 @@ Spalten ordnen
Angabe in Spalte record-leader durch PPN aus Spalte "record - controlfield" ersetzen
* {%s%}Modus "rows" auswählen (falls nicht vorausgewählt){%ends%}
* {%s%}Spalte "record - controlfield - tag" / Facet / Text Facet / Wert 001 auswählen{%ends%}
* {%s%}Spalte "record - leader" / Edit cells / Transform... und folgenden Wert eingeben: cells["record - controlfield"].value{%ends%}
* {%s%}Facette schließen{%ends%}
Leere Zeilen löschen
Überflüssige Zeilen löschen
* {%s%}Spalte "record - datafield - subfield" / Facet / Customized facets / Facet by blank / Wert true anklicken (Achtung: im Modus "rows" und vorige Facette wieder schließen){%ends%}
* {%s%}Spalte "record - datafield - subfield" / Facet / Customized facets / Facet by blank / Wert true anklicken{%ends%}
* {%s%}All / Edit rows / Remove all matching rows{%ends%}
* {%s%}Facette schließen{%ends%}
* {%s%}Modus "records" auswählen{%ends%}
Records anklicken
OpenRefine erkennt jetzt die Datensätze anhand der PPN.

View File

@ -17,7 +17,9 @@ sudo docker run --rm -p 8888:3333 -v /home/stud/refine:/data felixlohmeier/openr
## Vorgehen
Schritt 1: Alle Schritte aus [Übung 7.2](https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/07_2_records_bilden.html)
Beenden Sie zunächst OpenRefine auf der Kommandozeile (mit ```STRG+C```) und starten Sie die Version ```2.6rc1``` von OpenRefine mit dem obigen Befehl. Da der Container mit der anderen Version von OpenRefine erst heruntergeladen werden muss, dauert das einen Moment länger. Anschließend können Sie OpenRefine wie gewohnt im Browser öffnen.
Schritt 1: Öffnen Sie das in Kapitel 7.2 erstellte Projekt. Wechseln Sie dazu auf die Startseite von OpenRefine und klicken Sie im Menü "Open Project" das Projekt an.
Schritt 2: Vorerst nicht benötigte Spalten löschen
@ -30,16 +32,16 @@ Schritt 3: MARC-Felder durchgängig belegen
Schritt 4: PPN aus Spalte record-leader in Spalte mit MARC-Feldern verschieben (und dafür eine neue Zeile einfügen)
* Spalte "record - leader" / Add Column based on this column...; Name für neue Spalte: NEU
* Spalte "record - leader" / Transpose / Transpose cells across columns into Rows; In der zweiten Feldliste Spalte "NEU" ganz oben auswählen, rechts "One column" auswählen und Name "PPN" eingeben
* Spalte "record - datafield - tag" / Facet / Customized facets / Facet by blank / Wert true auswählen und in Modus "rows" wechseln
* Spalte "record - datafield - tag" / Edit cells / Transform... / Wert "001" (also mit Anführungszeichen) eingeben und Facette schließen
* Spalte "record - datafield - tag" / Facet / Text facet / Wert 001 auswählen
* Spalte "record - datafield - subfield" / Edit cells / Transform... / Wert cells["PPN"].value eingeben und Facette schließen
* Spalte "record - leader" / Add Column based on this column...; Name für neue Spalte: ```NEU```
* Spalte "record - leader" / Transpose / Transpose cells across columns into Rows; In der zweiten Feldliste Spalte ```NEU``` ganz oben auswählen, rechts die Option "One column" auswählen und Name ```PPN``` eingeben
* Spalte "record - datafield - tag" / Facet / Customized facets / Facet by blank / Wert ```true``` auswählen und in Modus "rows" wechseln
* Spalte "record - datafield - tag" / Edit cells / Transform... / Wert ```"001"``` (also mit Anführungszeichen) eingeben und Facette schließen
* Spalte "record - datafield - tag" / Facet / Text facet / Wert ```001``` auswählen
* Spalte "record - datafield - subfield" / Edit cells / Transform... / Wert ```cells["PPN"].value``` eingeben und Facette schließen
Schritt 5: MARC-Feld mit Feld MARC-Code zusammenfassen
* Spalte "record - datafield - tag" / Edit cells / Transform... den Wert value + " : " + cells["record - datafield - subfield - code"].value eingeben
* Spalte "record - datafield - tag" / Edit cells / Transform... den Wert ```value + " : " + cells["record - datafield - subfield - code"].value``` eingeben
* Spalte "record - datafield - subfield - code" / Edit column / Remove this column
Schritt 6: Sortieren und Aufräumen
@ -53,12 +55,17 @@ Schritt 6: Sortieren und Aufräumen
Schritt 7: Felder mit Mehrfachbelegungen zusammenführen
* Spalte "record - datafield - tag" / Edit cells / Blank down
* Spalte "record - datafield - subfield" / Join multi-valued cells und als Trennzeichen ␟ angeben (das Trennzeichen [Unit Separator ␟](http://unicode-table.com/en/241F/) aus dem Unicode-Zeichensatz kommt mit Sicherheit nicht in den Daten vor, daher ist dieses gut geeignet. Das Zeichen ist am einfachsten per copy & paste einzufügen).
* Spalte "record - datafield - subfield" / Join multi-valued cells und als Trennzeichen `````` angeben (das Trennzeichen [Unit Separator ␟](http://unicode-table.com/en/241F/) aus dem Unicode-Zeichensatz kommt mit Sicherheit nicht in den Daten vor, daher ist dieses gut geeignet. Das Zeichen ist am einfachsten per copy & paste einzufügen).
Schritt 8: Transpose
* Spalte "record - datafield - tag" / Transpose / Columnize by key/value columns...
Schritt 9: Leere Zeile löschen
* Spalte "001" / Facet / Customized facets / Facet by blank / Wert ```true``` auswählen
* All / Edit rows / Remove all matching rows und Facette schließen
## Literatur
* [How can I join two datasets using a key in OpenRefine, with the secondary table having more than one value?](http://www.devsplanet.com/question/35776263) und [Cells to columns in OpenRefine](http://stackoverflow.com/questions/15187543/cells-to-columns-in-openrefine)

View File

@ -18,6 +18,7 @@ Transformationsregeln extrahieren (altes Projekt):
Transformationsregeln anwenden (neues Projekt):
* Neues Projekt erstellen wie in [Kapitel 6.3 Aufgabe 2](https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/06_3_openrefine_starten_und_daten_laden.html) beschrieben
* {%s%}Oben links Menü Undo / Redo den Button Apply... drücken{%ends%}
* {%s%}Den Inhalt der Zwischenablage einfügen (z.B. mit STRG+V) und den Button Perform Operations drücken.{%ends%}

View File

@ -14,26 +14,29 @@ sudo docker run --rm -p 8888:3333 -v /home/stud/refine:/data felixlohmeier/openr
## Lösung
Putty zweimal starten und jeweils per SSH verbinden:
Terminal 1: Beenden Sie zunächst OpenRefine auf der Kommandozeile (mit ```STRG+C```) und starten Sie die Version ```2.6rc2``` von OpenRefine mit dem obigen Befehl.
* Terminal 1: {%s%}top eingeben und mehrfach > drücken, um die Sortierung bis zur Spalte RES zu verschieben. Die Spalte RES zeigt den Ressourcenverbrauch an Arbeitsspeicher für jeden Prozess. Wenn OpenRefine wie oben im Docker Startbefehl 3GB zugeteilt sind, dann darf diese Angabe niemals 3,0g überschreiten.{%ends%}
* Terminal 2: {%s%}sudo docker run --name=refine-server --rm -p 8888:3333 -v /home/stud/refine:/data felixlohmeier/openrefine:2.6rc2 -i 0.0.0.0 -m 3G -d /data{%ends%}
Starten Sie dann ein zweites Putty (Windows) bzw. ein zweites Terminal (Mac, Linux) und bauen Sie auch dort wie gewohnt eine SSH-Verbindung zum Webserver auf. Der Webserver erlaubt mehrere Logins mit dem gleichen Benutzernamen. Wenn Sie ```w``` eintippen, sehen Sie, dass zwei Verbindungen mit ```stud``` aufgebaut sind.
Terminal 2: {%s%}top eingeben und mehrfach > drücken, um die Sortierung bis zur Spalte RES zu verschieben. Die Spalte RES zeigt den Ressourcenverbrauch an Arbeitsspeicher für jeden Prozess. Wenn OpenRefine wie oben im Docker Startbefehl 3GB zugeteilt sind, dann darf diese Angabe niemals 3,0g überschreiten.{%ends%}
In der grafischen Oberfläche von OpenRefine:
* {%s%}Rufen Sie OpenRefine im Browser neu auf oder drücken Sie den Reload-Button im Browser, bis unten links bei der Version ```2.6-rc.2 [TRUNK]``` steht.{%ends%}
* {%s%}Create Project / Durchsuchen... / 100 Dateien auswählen / Next / Configure Parsing Options{%ends%}
* {%s%}Parse data as XML files{%ends%}
* {%s%}In der Vorschauansicht an die Stelle record xmlns="http://www.loc.gov/MARC21/slim" klicken{%ends%}
* {%s%}Checkbox "Store file source..." deaktivieren / Projektnamen vergeben und Button "Create Project" drücken{%ends%}
* {%s%}Checkbox "Store file source..." deaktivieren / Projektnamen vergeben (z.B. "100x marcxml") und Button "Create Project" drücken{%ends%}
Den Verbrauch an Arbeitsspeicher sehen Sie in Terminal 2 in ```top``` (etwa 700000 = 0,7 GB)
Das Ergebnis sehen Sie in in Terminal 1 in ```top``` (etwa 0,7 GB)
## Aufgabe 2: Wenden Sie die Transformationsregeln aus Kapitel 7.3 auf das neue Projekt an und beobachten Sie den Speicherbedarf
Hinweise:
* Beobachten Sie auch hier den Speicherbedarf während der Transformation. Beenden Sie anschließend den Docker-Container mit OpenRefine, starten Sie ihn neu und laden anschließend noch einmal das transformierte Projekt. Prüfen Sie erneut den Speicherbedarf.
* Nutzen Sie Ihre gespeicherten Transformationsregeln oder die aus der Datei [07_3.json](https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/openrefine/07_3.json)
* Nutzen Sie Ihre gespeicherten Transformationsregeln oder die aus der Datei [07_3.json](https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/openrefine/07_3.json). Achtung: Der Firefox-Browser hat unter Windows Probleme bei der Anzeige von Sonderzeichen (hier das verwendete Unit-Separator-Zeichen). Verwenden Sie daher unter Windows den Chrome-Browser zur Anzeige der Datei mit den Transformationsregeln.
* In der Version 2.6rc2 von OpenRefine ist ein [Bug in der Funktion Columnize by key/value columns](https://github.com/OpenRefine/OpenRefine/issues/1093), daher müssen wir für diese Aufgabe die Version 2.6rc1 oder die aktuelle Entwicklungsversion nutzen.
```
@ -42,21 +45,24 @@ sudo docker run --rm -p 8888:3333 -v /home/stud/refine:/data felixlohmeier/openr
## Lösung
Putty zweimal starten und jeweils per SSH verbinden:
Terminal 1: {%s%}Beenden Sie zunächst OpenRefine auf der Kommandozeile (mit ```STRG+C```) und starten Sie die Version ```2.6rc1``` von OpenRefine mit dem obigen Befehl.{%ends%}
* Terminal 1: {%s%}top eingeben und mehrfach > drücken, um die Sortierung bis zur Spalte RES zu verschieben. Die Spalte RES zeigt den Ressourcenverbrauch an Arbeitsspeicher für jeden Prozess. Wenn OpenRefine wie oben im Docker Startbefehl 3GB zugeteilt sind, dann darf diese Angabe niemals 3,0g überschreiten.{%ends%}
* Terminal 2: {%s%}sudo docker run --name=refine-server --rm -p 8888:3333 -v /home/stud/refine:/data felixlohmeier/openrefine:2.6rc2 -i 0.0.0.0 -m 3G -d /data{%ends%}
Terminal 2: {%s%}top eingeben und mehrfach > drücken, um die Sortierung bis zur Spalte RES zu verschieben (falls es nicht mehr läuft){%ends%}
In OpenRefine Projekt aus Aufgabe 1 laden und...
In der grafischen Oberfläche von OpenRefine:
* {%s%}Rufen Sie OpenRefine im Browser neu auf. Unten links sollte jetzt die Version ```2.6-rc1 [TRUNK]``` stehen.{%ends%}
* {%s%}Unter "Open Project" das in Aufgabe 1 erstellte Projekt öffnen (z.B. "100x marcxml"){%ends%}
* {%s%}Menü oben links "Undo / Redo" aufrufen und Button "Apply..." drücken {%ends%}
* {%s%}Den Inhalt aus der Datei 07_3.json in die Zwischenablage kopieren und in das Textfeld von "Apply" einfügen und Button "Perform Operations" drücken{%ends%}
* {%s%}Den Inhalt aus der Datei 07_3.json (siehe Link oben) in die Zwischenablage kopieren und in das Textfeld von "Apply" einfügen und Button "Perform Operations" drücken{%ends%}
Das Ergebnis sehen Sie in Terminal 1 in ```top``` (etwa 1,5 GB). Wenn Sie den Docker-Container neu starten und das fertig transformierte Projekt laden, dann wird weniger Arbeitsspeicher verbraucht (nur etwa 0,25 GB). Die Transformation der Daten hat also zu einem geringeren Ressourcenverbrauch geführt.
Das Ergebnis sehen Sie in Terminal 2 in ```top``` (etwa 1,6 GB). Wenn Sie den Docker-Container neu starten und das fertig transformierte Projekt laden, dann wird weniger Arbeitsspeicher verbraucht (nur etwa 0,25 GB). Die Transformation der Daten hat also zu einem geringeren Ressourcenverbrauch geführt.
## Aufgabe 3: Erstellen Sie Projekte für alle 4.500 Dateien in geeigneten Paketgrößen
Die Erledigung dieser Aufgabe dauert etwa 2-3 Stunden, weil viel manuelle Arbeit erforderlich ist. In Kapitel 7.8 lernen Sie später Möglichkeiten zur Automatisierung kennen.
Hinweise:
* Für das Projekt erstellen müssen Sie wieder die Version 2.6rc2 verwenden, wie in Aufgabe 1.
@ -66,21 +72,23 @@ Hinweise:
## Lösung
* Empfohlene Paketgröße: {%s%}30 Projekte mit je 150 Dateien bei 3GB Arbeitsspeicher für OpenRefine{%ends%}
* Server starten: {%s%}sudo docker run --name=refine-server --rm -p 8888:3333 -v /home/stud/refine:/data felixlohmeier/openrefine:2.6rc2 -i 0.0.0.0 -m 3G -d /data{%ends%}
Empfohlene Paketgröße: {%s%}45 Projekte mit je 100 Dateien bei 3GB Arbeitsspeicher für OpenRefine{%ends%}
Projekte erstellen:
Terminal 1: {%s%}sudo docker run --rm -p 8888:3333 -v /home/stud/refine:/data felixlohmeier/openrefine:2.6rc2 -i 0.0.0.0 -m 3G -d /data{%ends%}
* {%s%}Create Project / Durchsuchen... / 150 Dateien auswählen / Next / Configure Parsing Options{%ends%}
In der grafischen Oberfläche von OpenRefine:
* {%s%}Create Project / Durchsuchen... / 100 Dateien auswählen / Next / Configure Parsing Options{%ends%}
* {%s%}Parse data as XML files{%ends%}
* {%s%}In der Vorschauansicht an die Stelle record xmlns="http://www.loc.gov/MARC21/slim" klicken{%ends%}
* {%s%}Checkbox "Store file source..." deaktivieren / Zweite Zahl im Projektnamen anpassen und Button "Create Project" drücken{%ends%}
* {%s%}Checkbox "Store file source..." deaktivieren / Zweite Zahl im Projektnamen anpassen (um den Abschnitt eindeutig zu benennen, z.B. "haw_2016 10 25_000001 010000 marcxml") und Button "Create Project" drücken{%ends%}
## Aufgabe 4: Wenden Sie die Transformationsregeln aus Kapitel 7.3 auf alle in Aufgabe 3 erstellten Projekte an
## Aufgabe 4: Wenden Sie die Transformationsregeln aus Kapitel 7.3 auf alle in Aufgabe 3 erstellten Projekte an und exportieren Sie die Projekte einzeln als TSV
Hinweise:
* Für das Anwenden der Transformationen müssen Sie die Version 2.6rc1 verwenden, wie in Aufgabe 2.
* Wählen Sie das Format Tab separated value (TSV) im Export-Menü oben rechts.
* Da Sie die viele Klickarbeit aus Aufgabe 3 bestimmt nicht wiederholen wollen, erstellen Sie zunächst eine Sicherheitskopie der Daten. Beenden Sie dazu den Dockercontainer und führen Sie den folgenden Kopierbefehl aus:
```
@ -98,18 +106,29 @@ cp -r refine-backup_07_5-3 refine
In OpenRefine Projekte nacheinander laden und jeweils...
* Menü oben links "Undo / Redo" aufrufen und Button "Apply..." drücken.
* Den Inhalt aus der Datei [07_3.json](https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/openrefine/07_3.json) in die Zwischenablage kopieren und in das Textfeld von "Apply" einfügen und Button "Perform Operations" drücken.
1. Transformationsregeln anwenden
## Aufgabe 5: Alle Projekte einzeln als TSV exportieren
* Menü oben links "Undo / Redo" aufrufen und Button "Apply..." drücken.
* Den Inhalt aus der Datei [07_3.json](https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/openrefine/07_3.json) in die Zwischenablage kopieren und in das Textfeld von "Apply" einfügen und Button "Perform Operations" drücken. Achtung: Der Firefox-Browser hat unter Windows Probleme bei der Anzeige von Sonderzeichen (hier das verwendete Unit-Separator-Zeichen). Verwenden Sie daher unter Windows den Chrome-Browser zur Anzeige der Datei mit den Transformationsregeln.
2. Projekt als TSV exportieren
* Menü oben rechts Export / "Tab separated value" wählen. Der Download sollte automatisch beginnen. Speichern Sie die Daten lokal in einem beliebigen Verzeichnis.{%ends%}
## Aufgabe 5: Heruntergeladene TSV-Dateien auf den Webserver laden
Hinweise:
* Wählen Sie das Format Tab separated value (TSV) im Export-Menü oben rechts.
* Verwenden Sie ```SCP``` wie in [Kapitel 6.3 Aufgabe 1](https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/06_3_openrefine_starten_und_daten_laden.html)
* Legen Sie die Dateien in einem neuen Order ```tsv``` ab.
## Lösung
Lösung:
* Terminal auf der VM: {%s%}Neuen Ordner tsv anlegen, beispielsweise mit dem Befehl cd ~ && mkdir tsv{%ends%}
* Variante Windows: {%s%}WinSCP.exe starten, Protokoll SCP auswählen, in das Feld "Host name" die IP-Adresse eingeben, Benutzername und Passwort eingeben und Login anklicken. Links das Verzeichnis mit den TSV-Dateien auswählen. Rechts einen neuen Ordner "tsv" anlegen und in das Verzeichnis wechseln. TSV-Dateien auswählen und per Drag & Drop von links nach rechts schieben.{%ends%}
* Variante Mac/Linux: {%s%}Terminal auf dem Betriebssystem (nicht auf der virtuellen Maschine) starten. In das Verzeichnis mit den TSV-Dateien wechseln. Folgenden Befehl eingeben: scp *.tsv stud@192.168.1.1:tsv/{%ends%}
* {%s%}Projekte nacheinander in OpenRefine laden und im Menü oben rechts Export / "Tab separated value" wählen. Der Download sollte automatisch beginnen. Speichern Sie die Daten lokal in einem beliebigen Verzeichnis.{%ends%}
## Aufgabe 6: Spalten einheitlich sortieren (und nicht benötigte MARC-Felder löschen)
@ -183,7 +202,7 @@ In OpenRefine Projekte nacheinander laden und jeweils...
Projekte nacheinander in OpenRefine laden und im Menü oben rechts Export / "Tab separated value" wählen. Der Download sollte automatisch beginnen. Speichern Sie die Daten lokal in einem beliebigen Verzeichnis.
Wenn Sie die exportierten Dateien wieder mit mit ```head -n1 *.tsv``` prüfen, dann werden Sie feststellen, dass nur diejenigen Spalten im Export enthalten sind, in denen auch tatsächlich Felder belegt sind.
Wenn Sie die neu exportierten Dateien wie in Aufgabe 5 auf den Webserver laden und wieder mit ```head -n1 *.tsv``` prüfen, dann werden Sie feststellen, dass nur diejenigen Spalten im Export enthalten sind, in denen auch tatsächlich Felder belegt sind.
## Aufgabe 7: Neues Projekt aus den TSV Dateien erstellen

View File

@ -19,17 +19,12 @@
"op": "core/text-transform",
"description": "Text transform on cells in column record - leader using expression grel:cells[\"record - controlfield\"].value",
"engineConfig": {
"mode": "row-based",
"facets": [
{
"expression": "value",
"invert": false,
"selectError": false,
"omitError": false,
"name": "record - controlfield - tag",
"expression": "value",
"selectBlank": false,
"columnName": "record - controlfield - tag",
"omitBlank": false,
"type": "list",
"selection": [
{
"v": {
@ -37,10 +32,15 @@
"l": "001"
}
}
]
],
"selectError": false,
"invert": false,
"name": "record - controlfield - tag",
"omitBlank": false,
"type": "list",
"columnName": "record - controlfield - tag"
}
],
"mode": "row-based"
]
},
"columnName": "record - leader",
"expression": "grel:cells[\"record - controlfield\"].value",
@ -52,17 +52,12 @@
"op": "core/row-removal",
"description": "Remove rows",
"engineConfig": {
"mode": "row-based",
"facets": [
{
"expression": "isBlank(value)",
"invert": false,
"selectError": false,
"omitError": false,
"name": "record - datafield - subfield",
"expression": "isBlank(value)",
"selectBlank": false,
"columnName": "record - datafield - subfield",
"omitBlank": false,
"type": "list",
"selection": [
{
"v": {
@ -70,10 +65,15 @@
"l": "true"
}
}
]
],
"selectError": false,
"invert": false,
"name": "record - datafield - subfield",
"omitBlank": false,
"type": "list",
"columnName": "record - datafield - subfield"
}
],
"mode": "row-based"
]
}
},
{
@ -90,8 +90,8 @@
"op": "core/fill-down",
"description": "Fill down cells in column record - datafield - tag",
"engineConfig": {
"facets": [],
"mode": "row-based"
"mode": "row-based",
"facets": []
},
"columnName": "record - datafield - tag"
},
@ -99,8 +99,8 @@
"op": "core/column-addition",
"description": "Create column NEU at index 1 based on column record - leader using expression grel:value",
"engineConfig": {
"facets": [],
"mode": "row-based"
"mode": "row-based",
"facets": []
},
"newColumnName": "NEU",
"columnInsertIndex": 1,
@ -123,17 +123,12 @@
"op": "core/text-transform",
"description": "Text transform on cells in column record - datafield - tag using expression grel:\"001\"",
"engineConfig": {
"mode": "row-based",
"facets": [
{
"expression": "isBlank(value)",
"invert": false,
"selectError": false,
"omitError": false,
"name": "record - datafield - tag",
"expression": "isBlank(value)",
"selectBlank": false,
"columnName": "record - datafield - tag",
"omitBlank": false,
"type": "list",
"selection": [
{
"v": {
@ -141,10 +136,15 @@
"l": "true"
}
}
]
],
"selectError": false,
"invert": false,
"name": "record - datafield - tag",
"omitBlank": false,
"type": "list",
"columnName": "record - datafield - tag"
}
],
"mode": "row-based"
]
},
"columnName": "record - datafield - tag",
"expression": "grel:\"001\"",
@ -156,17 +156,12 @@
"op": "core/text-transform",
"description": "Text transform on cells in column record - datafield - subfield using expression grel:cells[\"PPN\"].value",
"engineConfig": {
"mode": "row-based",
"facets": [
{
"expression": "value",
"invert": false,
"selectError": false,
"omitError": false,
"name": "record - datafield - tag",
"expression": "value",
"selectBlank": false,
"columnName": "record - datafield - tag",
"omitBlank": false,
"type": "list",
"selection": [
{
"v": {
@ -174,10 +169,15 @@
"l": "001"
}
}
]
],
"selectError": false,
"invert": false,
"name": "record - datafield - tag",
"omitBlank": false,
"type": "list",
"columnName": "record - datafield - tag"
}
],
"mode": "row-based"
]
},
"columnName": "record - datafield - subfield",
"expression": "grel:cells[\"PPN\"].value",
@ -185,21 +185,12 @@
"repeat": false,
"repeatCount": 10
},
{
"op": "core/fill-down",
"description": "Fill down cells in column PPN",
"engineConfig": {
"facets": [],
"mode": "row-based"
},
"columnName": "PPN"
},
{
"op": "core/text-transform",
"description": "Text transform on cells in column record - datafield - tag using expression grel:value + \" : \" + cells[\"record - datafield - subfield - code\"].value",
"engineConfig": {
"facets": [],
"mode": "row-based"
"mode": "row-based",
"facets": []
},
"columnName": "record - datafield - tag",
"expression": "grel:value + \" : \" + cells[\"record - datafield - subfield - code\"].value",
@ -212,6 +203,15 @@
"description": "Remove column record - datafield - subfield - code",
"columnName": "record - datafield - subfield - code"
},
{
"op": "core/fill-down",
"description": "Fill down cells in column PPN",
"engineConfig": {
"mode": "row-based",
"facets": []
},
"columnName": "PPN"
},
{
"op": "core/row-reorder",
"description": "Reorder rows",
@ -219,20 +219,20 @@
"sorting": {
"criteria": [
{
"reverse": false,
"errorPosition": 1,
"caseSensitive": false,
"column": "PPN",
"valueType": "string",
"column": "PPN",
"blankPosition": 2,
"errorPosition": 1
"reverse": false
},
{
"reverse": false,
"errorPosition": 1,
"caseSensitive": false,
"column": "record - datafield - tag",
"valueType": "string",
"column": "record - datafield - tag",
"blankPosition": 2,
"errorPosition": 1
"reverse": false
}
]
}
@ -246,8 +246,8 @@
"op": "core/blank-down",
"description": "Blank down cells in column record - datafield - tag",
"engineConfig": {
"facets": [],
"mode": "row-based"
"mode": "row-based",
"facets": []
},
"columnName": "record - datafield - tag"
},
@ -264,5 +264,33 @@
"keyColumnName": "record - datafield - tag",
"valueColumnName": "record - datafield - subfield",
"noteColumnName": ""
},
{
"op": "core/row-removal",
"description": "Remove rows",
"engineConfig": {
"mode": "record-based",
"facets": [
{
"omitError": false,
"expression": "isBlank(value)",
"selectBlank": false,
"selection": [
{
"v": {
"v": true,
"l": "true"
}
}
],
"selectError": false,
"invert": false,
"name": "001",
"omitBlank": false,
"type": "list",
"columnName": "001"
}
]
}
}
]