Nachtrag zum Seminar 14.11.

This commit is contained in:
Felix Lohmeier 2016-11-14 21:41:34 +01:00
parent ac8a409a49
commit 623fda70a0
4 changed files with 320 additions and 104 deletions

View File

@ -1,59 +1,62 @@
# 7.3 Für jedes MARC-Feld eine Spalte
## Aufgabe: Transformieren Sie die Daten so, dass jeder Datensatz nur über eine Zeile geht
Aktuell sind die Inhalte eines Datensatzes über viele Zeilen verteilt. Die MARC-Felder stehen untereinander in Zeilen. Versuchen Sie, die Daten in eine übliche Tabellenstruktur zu bringen:
Aktuell sind die Inhalte eines Datensatzes über viele Zeilen verteilt. Die MARC-Felder stehen untereinander in Zeilen. Wir transformieren die Daten nun so, dass die Daten wie in einer üblichen Tabelle strukturiert sind, d.h.:
* Die MARC-Felder in den Spaltenüberschriften.
* Jeder Datensatz nur über eine Zeile.
Hinweise:
* Experimentieren Sie mit den Funktionen im Menü "Transpose".
* Vor dem Transpose sollten Sie die Daten in wenige Spalten zusammenführen. Nutzen Sie dazu die folgende Transformationsregel: ```value + " : " + cells["NAME-DER-SPALTE"].value```
* Wir nutzen dazu die Funktion "Transpose / Columnize by key/value columns". In der Version 2.6rc2 von OpenRefine ist ein Bug in dieser Funktion, daher müssen wir die Version 2.6rc1 nutzen.
* Vor dem Transpose müssen die Daten in zwei Spalten zusammengeführt werden
* Für manche zeilenbasierte Operationen müssen Sie wieder auf den Modus "Rows" (statt "Records") wechseln.
Literatur:
## Vorgehen
1. Alle Schritte aus [Übung 7.2](https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/07_2_records_bilden.html)
2. Vorerst nicht benötigte Spalten löschen
* All / Edit columns / Re-order / remove columns...
* Spalten "record", "record - datafield", "record - datafield - ind1", "record - datafield - ind2" "record-controlfield" und "record-controlfield-tag" nach rechts schieben
3. MARC-Felder durchgängig belegen
* Spalte "record - datafield - tag" / Edit cells / Fill down
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
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 - subfield - code" / Edit column / Remove this column
6. Sortieren und Aufräumen
* Spalte "PPN" / Edit cells / Fill down
* Spalte "PPN" / Sort...
* Spalte "record - datafield - tag" / Sort...
* Im neu verfügbaren Menü "Sort" den Menüpunkt "Reorder rows permanently" auswählen
* Spalte "PPN" / Edit column / Remove this column
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).
8. Transpose
* Spalte "record - datafield - tag" / Transpose / Columnize by key/value columns...
## 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)
* [Zellen zusammenführen](http://kb.refinepro.com/2011/07/merge-2-columns-that-have-both-blank.html)
* [Trick, um neue Zeilen einzufügen](http://kb.refinepro.com/2011/12/add-extra-rows-records-in-google-refine.html)
## Lösung
Alle Schritte aus [Übung 7.2](https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/07_2_records_bilden.html)
Vorerst nicht benötigte Spalten löschen
* {%s%}All / Edit columns / Re-order / remove columns...{%ends%}
* {%s%}Spalten "record", "record - datafield", "record - datafield - ind1", "record - datafield - ind2" "record-controlfield" und "record-controlfield-tag" nach rechts schieben{%ends%}
MARC-Felder durchgängig belegen
* {%s%}Spalte "record - datafield - tag" / Edit cells / Fill down{%ends%}
PPN aus Spalte record-leader in Spalte mit MARC-Feldern verschieben (und dafür eine neue Zeile einfügen)
* {%s%}Spalte "record - leader" / Add Column based on this column...; Name für neue Spalte: NEU{%ends%}
* {%s%}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{%ends%}
* {%s%}Spalte "record - datafield - tag" / Facet / Customized facets / Facet by blank / Wert true auswählen und in Modus "rows" wechseln{%ends%}
* {%s%}Spalte "record - datafield - tag" / Edit cells / Transform... / Wert "001" (also mit Anführungszeichen) eingeben und Facette schließen{%ends%}
* {%s%}Spalte "record - datafield - tag" / Facet / Text facet / Wert 001 auswählen{%ends%}
* {%s%}Spalte "record - datafield - subfield" / Edit cells / Transform... / Wert cells["PPN"].value eingeben und Facette schließen{%ends%}
Sortieren und Aufräumen
* {%s%}Spalte "PPN" / Edit cells / Fill down{%ends%}
* {%s%}Spalte "PPN" / Sort...{%ends%}
* {%s%}Spalte "record - datafield - tag" / Sort...{%ends%}
* {%s%}Im neu verfügbaren Menü "Sort" den Menüpunkt "Reorder rows permanently" auswählen{%ends%}
* {%s%}Spalte "PPN" / Edit column / Remove this column{%ends%}
MARC-Feld mit Feld MARC-Code zusammenfassen
* {%s%}Spalte "record - datafield - tag" / Edit cells / Transform... den Wert value + " : " + cells["record - datafield - subfield - code"].value eingeben{%ends%}
* {%s%}Spalte "record - datafield - subfield - code" / Edit column / Remove this column{%ends%}
Transpose
* {%s%}Spalte "record - datafield - tag" / Transpose / Columnize by key/value columns...{%ends%}

View File

@ -6,23 +6,9 @@ OpenRefine verfügt über hilfreiche Undo/Redo-Funktionen, mit denen Sie auch al
Hinweise:
* Nutzen Sie die Funktion "Extract" im Bereich Undo/Redo und speichern Sie die Regeln in einer Textdatei zwischen (z.B. mit Windows Editor)
* Nutzen Sie die Funktion "Extract" im Bereich Undo/Redo und speichern Sie die Regeln in einer Textdatei zwischen (z.B. mit Windows Editor). Wenden Sie diese anschließend über die Funktion "Apply" in einem neuen Projekt an.
Literatur:
* [History-Funktionen in OpenRefine Dokumentation](https://github.com/OpenRefine/OpenRefine/wiki/History)
* [JSON and my notepad or how to write script in google refine](http://kb.refinepro.com/2012/06/google-refine-json-and-my-notepad-or.html)
## Lösung
1) ...
* {%s%}...{%ends%}
2) ...
* {%s%}...{%ends%}
3) ...
* {%s%}...{%ends%}

View File

@ -7,55 +7,14 @@ Hinweise:
* Auf dem Webserver können mit Sie mit dem Befehl ```top``` die aktuellen Prozesse und deren Speicherbedarf sehen.
* Vermeiden Sie es, die Dateinamen von OpenRefine in den Daten speichern zu lassen. Dafür gibt es eine Checkbox beim Import.
## Lösung
1) ...
* {%s%}...{%ends%}
2) ...
* {%s%}...{%ends%}
3) ...
* {%s%}...{%ends%}
## Aufgabe 2: Wenden Sie die Transformationsregeln aus Kapitel 7.3 auf das neue Projekt an
Hinweise:
* Beobachten Sie auch hier den Speicherbedarf und notieren Sie sich die Laufzeit.
## Lösung
1) ...
* {%s%}...{%ends%}
2) ...
* {%s%}...{%ends%}
3) ...
* {%s%}...{%ends%}
* Nutzen Sie Ihre gespeicherten Transformationsregeln oder die aus der Datei [7-3.json](json-history/7-3.json)
## Aufgabe 3: Wenden Sie die Transformationsregeln aus Kapitel 7.3 auf alle 4500 Datensätze an
Hinweise:
* Am wenigsten klicken müssen Sie, wenn Sie alle 4500 Dateien auf einmal laden. Dann wird OpenRefine jedoch nicht genug Arbeitsspeicher zur Verfügung haben, um alle Transformationen durchzuführen.
* Machen Sie eine kleine Hochrechnung auf Basis des Speicherbedarfs aus Aufgabe 2, planen Sie mindestens 25% Reserve ein und wählen Sie auf dieser Basis die Größe ihrer "Pakete".
## Lösung
1) ...
* {%s%}...{%ends%}
2) ...
* {%s%}...{%ends%}
3) ...
* {%s%}...{%ends%}

