diff --git a/07_3_fuer_jedes_marc-feld_eine_spalte.md b/07_3_fuer_jedes_marc-feld_eine_spalte.md index 2c9f009..b8b2902 100644 --- a/07_3_fuer_jedes_marc-feld_eine_spalte.md +++ b/07_3_fuer_jedes_marc-feld_eine_spalte.md @@ -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%} \ No newline at end of file diff --git a/07_4_transformationen_anwenden.md b/07_4_transformationen_anwenden.md index edcab53..85007d2 100644 --- a/07_4_transformationen_anwenden.md +++ b/07_4_transformationen_anwenden.md @@ -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%} \ No newline at end of file +* [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) \ No newline at end of file diff --git a/07_5_alle_daten_in_ein_projekt_laden.md b/07_5_alle_daten_in_ein_projekt_laden.md index f90a183..250846c 100644 --- a/07_5_alle_daten_in_ein_projekt_laden.md +++ b/07_5_alle_daten_in_ein_projekt_laden.md @@ -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%} \ No newline at end of file +* 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". \ No newline at end of file diff --git a/json-history/07_3.json b/json-history/07_3.json new file mode 100644 index 0000000..fffc5ef --- /dev/null +++ b/json-history/07_3.json @@ -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": "" + } +]