From 2a57f2b82e765ef02d1476011e150a07d7efa61f Mon Sep 17 00:00:00 2001 From: Felix Lohmeier Date: Mon, 21 Nov 2016 00:27:04 +0100 Subject: [PATCH] =?UTF-8?q?Kapitel=207.5=20und=207.6=20=C3=BCberarbeitet?= =?UTF-8?q?=20und=20neues=20Script=20count-tsv.sh=20erg=C3=A4nzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 07_5_alle_daten_in_ein_projekt_laden.md | 116 +++++++++++- 07_6_felder_definieren.md | 14 +- openrefine/07_5-8_reduzieren.json | 224 ++++++++++++++++++++++++ scripte/count-tsv.sh | 31 ++++ 4 files changed, 379 insertions(+), 6 deletions(-) create mode 100644 openrefine/07_5-8_reduzieren.json create mode 100755 scripte/count-tsv.sh diff --git a/07_5_alle_daten_in_ein_projekt_laden.md b/07_5_alle_daten_in_ein_projekt_laden.md index effa7f3..a45a529 100644 --- a/07_5_alle_daten_in_ein_projekt_laden.md +++ b/07_5_alle_daten_in_ein_projekt_laden.md @@ -192,8 +192,7 @@ Hinweise: Bedarf an Arbeitsspeicher: -* Alle Daten alle Felder (07_5-6_all.json): Beim Importieren ... GB, Fertiges Projekt laden ... GB -* Reduzierte Felder (07_5-6_minimal.json): Beim Importieren ... GB, Fertiges Projekt laden ... GB +* Reduzierte Felder (07_5-6_minimal.json): 2,78 GB ## Lösung @@ -201,3 +200,116 @@ Bedarf an Arbeitsspeicher: * {%s%}Parse data as CSV / TSV / separator-based files{%ends%} * {%s%}Character encoding: UTF-8{%ends%} * {%s%}Checkbox "Store file source..." deaktivieren / Projektnamen vergeben und Button "Create Project" drücken{%ends%} + +## Aufgabe 8: Prüfen, wie häufig Felder belegt sind + +Sie können sich mit den Facetten in OpenRefine einen Überblick über die Belegung der Spalten verschaffen. Wählen Sie dazu ```Facet -> Customized facets -> Facet by blank```. + +Alternativ können Sie TSV-Dateien auch auf der Kommandozeile durchzählen. Folgendes Script zählt alle Werte in den Spalten einer TSV-Datei. + +### Vorgehen + +``` +#!/bin/bash +# Script zur Zählung von Feldbelegungen in TSV-Dateien +# Stand: 20.11.2016 +# Nutzung: ./count-tsv.sh file.tsv + +# Abfrage der Dateinamen +if [ -z "$1" ] + then + echo "Bitte Dateinamen angeben!" + echo "Beispiel: ./count.sh file.tsv" + exit + else + echo "Folgende Dateien werden untersucht:" + files=($*) + echo ${files[@]} + echo "" +fi + +# Schleife für mehrere Dateien +for file in "${files[@]}"; do + + # Spaltennamen erfassen + readarray columns < <(head -q -n1 haw_000001_450200_minimal.tsv | tr '\t' '\n' | cat) + + # Belegte Zellen in Spalten zählen und ausgeben + number=1 + for column in "${columns[@]}"; do + echo -e ${column} "\t\t" $(cut -d$'\t' -f ${number} ${file} | grep -v '^$' | wc -l) + number=$(($number+1)) + done +done +``` + +Script als Datei: [count-tsv.sh](https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/scripte/count-tsv.sh) + +**Ausführen:** + +* Script mit ```curl``` auf den Server laden: ```curl -O https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/scripte/count-tsv.sh``` +* Script ausführbar machen: ```chmod +x count-tsv.sh``` +* Script starten mit ```./count-tsv.sh``` + +### Ergebnis + +Folgende Spalten sind weniger als 10x belegt und könnten wohl gelöscht werden: + +| Spalte | Anzahl belegter Felder | +|---|---| +| 082 : c | 2 | +| 100 : 6 | 2 | +| 100 : h | 2 | +| 535 : a | 2 | +| 551 : 5 | 2 | +| 583 : c | 2 | +| 600 : e | 2 | +| 600 : l | 2 | +| 600 : p | 2 | +| 610 : d | 2 | +| 610 : g | 2 | +| 610 : l | 2 | +| 630 : p | 2 | +| 650 : b | 2 | +| 650 : d | 2 | +| 651 : s | 2 | +| 653 : f | 2 | +| 653 : x | 2 | +| 700 : t | 2 | +| 700 : v | 2 | +| 700 : w | 2 | +| 751 : 9 | 2 | +| 502 : g | 3 | +| 511 : e | 3 | +| 611 : x | 3 | +| 630 : 2 | 3 | +| 630 : f | 3 | +| 630 : s | 3 | +| 100 : m | 4 | +| 100 : r | 4 | +| 550 : x | 4 | +| 630 : l | 4 | +| 653 : t | 4 | +| 700 : 5 | 4 | +| 776 : o | 4 | +| 611 : v | 5 | +| 653 : h | 5 | +| 710 : 9 | 5 | +| 711 : 0 | 5 | +| 711 : 2 | 5 | +| 100 : n | 6 | +| 510 : x | 7 | +| 600 : z | 7 | +| 100 : p | 8 | +| 551 : x | 8 | +| 653 : g | 8 | +| 655 : x | 8 | +| 700 : 6 | 8 | +| 610 : y | 9 | + +### Transformation anwenden + +Wenn Sie die geringfügig belegten Felder löschen wollen, dann wenden Sie die folgende Transformationsdatei an. + +* Menü oben links "Undo / Redo" aufrufen und Button "Apply..." drücken. +* Den Inhalt aus der Datei [07_5-8_reduzieren.json](https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/openrefine/07_5-8_reduzieren.json) in die Zwischenablage kopieren und in das Textfeld von "Apply" einfügen und Button "Perform Operations" drücken. \ No newline at end of file diff --git a/07_6_felder_definieren.md b/07_6_felder_definieren.md index 0105683..0980d6d 100644 --- a/07_6_felder_definieren.md +++ b/07_6_felder_definieren.md @@ -20,6 +20,8 @@ Hinweise: * Wenn Sie nicht wissen, wo Sie beginnen sollen, dann versuchen Sie zunächst mit einem kleinen Satz von Feldern anzufangen. In Kapitel 4 haben Sie das Format Dublin Core als einen "kleinsten gemeinsamen Nenner" kennengelernt. Sie können damit beginnen diese Felder zu bilden. Die Library of Congress hat einen [Crosswalk von MARC21 zu Dublin Core](http://www.loc.gov/marc/marc2dc.html) bereitgestellt, den Sie zur Orientierung nutzen können. + -??? Datumskonvertierung: value.toDate() -??? Störende Zeichen +## Aufgabe 3: Daten bereinigen Hinweise: -* Am schnellsten geht es über die Funktion zum Neusortieren der Spalten. Alternativ könnten Sie auch beim Export nur einzelne Spalten auswählen. +* Prüfen Sie, ob in den Feldern noch unerwünschte Zeichen vorkommen, die nicht im Suchindex landen sollen. +* Versuchen Sie außerdem Datumsangaben mit der Funktion ```toDate()``` in maschinenlesbare Datumsformate nach ISO-8601 zu wandeln. * Der Suchindex erwartet eine eindeutige Identifikationsnummer in der ersten Spalte. Das Feld wird üblicherweise ```id``` benannt. Benennen Sie die Spalte mit dem MARC-Feld ```001``` in ```id``` um und verschieben Sie diese in die erste Spalte (falls Sie dort nicht ohnehin stehen sollte). + + ## Literatur * Owen Stephens: [A worked example of fixing problem MARC data: Part 4 – OpenRefine](http://www.meanboyfriend.com/overdue_ideas/2015/07/worked-example-fixing-marc-data-4/) diff --git a/openrefine/07_5-8_reduzieren.json b/openrefine/07_5-8_reduzieren.json new file mode 100644 index 0000000..ffa5e2e --- /dev/null +++ b/openrefine/07_5-8_reduzieren.json @@ -0,0 +1,224 @@ +[ { "op": "core/column-reorder", "description": "Reorder columns", "columnNames": [ +"001", +"020 : a", +"022 : a", +"024 : a", +"041 : a", +"041 : b", +"041 : h", +"050 : a", +"060 : a", +"082 : a", +"100 : 0", +"100 : 4", +"100 : 9", +"100 : a", +"100 : b", +"100 : c", +"100 : d", +"100 : e", +"100 : t", +"110 : 0", +"110 : 4", +"110 : 9", +"110 : a", +"110 : b", +"110 : c", +"110 : d", +"110 : e", +"110 : f", +"110 : g", +"110 : n", +"110 : p", +"110 : t", +"110 : x", +"111 : 9", +"111 : a", +"111 : c", +"111 : d", +"111 : e", +"111 : n", +"245 : 6", +"245 : a", +"245 : b", +"245 : c", +"245 : h", +"245 : n", +"245 : p", +"246 : a", +"246 : b", +"246 : g", +"246 : i", +"260 : a", +"260 : b", +"260 : c", +"500 : 0", +"500 : 9", +"500 : a", +"500 : b", +"500 : c", +"500 : e", +"500 : i", +"500 : w", +"500 : z", +"501 : a", +"502 : a", +"502 : b", +"502 : c", +"502 : d", +"504 : a", +"505 : a", +"510 : 0", +"510 : 9", +"510 : a", +"510 : b", +"510 : e", +"510 : i", +"510 : n", +"510 : w", +"511 : 0", +"511 : 9", +"511 : a", +"511 : c", +"511 : d", +"511 : i", +"511 : j", +"511 : n", +"511 : w", +"515 : a", +"520 : a", +"530 : 0", +"530 : 9", +"530 : a", +"530 : f", +"530 : i", +"530 : p", +"530 : w", +"533 : 7", +"533 : a", +"533 : b", +"533 : c", +"533 : d", +"533 : e", +"533 : f", +"533 : n", +"534 : a", +"534 : n", +"538 : a", +"546 : a", +"548 : 9", +"548 : a", +"548 : i", +"548 : w", +"550 : 0", +"550 : 9", +"550 : a", +"550 : i", +"550 : w", +"551 : 0", +"551 : 9", +"551 : a", +"551 : i", +"551 : w", +"551 : z", +"555 : a", +"583 : a", +"583 : k", +"583 : z", +"591 : a", +"600 : 0", +"600 : 2", +"600 : 8", +"600 : a", +"600 : b", +"600 : c", +"600 : d", +"600 : q", +"600 : t", +"600 : v", +"600 : x", +"610 : 0", +"610 : 2", +"610 : 8", +"610 : 9", +"610 : a", +"610 : b", +"610 : t", +"610 : v", +"610 : x", +"610 : z", +"611 : 0", +"611 : 2", +"611 : a", +"611 : c", +"611 : d", +"611 : n", +"611 : x", +"630 : a", +"630 : d", +"630 : k", +"630 : v", +"630 : x", +"650 : 0", +"650 : 2", +"650 : 8", +"650 : 9", +"650 : a", +"650 : v", +"650 : x", +"650 : y", +"650 : z", +"651 : 0", +"651 : 2", +"651 : 9", +"651 : a", +"651 : v", +"651 : x", +"651 : y", +"651 : z", +"653 : 0", +"653 : 2", +"653 : a", +"653 : A", +"653 : s", +"653 : S", +"655 : 0", +"655 : 2", +"655 : a", +"700 : 0", +"700 : 2", +"700 : 4", +"700 : 9", +"700 : a", +"700 : b", +"700 : c", +"700 : d", +"700 : e", +"710 : 0", +"710 : 2", +"710 : 4", +"710 : a", +"710 : b", +"710 : c", +"710 : d", +"710 : e", +"710 : g", +"710 : n", +"711 : a", +"711 : c", +"711 : d", +"711 : n", +"751 : 0", +"751 : 2", +"751 : a", +"770 : t", +"772 : t", +"773 : t", +"775 : t", +"776 : t", +"780 : t", +"785 : t", +"787 : t", +"856 : q", +"856 : u" + ] } ] diff --git a/scripte/count-tsv.sh b/scripte/count-tsv.sh new file mode 100755 index 0000000..3181575 --- /dev/null +++ b/scripte/count-tsv.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# Script zur Zählung von belegten Werten in TSV-Dateien +# Stand: 20.11.2016 +# Nutzung: ./count.sh file.tsv + +# Abfrage der Dateinamen +if [ -z "$1" ] + then + echo "Bitte Dateinamen angeben!" + echo "Beispiel: ./count.sh file.tsv" + exit + else + echo "Folgende Dateien werden untersucht:" + files=($*) + echo ${files[@]} + echo "" +fi + +# Schleife für mehrere Dateien +for file in "${files[@]}"; do + + # Spaltennamen erfassen + readarray columns < <(head -q -n1 haw_000001_450200_minimal.tsv | tr '\t' '\n' | cat) + + # Belegte Zellen in Spalten zählen und ausgeben + number=1 + for column in "${columns[@]}"; do + echo -e ${column} "\t\t" $(cut -d$'\t' -f ${number} ${file} | grep -v '^$' | wc -l) + number=$(($number+1)) + done +done