268
json-history/07_3.json Normal file
View File

@ -0,0 +1,268 @@
[
{
"op": "core/column-reorder",
"description": "Reorder columns",
"columnNames": [
"record - leader",
"record",
"record - datafield",
"record - datafield - tag",
"record - datafield - ind1",
"record - datafield - ind2",
"record - datafield - subfield",
"record - datafield - subfield - code",
"record - controlfield",
"record - controlfield - tag"
]
},
{
"op": "core/text-transform",
"description": "Text transform on cells in column record - leader using expression grel:cells[\"record - controlfield\"].value",
"engineConfig": {
"facets": [
{
"expression": "value",
"invert": false,
"selectError": false,
"omitError": false,
"name": "record - controlfield - tag",
"selectBlank": false,
"columnName": "record - controlfield - tag",
"omitBlank": false,
"type": "list",
"selection": [
{
"v": {
"v": "001",
"l": "001"
}
}
]
}
],
"mode": "row-based"
},
"columnName": "record - leader",
"expression": "grel:cells[\"record - controlfield\"].value",
"onError": "keep-original",
"repeat": false,
"repeatCount": 10
},
{
"op": "core/row-removal",
"description": "Remove rows",
"engineConfig": {
"facets": [
{
"expression": "isBlank(value)",
"invert": false,
"selectError": false,
"omitError": false,
"name": "record - datafield - subfield",
"selectBlank": false,
"columnName": "record - datafield - subfield",
"omitBlank": false,
"type": "list",
"selection": [
{
"v": {
"v": true,
"l": "true"
}
}
]
}
],
"mode": "row-based"
}
},
{
"op": "core/column-reorder",
"description": "Reorder columns",
"columnNames": [
"record - leader",
"record - datafield - tag",
"record - datafield - subfield",
"record - datafield - subfield - code"
]
},
{
"op": "core/fill-down",
"description": "Fill down cells in column record - datafield - tag",
"engineConfig": {
"facets": [],
"mode": "row-based"
},
"columnName": "record - datafield - tag"
},
{
"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"
},
"newColumnName": "NEU",
"columnInsertIndex": 1,
"baseColumnName": "record - leader",
"expression": "grel:value",
"onError": "set-to-blank"
},
{
"op": "core/transpose-columns-into-rows",
"description": "Transpose cells in 2 column(s) starting with record - leader into rows in one new column named PPN",
"startColumnName": "record - leader",
"columnCount": 2,
"ignoreBlankCells": true,
"fillDown": false,
"combinedColumnName": "PPN",
"prependColumnName": false,
"separator": ":"
},
{
"op": "core/text-transform",
"description": "Text transform on cells in column record - datafield - tag using expression grel:\"001\"",
"engineConfig": {
"facets": [
{
"expression": "isBlank(value)",
"invert": false,
"selectError": false,
"omitError": false,
"name": "record - datafield - tag",
"selectBlank": false,
"columnName": "record - datafield - tag",
"omitBlank": false,
"type": "list",
"selection": [
{
"v": {
"v": true,
"l": "true"
}
}
]
}
],
"mode": "row-based"
},
"columnName": "record - datafield - tag",
"expression": "grel:\"001\"",
"onError": "keep-original",
"repeat": false,
"repeatCount": 10
},
{
"op": "core/text-transform",
"description": "Text transform on cells in column record - datafield - subfield using expression grel:cells[\"PPN\"].value",
"engineConfig": {
"facets": [
{
"expression": "value",
"invert": false,
"selectError": false,
"omitError": false,
"name": "record - datafield - tag",
"selectBlank": false,
"columnName": "record - datafield - tag",
"omitBlank": false,
"type": "list",
"selection": [
{
"v": {
"v": "001",
"l": "001"
}
}
]
}
],
"mode": "row-based"
},
"columnName": "record - datafield - subfield",
"expression": "grel:cells[\"PPN\"].value",
"onError": "keep-original",
"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"
},
"columnName": "record - datafield - tag",
"expression": "grel:value + \" : \" + cells[\"record - datafield - subfield - code\"].value",
"onError": "keep-original",
"repeat": false,
"repeatCount": 10
},
{
"op": "core/column-removal",
"description": "Remove column record - datafield - subfield - code",
"columnName": "record - datafield - subfield - code"
},
{
"op": "core/row-reorder",
"description": "Reorder rows",
"mode": "record-based",
"sorting": {
"criteria": [
{
"reverse": false,
"caseSensitive": false,
"column": "PPN",
"valueType": "string",
"blankPosition": 2,
"errorPosition": 1
},
{
"reverse": false,
"caseSensitive": false,
"column": "record - datafield - tag",
"valueType": "string",
"blankPosition": 2,
"errorPosition": 1
}
]
}
},
{
"op": "core/column-removal",
"description": "Remove column PPN",
"columnName": "PPN"
},
{
"op": "core/blank-down",
"description": "Blank down cells in column record - datafield - tag",
"engineConfig": {
"facets": [],
"mode": "row-based"
},
"columnName": "record - datafield - tag"
},
{
"op": "core/multivalued-cell-join",
"description": "Join multi-valued cells in column record - datafield - subfield",
"columnName": "record - datafield - subfield",
"keyColumnName": "record - datafield - tag",
"separator": "␟"
},
{
"op": "core/key-value-columnize",
"description": "Columnize by key column record - datafield - tag and value column record - datafield - subfield with note column ",
"keyColumnName": "record - datafield - tag",
"valueColumnName": "record - datafield - subfield",
"noteColumnName": ""
}
]