From d35e2937adc5da81fc773879728c8aa7d306cf97 Mon Sep 17 00:00:00 2001 From: Felix Lohmeier Date: Tue, 3 Jan 2017 20:08:25 +0100 Subject: [PATCH] =?UTF-8?q?Nachtr=C3=A4ge=20zu=20Kapitel=207.1=20bis=207.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 07_1_facetten_und_text_filter.md | 2 +- 07_2_records_bilden.md | 10 +- 07_3_fuer_jedes_marc-feld_eine_spalte.md | 25 ++-- 07_4_transformationen_anwenden.md | 1 + 07_5_alle_daten_in_ein_projekt_laden.md | 69 ++++++---- openrefine/07_3.json | 154 +++++++++++++---------- 6 files changed, 160 insertions(+), 101 deletions(-) diff --git a/07_1_facetten_und_text_filter.md b/07_1_facetten_und_text_filter.md index cf8079a..89b7770 100644 --- a/07_1_facetten_und_text_filter.md +++ b/07_1_facetten_und_text_filter.md @@ -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. diff --git a/07_2_records_bilden.md b/07_2_records_bilden.md index d239bb4..720cf5b 100644 --- a/07_2_records_bilden.md +++ b/07_2_records_bilden.md @@ -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 \ No newline at end of file +OpenRefine erkennt jetzt die Datensätze anhand der PPN. \ No newline at end of file diff --git a/07_3_fuer_jedes_marc-feld_eine_spalte.md b/07_3_fuer_jedes_marc-feld_eine_spalte.md index 9f5d2a3..18d7714 100644 --- a/07_3_fuer_jedes_marc-feld_eine_spalte.md +++ b/07_3_fuer_jedes_marc-feld_eine_spalte.md @@ -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) diff --git a/07_4_transformationen_anwenden.md b/07_4_transformationen_anwenden.md index b8e9895..9a26540 100644 --- a/07_4_transformationen_anwenden.md +++ b/07_4_transformationen_anwenden.md @@ -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%} diff --git a/07_5_alle_daten_in_ein_projekt_laden.md b/07_5_alle_daten_in_ein_projekt_laden.md index 57b18e0..92f1211 100644 --- a/07_5_alle_daten_in_ein_projekt_laden.md +++ b/07_5_alle_daten_in_ein_projekt_laden.md @@ -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 diff --git a/openrefine/07_3.json b/openrefine/07_3.json index fffc5ef..1adf36f 100644 --- a/openrefine/07_3.json +++ b/openrefine/07_3.json @@ -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" + } + ] + } } ]