<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Data Cleaning | FDMLab@LABW</title><link>https://fdmlab.landesarchiv-bw.de/tag/data-cleaning/</link><atom:link href="https://fdmlab.landesarchiv-bw.de/tag/data-cleaning/index.xml" rel="self" type="application/rss+xml"/><description>Data Cleaning</description><generator>Wowchemy (https://wowchemy.com)</generator><language>de-de</language><lastBuildDate>Thu, 22 Jun 2023 11:00:00 +0000</lastBuildDate><image><url>https://fdmlab.landesarchiv-bw.de/media/sharing.jpg</url><title>Data Cleaning</title><link>https://fdmlab.landesarchiv-bw.de/tag/data-cleaning/</link></image><item><title>82. Südwestdeutscher Archivtag 2023</title><link>https://fdmlab.landesarchiv-bw.de/event/2023-normdatenworkshop/</link><pubDate>Thu, 22 Jun 2023 11:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/event/2023-normdatenworkshop/</guid><description/></item><item><title>Entfernungen zu GPX Tracks mit OpenRefine ermitteln</title><link>https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/</link><pubDate>Thu, 27 Oct 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/</guid><description>&lt;p>In diesem Beitrag verarbeiten wir XML in Form von GPX-Dateien mit OpenRefine und berechnen via WebAPIs die Entfernung von unserem Standort zu dem Startpunkt der GPX-Tracks.&lt;/p>
&lt;p>Aktuelle Wanderführer bieten die darin beschriebenen Wanderungen häufig zusätzlich als &lt;a href="https://de.wikipedia.org/wiki/GPS_Exchange_Format" target="_blank" rel="noopener">GPX-Datei&lt;/a> zum Nachwandern als Download an.
Auch Tourismusbüros/verbände/gemeinschaften/&amp;hellip; bieten in Kooperation mit Diensten wie &lt;a href="https://www.outdooractive.com/" target="_blank" rel="noopener">OutdoorActive&lt;/a> lokale Wanderungen digital an. Planen wir einen Betriebsausflug, oder eine Wanderung, dann ist die Länge der Anfahrt zum jeweiligen Startpunkt durchaus ein wesentliches Entscheidungskriterium für oder gegen eine Wanderung. Anstatt manueller Einzelrecherchen testen wir in diesem Beitrag, wie sich mit OpenRefine die Entfernung und Fahrtdauer mit dem Auto bzw. dem öffentlichen Nahverkehr von unserem Standort zu den Startpunkten der einzelnen Wanderungen berechnen lässt.&lt;/p>
&lt;p>Dabei kombinieren wir OpenRefine mit Geodaten im XML basierten GPX-Format und fragen mit den extrahierten Daten verschiedene WebAPIs an.&lt;/p>
&lt;h2 id="unsere-testdaten">Unsere Testdaten&lt;/h2>
&lt;p>Als Testdaten verwenden wir die aktuell 21 Wanderungen aus dem Programm der &lt;a href="https://hochgehberge.de/" target="_blank" rel="noopener">hochgehberge&lt;/a>.
Diese lassen sich direkt von der Webseite als GPX-Datei einzeln herunterladen. Dafür muss nach Auswahl einer Tour etwas nach oben gescrollt werden.
Wie in Abbildung 1 gezeigt, aktivieren wir zusätzlich die Checkbox bei &amp;ldquo;Verknüpfte Wegpunkte exportieren&amp;rdquo;.
Das ermöglicht uns bei den Daten der &amp;ldquo;hochgehberge&amp;rdquo; nicht nur einen Abgleich mit dem Startpunkt der Wanderungen durchzuführen, sondern auch mit alternativen Parkplätzen, die sich als Einstieg zur Tour eignen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-webseite-hochgehbergede-mit-gpx-download">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Webseite hochgehberge.de mit GPX-Download." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-hochgehberge_hucb7e0a0d8f6d012e7accccd73c00b66e_632729_2e5885b9fff31e6470a950711ac66244.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-hochgehberge_hucb7e0a0d8f6d012e7accccd73c00b66e_632729_af2694a6fa3f096d4d911d702a8ac096.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-hochgehberge_hucb7e0a0d8f6d012e7accccd73c00b66e_632729_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-hochgehberge_hucb7e0a0d8f6d012e7accccd73c00b66e_632729_2e5885b9fff31e6470a950711ac66244.webp"
width="760"
height="714"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Webseite hochgehberge.de mit GPX-Download.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="routing-apis">Routing APIs&lt;/h2>
&lt;p>Wir verwenden für unseren Test die WebAPIs von &lt;a href="https://developers.google.com/maps/" target="_blank" rel="noopener">Google Maps&lt;/a>, &lt;a href="https://developer.HERE.com/" target="_blank" rel="noopener">HERE&lt;/a> und &lt;a href="https://openrouteservice.org/" target="_blank" rel="noopener">OpenRouteService&lt;/a>.
Für all diese Dienste benötigen wir einen Account und müssen einen API Schlüssel erstellen, um mit OpenRefine eine Anfrage stellen zu können.
Alle Dienste haben ein &amp;ldquo;freies&amp;rdquo; Kontingent, welches für unsere Anwendung vollkommen ausreichend ist.
Im Falle von Google Maps ist jedoch eine Kreditkarte notwendig, um den Dienst aktivieren zu können.&lt;/p>
&lt;p>Da das Warten auf die Bestätigungs-E-Mail manchmal mehrere Minuten dauert, lohnt es sich die Registrierung schon jetzt durchzuführen.
Wie das funktioniert und wie bei den einzelnen Diensten API Schlüssel erstellt wird, ist in der jeweiligen Dokumentation deutlich besser und umfangreicher beschrieben, als wir es hier können.&lt;/p>
&lt;h2 id="daten-importieren-und-aufarbeiten">Daten importieren und aufarbeiten&lt;/h2>
&lt;h3 id="daten-in-openrefine-importieren">Daten in OpenRefine importieren&lt;/h3>
&lt;p>Bei vielen Dateien oder verschachtelten Strukturen mit Unterordnern empfiehlt es sich, diese in eine ZIP-Datei zu packen, was das Laden in OpenRefine vereinfacht. Wie in Abbildung 2 gezeigt, kann eine ZIP-Datei direkt als Datenquelle für ein neues Projekt ausgewählt werden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-dateiauswahl-für-neue-projekte-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Dateiauswahl für neue Projekte in OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-create-project_huba1bae9e3157b8d9bf7139983b1c44fe_24234_1f5a0121390af91f1603a04f88c60434.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-create-project_huba1bae9e3157b8d9bf7139983b1c44fe_24234_20b9188da810ed391b6618aee6415c25.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-create-project_huba1bae9e3157b8d9bf7139983b1c44fe_24234_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-create-project_huba1bae9e3157b8d9bf7139983b1c44fe_24234_1f5a0121390af91f1603a04f88c60434.webp"
width="760"
height="179"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Dateiauswahl für neue Projekte in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Wie in Abbildung 3 gezeigt, werden die einzelnen Dateien vor dem Import aus den Unterordnern geladen, und können in einem separaten Dialog nach Dateityp gefiltert werden. Auch eine Filterung basierend auf Mustern im Dateinamen ist möglich.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialogs-zum-filtern-von-dateien-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialogs zum Filtern von Dateien in OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-import-project_hu53ffd0236d51ecf11288f4ded52e813f_82274_79d8d12354b9799bda7305505f118bde.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-import-project_hu53ffd0236d51ecf11288f4ded52e813f_82274_14f6d44f557b18386ec56c0c7d9221b2.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-import-project_hu53ffd0236d51ecf11288f4ded52e813f_82274_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-import-project_hu53ffd0236d51ecf11288f4ded52e813f_82274_79d8d12354b9799bda7305505f118bde.webp"
width="760"
height="308"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialogs zum Filtern von Dateien in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Im XML-Import-Dialog wählen wir anschließend das GPX-Wurzelelement aus und erhalten die in Abbildung 4 gezeigten Daten in OpenRefine angezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-importierten-gpx-dateien-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der importierten GPX Dateien in OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-initial-view_huedb73ad5de4d14327f69b2e127f20ab8_203130_ae0781341cdd126a4d50114a6a784f7f.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-initial-view_huedb73ad5de4d14327f69b2e127f20ab8_203130_47a1deae8009204d1bf9ae284b3cf3a7.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-initial-view_huedb73ad5de4d14327f69b2e127f20ab8_203130_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-initial-view_huedb73ad5de4d14327f69b2e127f20ab8_203130_ae0781341cdd126a4d50114a6a784f7f.webp"
width="760"
height="260"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der importierten GPX Dateien in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="überflüssige-spalten-entfernen">Überflüssige Spalten entfernen&lt;/h3>
&lt;p>In Standard GPX-Tracks würden wir hier einfach den ersten Punkt des GPX-Tracks verwenden und den Rest verwerfen.
Da wir in den GPS-Daten der &amp;ldquo;hochgehberge&amp;rdquo; aber pro Tour teilweise mehrere mögliche Parkplätze zum Starten als Wegpunkte hinterlegt haben, machen wir den Abgleich hier über die Wegpunkte und verwerfen die Track-Daten.&lt;/p>
&lt;p>Wie in Abbildung 5 gezeigt, entfernen wir dafür überflüssige Spalten via
&amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit columns&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Re-order / remove columns&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialogs-zum-löschen-und-sortieren-von-spalten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialogs zum Löschen und Sortieren von Spalten in OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-remove-columns_hubfd1eb135cf2d2540b6bc7f2fc671328_24361_6237523570bb2a21ffd6e322f9be9d16.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-remove-columns_hubfd1eb135cf2d2540b6bc7f2fc671328_24361_2e08e0421cf35f4682a886ae3db35630.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-remove-columns_hubfd1eb135cf2d2540b6bc7f2fc671328_24361_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-remove-columns_hubfd1eb135cf2d2540b6bc7f2fc671328_24361_6237523570bb2a21ffd6e322f9be9d16.webp"
width="597"
height="564"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialogs zum Löschen und Sortieren von Spalten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Die folgenden Spalten behalten wir vorläufig:&lt;/p>
&lt;ul>
&lt;li>File =&amp;gt; als Record Identifier, also Zuordnung von Startpunkten zu einzelnen Touren.&lt;/li>
&lt;li>WPT lon, lat =&amp;gt; Zur Routenplanung via API.&lt;/li>
&lt;li>WPT Name + Type =&amp;gt; zum Filtern von Startpunkten (Parkplätzen).&lt;/li>
&lt;li>WPT DESC + Link =&amp;gt; ggf. zur weiteren Recherche hilfreich.&lt;/li>
&lt;li>Metadata Name + Link =&amp;gt; Information über Wanderung.&lt;/li>
&lt;/ul>
&lt;h3 id="spalten-umbenennen">Spalten umbenennen&lt;/h3>
&lt;p>Um auf die Werte einfacher zugreifen zu können, benennen wir die restlichen Spalten passend nach folgendem Schema um:&lt;/p>
&lt;ul>
&lt;li>gpx - wpt - lon
&lt;i class="fas fa-arrow-right pr-1 fa-fw">&lt;/i> Lon&lt;/li>
&lt;li>gpx - wpt - lat
&lt;i class="fas fa-arrow-right pr-1 fa-fw">&lt;/i> Lat&lt;/li>
&lt;li>gpx - wpt - name
&lt;i class="fas fa-arrow-right pr-1 fa-fw">&lt;/i> Wegpunkt Name&lt;/li>
&lt;li>gpx - wpt - type
&lt;i class="fas fa-arrow-right pr-1 fa-fw">&lt;/i> Wegpunkt Typ&lt;/li>
&lt;li>gpx - wpt - desc
&lt;i class="fas fa-arrow-right pr-1 fa-fw">&lt;/i> Wegpunkt Beschreibung&lt;/li>
&lt;li>gpx - wpt - link-href
&lt;i class="fas fa-arrow-right pr-1 fa-fw">&lt;/i> Wegpunkt Link&lt;/li>
&lt;li>gpx -metadata - name
&lt;i class="fas fa-arrow-right pr-1 fa-fw">&lt;/i> Name&lt;/li>
&lt;li>gpx - metadata - link - href
&lt;i class="fas fa-arrow-right pr-1 fa-fw">&lt;/i> Link&lt;/li>
&lt;/ul>
&lt;h3 id="spalten-sortieren">Spalten sortieren&lt;/h3>
&lt;p>Nachdem wir geprüft haben, dass die Spalte &amp;ldquo;Name&amp;rdquo; für jeden GPS-Track eindeutig ist (Text Facet oder Duplicates Facet), löschen wir die Spalte &amp;ldquo;File&amp;rdquo; und verschieben die Spalte &amp;ldquo;Name&amp;rdquo; ganz nach links.
Dadurch wird der &amp;ldquo;Name&amp;rdquo; zum neuen Record Identifier der einzelnen Wanderungen.
Ordnungsliebend verschieben wir die Spalte &amp;ldquo;Link&amp;rdquo; direkt daneben auf die zweite Position.
Das geht in einem Bearbeitungsschritt über den Dialog zum Löschen und Umsortieren mehrerer Spalten via &amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit columns&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Re-order / remove columns&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;h3 id="überflüssige-zeilen-entfernen">Überflüssige Zeilen entfernen&lt;/h3>
&lt;p>Wir haben in den Daten einige Leerzeilen, da wir die Spalten zu den einzelnen Trackpunkten gelöscht haben.
Außerdem haben wir einige Wegpunkte, die wir ebenfalls noch löschen wollen, da wir uns auf die Parkplätze konzentrieren wollen.&lt;/p>
&lt;p>Dies machen wir in vier Schritten:&lt;/p>
&lt;ol>
&lt;li>Werte in Spalte &amp;ldquo;Name&amp;rdquo; nach unten auffüllen via &amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Fill down&amp;rdquo;.&lt;/li>
&lt;li>Werte in Spalte &amp;ldquo;Link&amp;rdquo; nach unten auffüllen via &amp;ldquo;Link&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Fill down&amp;rdquo;.&lt;/li>
&lt;li>Wie in Abbildung 6, ein Text Facet auf der Spalte &amp;ldquo;Wegpunkt Typ&amp;rdquo; erstellen, dort die Wegpunkte vom Typ &amp;ldquo;Parkplatz&amp;rdquo; auswählen, und die Auswahl invertieren.&lt;/li>
&lt;li>Die überflüssigen Zeilen entfernen via &amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit rows&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Remove matching rows&amp;rdquo;.&lt;/li>
&lt;/ol>
&lt;figure id="figure-bildschirmfoto-des-text-facets-zum-filtern-von-wegpunkten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Text Facets zum Filtern von Wegpunkten in OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-facet-parkplatz_hu14ad700099fb1ac0e6bb0c8ae48ac492_9905_b3ef9364dc15e2fb90b1bd1200802cb5.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-facet-parkplatz_hu14ad700099fb1ac0e6bb0c8ae48ac492_9905_7607ddaebca37c8c3999482757fb90e5.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-facet-parkplatz_hu14ad700099fb1ac0e6bb0c8ae48ac492_9905_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-facet-parkplatz_hu14ad700099fb1ac0e6bb0c8ae48ac492_9905_b3ef9364dc15e2fb90b1bd1200802cb5.webp"
width="294"
height="250"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Text Facets zum Filtern von Wegpunkten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="nochmal-überflüssige-spalten-entfernen">Nochmal überflüssige Spalten entfernen&lt;/h3>
&lt;p>Bei den Parkplätzen sind die Spalten &amp;ldquo;Wegpunkt Link&amp;rdquo; und &amp;ldquo;Wegpunkt Beschreibung&amp;rdquo; nicht mit hilfreichen Informationen versehen, so dass wir sie löschen können.&lt;/p>
&lt;h3 id="auf-duplikate-prüfen">Auf Duplikate prüfen&lt;/h3>
&lt;p>Der Vollständigkeit halber prüfen wir mit dem &amp;ldquo;Duplicates Facet&amp;rdquo; oder dem &amp;ldquo;Text Facet&amp;rdquo; die Spalte &amp;ldquo;Wegpunkt&amp;rdquo; auf mögliche Duplikate und löschen diese.
Dafür die entsprechenden Zeilen zum Beispiel mit Flaggen markieren, via &amp;ldquo;Flag Facet&amp;rdquo; filtern und anschließend löschen.&lt;/p>
&lt;h3 id="records-erstellen">Records erstellen&lt;/h3>
&lt;p>Um wieder eine Record Struktur zu erstellen, bei der es zu jeder Tour mehrere mögliche Parkplätze als Startpunkte gibt, machen wir das &amp;ldquo;Fill down&amp;rdquo; auf den Spalten &amp;ldquo;Name&amp;rdquo; und &amp;ldquo;Link&amp;rdquo; aus dem vorherigen Schritt wieder rückgängig, indem wir analog dazu auf beiden Spalten &amp;ldquo;Name|Link&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Blank down&amp;rdquo; verwenden.&lt;/p>
&lt;p>Die fertig gefilterten Daten sind in Abbildung 7 zu sehen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-gefilterten-daten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der gefilterten Daten in OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-daten-nach-filtern_hude196f0a586d2946f25b8d1c71fe535e_90536_486a4f628d7372ab59d7b01257314c15.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-daten-nach-filtern_hude196f0a586d2946f25b8d1c71fe535e_90536_b588ee820209078fcb543f0b7a69b599.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-daten-nach-filtern_hude196f0a586d2946f25b8d1c71fe535e_90536_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-daten-nach-filtern_hude196f0a586d2946f25b8d1c71fe535e_90536_486a4f628d7372ab59d7b01257314c15.webp"
width="760"
height="383"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der gefilterten Daten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="startkoordinaten-suchen">Startkoordinaten suchen&lt;/h3>
&lt;p>Für einen Abgleich via WebAPI benötigen wir noch die Startkoordinaten.
Der Einfachheit halber kopieren wir diese von Google Maps und fügen sie als neue Spalten &amp;ldquo;Start Lon&amp;rdquo; und &amp;ldquo;Start Lat&amp;rdquo; dem Projekt hinzu (wir starten von unserer Zentrale in der Eugenstraße 7 in Stuttgart).
Um Geokoordinaten von Google Maps zu kopieren klicken wir mit dem rechten Maustaste auf den gesuchten Punkt oder den Marker auf der Karte.
Wie in Abbildung 8 gezeigt, erscheint anschließend ein Kontextmenü, wo die Geokoordinaten mit einem Linksklick direkt in die Zwischenablage übernommen werden können. Der erste Wert stellt den Breitengrad (Latidude) dar, der zweite den Längengrad (Longitude).&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-kontextmenüs-in-google-maps-zum-kopieren-von-geokoordinaten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Kontextmenüs in Google Maps zum Kopieren von Geokoordinaten." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-google-maps-geokoodinaten_huea6733d204a7fe7d6c10a1e5eb2d314c_27565_5b45b8a3f9b268cc680fd57b800bb7ed.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-google-maps-geokoodinaten_huea6733d204a7fe7d6c10a1e5eb2d314c_27565_96bba34bc9f074c4c444a755879ba1b2.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-google-maps-geokoodinaten_huea6733d204a7fe7d6c10a1e5eb2d314c_27565_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-google-maps-geokoodinaten_huea6733d204a7fe7d6c10a1e5eb2d314c_27565_5b45b8a3f9b268cc680fd57b800bb7ed.webp"
width="229"
height="351"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Kontextmenüs in Google Maps zum Kopieren von Geokoordinaten.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="wegstrecke-mit-webapis-ermitteln">Wegstrecke mit WebAPIs ermitteln&lt;/h2>
&lt;p>Nun haben wir alle Daten für unseren Datenabgleich zusammen. In Abbildung 9 sind diese noch einmal abgebildet, wobei wir zur Übersichtlichkeit die ersten beiden Spalten ausgeblendet haben. Im nächsten Schritt berechnen wir die Entfernung zwischen unserem Standort und den möglichen Startpunkten der einzelnen Wanderungen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-aufbereiteten-projektes-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des aufbereiteten Projektes in OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-data-ready_hu2d0b0e39e18a66ac4d4adf4a82f074a4_78021_91b4c8ee8084404f795d6b11935788e4.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-data-ready_hu2d0b0e39e18a66ac4d4adf4a82f074a4_78021_66a68edb5bba4a331f2abb3c01a773f3.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-data-ready_hu2d0b0e39e18a66ac4d4adf4a82f074a4_78021_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-data-ready_hu2d0b0e39e18a66ac4d4adf4a82f074a4_78021_91b4c8ee8084404f795d6b11935788e4.webp"
width="747"
height="629"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des aufbereiteten Projektes in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Um die Daten von einer WebAPI abzurufen, verwenden wir so genannte GET-Requests (siehe &lt;a href="https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP-Anfragemethoden" target="_blank" rel="noopener">HTTP-Anfragemethoden auf Wikipedia&lt;/a>). Das hat den Vorteil, dass wir die Daten direkt mit der &lt;a href="https://docs.openrefine.org/manual/columnediting#add-column-by-fetching-urls" target="_blank" rel="noopener">OpenRefine Funktion des Hinzufügens neuer Spalten via URL&lt;/a> abfragen können.&lt;/p>
&lt;p>Bei der (prinzipiell) für diese Art von Anfragen empfohlene POST-Request Methode, müssten wir zusätzlich in OpenRefine mit Clojure oder Python programmieren, was wir aus Gründen der Komplexität für dieses Experiment vermeiden möchten.&lt;/p>
&lt;h3 id="verwendung-von-here">Verwendung von HERE&lt;/h3>
&lt;p>Bei HERE handelt es sich um ein ehemaliges Berliner Startup, welches mehrfach verkauft wurde und inzwischen hauptsächlich aus dem Automotive Bereich bekannt ist.&lt;/p>
&lt;p>Für die Verwendung der HERE Routing API benötigen wir einen Account und einen API Schlüssel.
Die Benutzung der API ist in der &lt;a href="https://developer.here.com/documentation/routing-api/dev_guide/topics/use-cases/calculate-route.html" target="_blank" rel="noopener">Entwickler Dokumentation&lt;/a> beschrieben.&lt;/p>
&lt;h4 id="daten-abrufen">Daten abrufen&lt;/h4>
&lt;p>In Abbildung 10 ist der Dialog zum Hinzufügen neuer Spalten via URLs gezeigt. Diesen können wir aufrufen via &amp;ldquo;Beliebige Spalte&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit columns&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column by fetching URLs&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialogs-zum-abfragen-der-here-routing-api-mit-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialogs zum Abfragen der HERE Routing API mit OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-get-here_hu8c3fd2352e029eede290c6903029d90a_60147_ed2279c2b2a71f40e1c0603c2185ca34.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-get-here_hu8c3fd2352e029eede290c6903029d90a_60147_a1d49f246cd370332963483091d5549a.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-get-here_hu8c3fd2352e029eede290c6903029d90a_60147_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-get-here_hu8c3fd2352e029eede290c6903029d90a_60147_ed2279c2b2a71f40e1c0603c2185ca34.webp"
width="760"
height="250"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialogs zum Abfragen der HERE Routing API mit OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Die neue Spalte nennen wir &amp;ldquo;HERE&amp;rdquo; und die URL bauen wir für jede Zeile dynamisch zusammen:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;https://router.hereapi.com/v8/routes?transportMode=car&amp;amp;origin=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Start Lat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Start Lon&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;destination=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Lat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Lon&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;return=summary&amp;amp;apikey={YOUR_API_KEY}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wir geben in dieser Anfrage an, dass wir die Route für ein Auto planen möchten und laden die Start- und Zielkoordinaten aus den entsprechenden OpenRefine Spalten. Hier ist der Platzhalter &lt;code>{YOUR_API_KEY}&lt;/code> durch einen eigenen API Key zu ersetzen.&lt;/p>
&lt;p>Bei HERE haben wir zusätzlich die Möglichkeit, lediglich die Zusammenfassung zurückgeben zu lassen und damit auf die expliziten Einzelschrittanweisungen für die Route zu verzichten.&lt;/p>
&lt;div class="alert alert-warning">
&lt;div>
Das Vorhandensein des API Schlüssels direkt in der URL ist aus Sicherheitsaspekten eher unschön, weshalb hierfür generell andere Methoden empfohlen werden (POST, Header, OAuth).
Für unser kleines bzw. einmaliges Experiment ist dieses Vorgehen aus Gründen der Einfachheit vorzuziehen.
Wir können die API Schlüssel nach dem Experiment direkt wieder deaktivieren bzw. löschen.
&lt;/div>
&lt;/div>
&lt;h4 id="daten-aufbereiten">Daten aufbereiten&lt;/h4>
&lt;p>Die Antwort der HERE Routing API erfolgt im &lt;a href="https://www.json.org/json-de.html" target="_blank" rel="noopener">JSON Format&lt;/a>.
In OpenRefine ist das JSON nicht menschenlesbar formatiert, so dass wir es mit dem Online Service &lt;a href="https://jsonformatter.org/" target="_blank" rel="noopener">JSON formatter&lt;/a> menschenlesbar formatieren.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;routes&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;5dae984c-da74-4bf3-b126-a4b8f44f35f7&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;sections&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;ff1eaf83-4cae-498e-b0f0-b2fe68227106&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;vehicle&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;departure&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;time&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2022-10-24T11:10:38+02:00&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;place&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;place&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;location&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">48.7789779&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lng&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">9.1864948&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;originalLocation&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">48.7792369&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lng&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">9.186687&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;arrival&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;time&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2022-10-24T12:17:31+02:00&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;place&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;place&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;location&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">48.389022&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lng&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">9.3690754&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;originalLocation&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">48.388977&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lng&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">9.369079&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;summary&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;duration&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">4013&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;length&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">62748&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;baseDuration&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">3617&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;transport&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;mode&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;car&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die für uns interessanten Daten sind im Bereich &lt;code>summary&lt;/code> zu finden. Unter &lt;code>length&lt;/code> finden wir die Entfernung in Metern und unter &lt;code>baseDuration&lt;/code> die von der aktuellen Verkehrssituation unabhängige und daher optimistisch berechnete Fahrtdauer in Sekunden. Weitere Informationen zu unterschiedlichen Angaben zur Fahrdauer und wie sie angefragt werden können, sind in der &lt;a href="https://developer.HERE.com/documentation/routing-api/dev_guide/topics/use-cases/duration.html" target="_blank" rel="noopener">Entwickler Dokumentation&lt;/a> zu finden.&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
Das Routing via öffentlichem Nahverkehr befand sich zum Zeitpunkt der Durchführung dieses Experimentes im Beta Stadium und wurde daher nicht getestet.
&lt;/div>
&lt;/div>
&lt;p>Um aus dem JSON die für uns relevanten Daten in OpenRefine Spalten zu überführen, nutzen wir die Funktion &amp;ldquo;HERE&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit columns&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;p>Die erste neue Spalte nennen wir &amp;ldquo;HERE Entfernung&amp;rdquo; und verwenden den folgenden GREL Ausdruck zur Extraktion und Umwandlung der Entfernung in Kilometern:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">routes&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">sections&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">summary&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">length&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">round&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die zweite neue Spalte nennen wir &amp;ldquo;HERE Dauer&amp;rdquo; und verwenden den folgenden GREL Ausdruck zur Extraktion und Umwandlung der Dauer in Minuten:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">routes&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">sections&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">summary&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">baseDuration&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">60&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="verwendung-von-openrouteservice">Verwendung von OpenRouteService&lt;/h3>
&lt;p>Bei &lt;a href="https://openrouteservice.org/" target="_blank" rel="noopener">OpenRouteService&lt;/a> handelt es sich um einen OpenSource Geodatendienst, welcher auf Daten von OpenStreepMaps basiert.
Die Anmeldung und die Verwendung ist sehr einfach gehalten. Entsprechend ist auch die API im Vergleich zu den hier verwendeten kommerziellen Diensten nicht ganz so umfangreich. Die Verwendung der API zur Berechnung von Routen ist in der &lt;a href="https://openrouteservice.org/dev/#/api-docs/v2/directions/%7bprofile%7d/get" target="_blank" rel="noopener">Entwickler Dokumentation&lt;/a> beschrieben.&lt;/p>
&lt;h4 id="daten-abrufen-1">Daten abrufen&lt;/h4>
&lt;p>Das Vorgehen zur Abfrage einer WebAPI via GET-Requests haben wir schon bei der Verwendung der HERE Routing API beschrieben.&lt;/p>
&lt;p>Wir laden die Daten in eine neue Spalte namens &amp;ldquo;OpenRouteService&amp;rdquo;.
Der GREL Code zum dynamischen Erstellen der URLs für die einzelnen Zeilen sieht wie folgt aus:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;https://api.openrouteservice.org/v2/directions/driving-car?start=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Start Lon&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Start Lat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;end=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Lon&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Lat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;api_key={YOUR_API_KEY}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="daten-aufbereiten-1">Daten aufbereiten&lt;/h4>
&lt;p>Die JSON Antwort von OpenRouteService besteht aus mehreren tausend Elementen im JSON Format, da wir hier zusätzlich die komplette Route mitgeschickt bekommen. Die für uns interessanten Daten finden wir wieder im Element &lt;code>summary&lt;/code>. Die Entfernung ist wieder in Metern und die Dauer in Sekunden angeben.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;summary&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;distance&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">62204.3&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;duration&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">3993.7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Um aus dem JSON die für uns relevanten Daten in OpenRefine Spalten zu überführen, nutzen wir die Funktion &amp;ldquo;OpenRouteService&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit columns&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;p>Die erste neue Spalte nennen wir &amp;ldquo;ORS Entfernung&amp;rdquo; und verwenden den folgenden GREL Ausdruck zur Extraktion und Umwandlung der Entfernung in Kilometern:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">features&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">properties&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">summary&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">distance&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">round&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die zweite neue Spalte nennen wir &amp;ldquo;ORS Dauer&amp;rdquo; und verwenden den folgenden GREL Ausdruck zur Extraktion und Umwandlung der Dauer in Minuten:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">features&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">properties&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">summary&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">duration&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">60&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">round&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="verwendung-von-google-maps">Verwendung von Google Maps&lt;/h3>
&lt;p>Google hat bei den hier verwendeten Webdiensten das weitaus umfangreichste API Angebot.
Der Account Setup ist hier jedoch im Vergleich auch etwas aufwendiger.&lt;/p>
&lt;p>Wir verwenden die &lt;a href="https://developers.google.com/maps/documentation/directions?hl=de" target="_blank" rel="noopener">Directions API&lt;/a> von Google Maps.
Es gibt zwar auch eine neuere &lt;a href="https://developers.google.com/maps/documentation/routes?hl=de" target="_blank" rel="noopener">Routes API&lt;/a>, die derzeit in einer Vorschau-Version zur Verfügung steht. Diese bietet jedoch zum Zeitpunkt dieses Experiments (noch?) keine GET-Requests oder Routing via ÖPNV an.&lt;/p>
&lt;h4 id="daten-abrufen-2">Daten abrufen&lt;/h4>
&lt;p>Über die Directions API von Google Maps lassen sich auch Routen mit dem öffentlichen Nahverkehr planen.
Daher fokussieren wir uns bei diesem Dienst auf diese Funktionalität.&lt;/p>
&lt;p>Da Ausflüge wie Wanderungen häufig an Sonntagen stattfinden, dort jedoch der öffentliche Nahverkehr anders getaktet ist als unter der Woche, geben wir bei dieser Abfrage zusätzlich unsere gewünschte Ankunftszeit an (Sonntag, 31. Oktober 2022 um 10:00 Uhr).
Die Zeitangaben werden in &amp;ldquo;Sekunden seit dem 1. Januar 1970&amp;rdquo; angegeben. In OpenRefine berechnen wir das mit dem folgenden GREL Ausdruck:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;2022-10-31 10:00&amp;#34;&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toDate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;yyyy-MM-dd HH:mm&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">datePart&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;time&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">1000&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Hier eingefügt in den GREL-Code zur dynamischen Erstellung von URLs für das Hinzufügen neuer Spalten via URLs für OpenRefine:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;https://maps.googleapis.com/maps/api/directions/json?origin=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Start Lat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Start Lon&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;destination=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Lat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Lon&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;mode=transit&amp;amp;arrival_time=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;2022-10-31 10:00&amp;#34;&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toDate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;yyyy-MM-dd HH:mm&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">datePart&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;time&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">1000&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;language=de&amp;amp;key={YOUR_API_KEY}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="daten-aufbereiten-2">Daten aufbereiten&lt;/h4>
&lt;p>Die JSON Antwort der Google Maps Direction API ist recht ausführlich, wenn denn eine funktionierende Strecke gefunden werden konnte.
Hier ein kleiner Ausschnitt:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;copyrights&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Map data ©2022 GeoBasis-DE/BKG (©2009)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;legs&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;arrival_time&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;10:22&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;time_zone&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Europe/Berlin&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1667208156&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;departure_time&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;09:06&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;time_zone&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Europe/Berlin&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1667203588&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;distance&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;48,2 km&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">48218&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;duration&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;1 Stunde, 16 Minuten&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">4568&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;end_address&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Panorama Therme, 72660 Beuren, Deutschland&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;end_location&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">48.5655941&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lng&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">9.3967464&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;start_address&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Eugenstraße 7, 70182 Stuttgart, Deutschland&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;start_location&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">48.77899370000001&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lng&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">9.1865211&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;steps&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Interessant ist hier, dass wir die Werte für die Entfernung und Dauer sowohl als Text, als auch in Metern bzw. Sekunden erhalten.
Wir extrahieren auch hier die Zahlenwerte, da diese einfacher in ein einheitliches Format umgewandelt werden können.&lt;/p>
&lt;p>Die erste neue Spalte nennen wir &amp;ldquo;Google Entfernung (ÖPNV)&amp;rdquo; und verwenden den folgenden GREL Ausdruck zur Extraktion und Umwandlung der Entfernung in Kilometern:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">routes&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">legs&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">distance&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">round&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die zweite neue Spalte nennen wir &amp;ldquo;Google Dauer (ÖPNV)&amp;rdquo; und verwenden den folgenden GREL Ausdruck zur Extraktion und Umwandlung der Dauer in Minuten:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">routes&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">legs&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">duration&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">60&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">round&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="formate-anpassen">Formate anpassen&lt;/h3>
&lt;p>Zur Verbesserung der Lesbarkeit, ergänzen wir die Entfernungsspalten um die Angabe &amp;ldquo;km&amp;rdquo;.
Dafür nutzen wir &amp;ldquo;Spalte&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;rdquo; und den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;km&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>In den Spalten zur Dauer wandeln wir die Angaben von Minuten in Stunden und Minuten um.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toDate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;mm&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">d&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">d&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">datePart&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;h&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">h&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">d&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">datePart&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;min&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">min&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">h&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">h&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;h &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">min&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;min&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">min&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;min&amp;#34;&lt;/span>&lt;span class="p">))))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Das Endergebnis ist in Abbildung 11 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-fertigen-projektes-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des fertigen Projektes in OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-fertig_hu2f011a17eda5fcbd7de9798882891477_136944_dcd955d3713007aefb71500a78aeabb0.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-fertig_hu2f011a17eda5fcbd7de9798882891477_136944_952b2cfd4198f3d4268bf6530920849a.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-fertig_hu2f011a17eda5fcbd7de9798882891477_136944_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-fertig_hu2f011a17eda5fcbd7de9798882891477_136944_dcd955d3713007aefb71500a78aeabb0.webp"
width="760"
height="558"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des fertigen Projektes in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Dieser Artikel ist überraschend lang geworden. Das liegt hauptsächlich daran, dass wir versuchen Hintergründe zu erklären, mit der Auswertung der Wegpunkte einen etwas komplizierteren Fall durchspielen und uns gleich drei unterschiedliche WebAPIs ansehen.&lt;/p>
&lt;p>In einem vereinfachten Test mit einem anderen Datensatz unter der Verwendung des ersten Punktes der Wanderung als Zielpunkt und nur einer API, haben wir die Bearbeitung in etwa 10 Minuten abgeschlossen. Und zwar inklusive Export in eine Software für Tabellenkalkulation und anschließender visueller Formatierung für den Druck.&lt;/p>
&lt;p>Generell waren wir überrascht, wie wenig aufwendig es ist, eine Menge von GPX-Dateien im XML-Format in OpenRefine einzulesen, die relevanten Geokoordinaten herauszufiltern und damit Anfragen an eine WebAPI zu stellen.&lt;/p>
&lt;p>Bei den WebAPIs hat uns OpenRouteService in seiner Einfachheit gefallen.
Der Funktionsumfang der API ist nicht so umfangreich, wie bei den kommerziellen Anbietern.
Jedoch ist der initiale Aufwand für die Account Registrierung geringer, sowie die Erstellung eines API Schlüssels sehr übersichtlich gehalten.&lt;/p>
&lt;p>Das Erstellen eines Accounts und API Schlüssels für die HERE Routing API war ebenfalls sehr direkt und die Arbeit mit der API machte uns sofort Spaß.
Die HERE Routing API lädt dazu ein, noch viel mehr und umfangreicher mit ihr zu arbeiten.&lt;/p>
&lt;p>Bei Google fühlten wir uns zuerst von der Menge der Dienste und möglichen Alternativen erschlagen.
Die Google Maps Direction API ist dann auch sehr umfangreich, so dass wir im Vergleich mit den anderen APIs etwas länger brauchten, um genau unseren Use-Case damit abzubilden.
Dafür konnten wir damit problemlos die Anfahrt mit dem Öffentlichen Personennahverkehr berechnen.&lt;/p>
&lt;p>Auch wenn es sich bei den Daten für dieses Experiment nicht um &amp;ldquo;klassische&amp;rdquo; Archivdaten handelt, so hilft uns das Experiment besser zu verstehen, wie OpenRefine uns dabei unterstützt Daten aus unterschiedlichen Quellen zusammenzuführen.
Im Kontext der einfachen Installation von OpenRefine steigert die Anbindung von generischen WebAPIs ohne Programmierkenntnisse die Attraktivität von OpenRefine weiter.&lt;/p></description></item><item><title>Probleme mit Umlauten in OpenRefine</title><link>https://fdmlab.landesarchiv-bw.de/post/2022-07-probleme-mit-umlauten-in-openrefine/</link><pubDate>Tue, 19 Jul 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/post/2022-07-probleme-mit-umlauten-in-openrefine/</guid><description>&lt;p>Bei der Verarbeitung deutschsprachiger Texte stoßen wir hin und wieder auf Probleme mit Umlauten und anderen Sonderzeichen.
In diesem Artikel haben wir einige typischen Probleme und ihre Lösungen aufgelistet.&lt;/p>
&lt;h2 id="umlaute-in-metadaten-sorgen-für-speicherprobleme-in-openrefine-35">Umlaute in Metadaten sorgen für Speicherprobleme in OpenRefine 3.5&lt;/h2>
&lt;p>OpenRefine hat in der Version 3.5 ein &lt;a href="https://github.com/OpenRefine/OpenRefine/issues/4402" target="_blank" rel="noopener">Problem mit Umlauten und anderen Sonderzeichen in den Metadaten&lt;/a>.
Zu den Metadaten gehören zum Beispiel der Projektname, die Schlagworte, der Dateiname der importierten Datei, Templates für den Export, &amp;hellip;&lt;/p>
&lt;p>Diese fehlerhaft gespeicherten Sonderzeichen in den Metadaten verdoppeln sich bei jedem (Neu)Start von OpenRefine (siehe Grafiken 1 - 3).&lt;/p>
&lt;p>
&lt;figure id="figure-bildschirmfoto-des-projektes-nach-dem-import">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes nach dem Import." srcset="
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-project-01_hu6b8886ef683c2b173ef927c1a83d0ec4_22575_c810de66b8398ddb9f95b8c4d2013fbb.webp 400w,
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-project-01_hu6b8886ef683c2b173ef927c1a83d0ec4_22575_721c4b1c21fc9b1b8af4e90bb37cb272.webp 760w,
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-project-01_hu6b8886ef683c2b173ef927c1a83d0ec4_22575_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-project-01_hu6b8886ef683c2b173ef927c1a83d0ec4_22575_c810de66b8398ddb9f95b8c4d2013fbb.webp"
width="553"
height="296"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes nach dem Import.
&lt;/figcaption>&lt;/figure>
&lt;figure id="figure-bildschirmfoto-des-projektes-nach-dem-ersten-neustart">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes nach dem ersten Neustart." srcset="
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-project-02_huedd7116d31280537066c742c7577be9d_23268_0c9c3b73a6d7010dcad29d6d6681faa6.webp 400w,
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-project-02_huedd7116d31280537066c742c7577be9d_23268_8027909c8014beb064f1d80042119d45.webp 760w,
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-project-02_huedd7116d31280537066c742c7577be9d_23268_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-project-02_huedd7116d31280537066c742c7577be9d_23268_0c9c3b73a6d7010dcad29d6d6681faa6.webp"
width="558"
height="296"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes nach dem ersten Neustart.
&lt;/figcaption>&lt;/figure>
&lt;figure id="figure-bildschirmfoto-des-projektes-nach-dem-zweiten-neustart">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes nach dem zweiten Neustart." srcset="
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-project-03_hu197425fb46fb36550a92a20c7eef2cf1_23434_147a83d477a56613c0074876072f7663.webp 400w,
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-project-03_hu197425fb46fb36550a92a20c7eef2cf1_23434_add3bdda31bac1f3a8f51f8de4dfad44.webp 760w,
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-project-03_hu197425fb46fb36550a92a20c7eef2cf1_23434_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-project-03_hu197425fb46fb36550a92a20c7eef2cf1_23434_147a83d477a56613c0074876072f7663.webp"
width="551"
height="296"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes nach dem zweiten Neustart.
&lt;/figcaption>&lt;/figure>
&lt;/p>
&lt;p>Da es sich hierbei um ein exponentielles Wachstum handelt, ist es möglich, dass wir nach einiger Zeit Metadaten in der Größe von mehreren Gigabyte produzieren. Dadurch kann OpenRefine irgendwann nicht mehr starten und meldet beim Start: &lt;code>HTTP ERROR 500 java.lang.OutOfMemoryError: Java heap space&lt;/code>.
Der Reflex die Größe des Heaps (&lt;code>max memory heap size&lt;/code>) in der &lt;code>openrefine.l4j.ini&lt;/code> anzupassen hilft zwar erst einmal, jedoch werden die Metadaten weiterhin schneller wachsen, als man Arbeitsspeicher nachkaufen kann.&lt;/p>
&lt;p>Um das Problem vorübergehend zu mitigieren, benötigen wir zuerst eine Liste der betroffenen OpenRefine Projekte.
Dafür ermitteln wir, &lt;a href="https://docs.openrefine.org/manual/installing#set-where-data-is-stored" target="_blank" rel="noopener">wo die OpenRefine Projekte gespeichert sind&lt;/a>.&lt;/p>
&lt;p>In diesem Verzeichnis identifizieren wir ungewöhnlich große &lt;code>metadata.json&lt;/code> Dateien.
Dabei ist &lt;em>ungewöhnlich groß&lt;/em> abhängig von der Art der Projekte mit denen wir arbeiten.
Normalerweise sind &lt;code>metadata.json&lt;/code> Dateien mit einer Größe, die in Megabyte oder größer gemessen wird, ein Grund sie genauer anzusehen.&lt;/p>
&lt;p>Zur Identifikation der großen &lt;code>metadata.json&lt;/code> Dateien können auch Werkzeuge verwendet werden.
Für Windows gibt es unter anderem &lt;a href="https://www.jam-software.com/treesize" target="_blank" rel="noopener">TreeSize&lt;/a> und &lt;a href="https://windirstat.net/" target="_blank" rel="noopener">WinDirStat&lt;/a>.&lt;/p>
&lt;p>Die betroffenen Projektordner können dann (temporär) aus dem OpenRefine Projektordner herausgenommen und ihre ID aus der Datei &lt;code>workspace.json&lt;/code> entfernt werden.&lt;/p>
&lt;p>Um die &lt;code>metadata.json&lt;/code> Dateien zu korrigieren, kann eine Kombination der Kommandozeilenwerkzeuge &lt;code>find&lt;/code> und &lt;code>jq&lt;/code> verwendet werden, wie es auf GitHub unter &lt;a href="https://github.com/OpenRefine/OpenRefine/issues/3431#issuecomment-748682968" target="_blank" rel="noopener">Out of memory errors from large metadata.json files being parsed during OpenRefine Project Open&lt;/a> beschrieben wird.&lt;/p>
&lt;p>Alternativ können die &lt;code>metadata.json&lt;/code> Dateien auch manuell korrigiert werden.
Dafür werden diese mit einem Texteditor geöffnet, der in der Lage ist diese großen Dateien darzustellen.
Unter Windows kann dafür der Standard Texteditor (NotePad) verwendet werden.&lt;/p>
&lt;p>Erfahrungsgemäß ist es dabei einfacher, die nicht betroffenen Teile der JSON-Datei in eine neue Datei zu kopieren, anstatt zu versuchen Megabytes an Sonderzeichen zu löschen.&lt;/p>
&lt;p>Der Fehler wird mit OpenRefine 3.6 gefixt, jedoch werden die schon vermehrten Umlaute nicht automatisiert aufgeräumt.
Generell ist es zu empfehlen, dass betroffene Benutzer möglichst früh zur &lt;a href="https://github.com/OpenRefine/OpenRefine/releases/tag/3.6.0" target="_blank" rel="noopener">Version 3.6&lt;/a> von OpenRefine wechseln.&lt;/p>
&lt;h2 id="daten-richtig-in-openrefine-laden">Daten richtig in OpenRefine laden&lt;/h2>
&lt;p>OpenRefine ist prinzipiell schon recht gut darin die richtige Kodierung beim Import der Daten für ein Projekt zu erkennen.
In Abbildung 4 wurde hier schon korrekt die Kodierung &amp;ldquo;UTF-8&amp;rdquo; erkannt.
Es ist prinzipiell trotzdem zu empfehlen in der Vorschau der Daten zu prüfen, ob Umlaute und Sonderzeichen auch richtig angezeigt werden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-optionen-für-den-projektimport">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Optionen für den Projektimport." srcset="
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-encoding-01_hu8224cd6c68e4b146c149cfc50ced7396_28906_609a81c91336d400472a9bb391998d6f.webp 400w,
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-encoding-01_hu8224cd6c68e4b146c149cfc50ced7396_28906_96158841abdcbb6ac3534c5db843db46.webp 760w,
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-encoding-01_hu8224cd6c68e4b146c149cfc50ced7396_28906_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-encoding-01_hu8224cd6c68e4b146c149cfc50ced7396_28906_609a81c91336d400472a9bb391998d6f.webp"
width="760"
height="190"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Optionen für den Projektimport.
&lt;/figcaption>&lt;/figure>
&lt;p>Gegebenenfalls muss das Encoding noch angepasst werden. Dafür auf das Encoding-Feld klicken. In Abbildung 4 ist es das Feld mit Text &amp;ldquo;UTF-8&amp;rdquo;.
Daraufhin öffnet sich ein Dialog mit einer Schnellauswahl von üblichen Kodierungen (Abbildung 5) und einen Tab &amp;ldquo;All Encodings&amp;rdquo;, mit einer ausführlichen Liste aller unterstützten Kodierungen (Abbildung 6).&lt;/p>
&lt;p>So kann das Encoding der Datei noch vor dem Projektimport manuell angepasst werden.&lt;/p>
&lt;p>
&lt;figure id="figure-bildschirmfoto-der-optionen-für-das-encoding">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Optionen für das Encoding." srcset="
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-encoding-02_hu6cf69b5052f0274e1670f6e7a972730a_24746_39c6f8fefb166ed16b89ee650e22a22e.webp 400w,
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-encoding-02_hu6cf69b5052f0274e1670f6e7a972730a_24746_2b59c5bf01ae822cd572e9fcabcddaa5.webp 760w,
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-encoding-02_hu6cf69b5052f0274e1670f6e7a972730a_24746_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-encoding-02_hu6cf69b5052f0274e1670f6e7a972730a_24746_39c6f8fefb166ed16b89ee650e22a22e.webp"
width="606"
height="461"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Optionen für das Encoding.
&lt;/figcaption>&lt;/figure>
&lt;figure id="figure-bildschirmfoto-der-erweiterten-optionen-für-das-encoding">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der erweiterten Optionen für das Encoding." srcset="
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-encoding-03_hu166d57fec80fb61be8c751b4a582d173_22962_1cffc7d155d7f8d8cdd667b705d99c38.webp 400w,
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-encoding-03_hu166d57fec80fb61be8c751b4a582d173_22962_2c392d814e7dd146c7385481e9a648af.webp 760w,
/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-encoding-03_hu166d57fec80fb61be8c751b4a582d173_22962_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-07-probleme-mit-umlauten-in-openrefine/screenshot-encoding-03_hu166d57fec80fb61be8c751b4a582d173_22962_1cffc7d155d7f8d8cdd667b705d99c38.webp"
width="608"
height="463"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der erweiterten Optionen für das Encoding.
&lt;/figcaption>&lt;/figure>
&lt;/p>
&lt;h2 id="nachgeladene-daten-anpassen">Nachgeladene Daten anpassen&lt;/h2>
&lt;p>Wir laden häufig auch Daten aus externen Quellen in ein existierendes Projekt.
Hierbei kann es vorkommen, dass die Kodierung der eingehenden Daten nicht zu den Daten im Projekt passt.&lt;/p>
&lt;p>Dafür gibt es die Möglichkeit die Daten mit der GREL Funktion &lt;a href="https://docs.openrefine.org/manual/grelfunctions#reinterprets-s-encodertarget-s-encodersource" target="_blank" rel="noopener">reinterpret()&lt;/a> anzupassen.&lt;/p>
&lt;p>Die Kodierung des OpenRefine Projektes findet man in den Metadaten unter &lt;code>import option metadata (JSON)&lt;/code>.
Die Kodierung der eingehenden Daten ist abhängig vom Projekt bzw. der API von der die Daten abgeholt werden.&lt;/p>
&lt;h2 id="reguläre-ausdrücke-mit-umlauten">Reguläre Ausdrücke mit Umlauten&lt;/h2>
&lt;p>Dem Thema &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/#aufgabe-10-vorsicht-bei-umlauten">Umlaute bei regulären Ausdrücken in OpenRefine&lt;/a> haben wir eine eigene Aufgabe in unserem &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/warum-openrefine/">OpenRefine Workshop für Fortgeschrittene&lt;/a> gewidmet.&lt;/p>
&lt;p>Hier die Kurzzusammenfassung: OpenRefine verwendet Java zur Auswertung der regulären Ausdrücke, wobei die Unicode Unterstützung separat aktiviert werden muss. Das hat zur Folge, dass &amp;ldquo;Sonderzeichen&amp;rdquo; wie unsere Umlaute &lt;em>äöü&lt;/em>, oder die in der französischen Sprache gebräuchlichen Buchstaben mit Akzenten &lt;em>éêè&lt;/em>, nicht von den Mustern &lt;code>[a-z]&lt;/code> oder &lt;code>\w&lt;/code> berücksichtigt werden.&lt;/p>
&lt;p>Um zum Beispiel auch Umlaute zu berücksichtigen gibt es mehrere Möglichkeiten:&lt;/p>
&lt;ol>
&lt;li>Umlaute explizit auflisten: &lt;code>[a-zäöüß]&lt;/code>&lt;/li>
&lt;li>Spezielle Klasse für Buchstaben (&lt;em>letter&lt;/em>) verwenden: &lt;code>\p{L}&lt;/code>&lt;/li>
&lt;li>Spezielle Klasse für alphabetische Zeichen verwenden: &lt;code>\p{IsAlphabetic}&lt;/code>&lt;/li>
&lt;li>Unicode Modus mit &lt;em>inline Flag&lt;/em> aktivieren: &lt;code>(?U)\w&lt;/code>&lt;/li>
&lt;/ol>
&lt;h2 id="probleme-mit-textfilter-und-umlauten">Probleme mit Textfilter und Umlauten&lt;/h2>
&lt;p>Manchmal haben wir in UTF-8 kodierten Projekten das Problem, dass Umlaute zwar korrekt dargestellt, Begriffe mit Umlauten z.B. über die Textfilter jedoch nicht gefunden werden.&lt;/p>
&lt;p>Das kann daran liegen, dass Umlaute in UTF-8 sowohl als einzelnes Zeichen wie &lt;code>ä&lt;/code> kodiert sein können, als auch als kombiniertes Zeichen aus &lt;code>a&lt;/code> und &lt;code>&amp;quot;&lt;/code> dargestellt werden können. &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>
Suchen wir dann zum Beispiel nach &lt;code>Gemälde&lt;/code>, so wird der als &lt;code>Gema&amp;quot;lde&lt;/code> kodierte Begriff nicht gefunden.&lt;/p>
&lt;p>Um zu prüfen, ob das in einem OpenRefine Projekt der Fall ist, gibt es mehrere Möglichkeiten:&lt;/p>
&lt;ol>
&lt;li>Einen Begriff mit Umlauten aus dem OpenRefine Projekt in einer separaten Datei speichern und mit einem &lt;a href="https://de.wikipedia.org/wiki/Hex-Editor" target="_blank" rel="noopener">Hex-Editor&lt;/a> analysieren.&lt;/li>
&lt;li>Mit einem &lt;a href="https://docs.openrefine.org/manual/facets#custom-text-facet" target="_blank" rel="noopener">Custom Text Facet&lt;/a> und dem GREL Ausdruck &lt;code>value.unicode()&lt;/code> prüfen, ob es &lt;a href="https://de.wikipedia.org/wiki/Kombinierendes_Zeichen" target="_blank" rel="noopener">kombinierte Zeichen&lt;/a> wie das UTF-Zeichen 771 für den ergänzenden &lt;code>&amp;quot;&lt;/code> gibt.&lt;/li>
&lt;li>In einem Textfilter reguläre Ausdrücke aktivieren und die Sonderzeichen im Suchbegriff durch einen bzw. zwei Punkte &lt;code>..&lt;/code> (universeller Platzhalter) ersetzen. Also nach &lt;code>Gem.lde&lt;/code> und nach &lt;code>Gem..lde&lt;/code> suchen. Gibt es Ergebnisse mit Umlauten bei einem Punkt, dann sind die Umlaute mit einem Zeichen kodiert, gibt es Ergebnisse mit Umlauten nur bei zwei Punkten, sind sie als getrennte Zeichen kodiert.&lt;/li>
&lt;/ol>
&lt;p>GREL bietet zwar die Möglichkeit mit &lt;a href="https://docs.openrefine.org/manual/grelfunctions#reinterprets-s-encodertarget-s-encodersource" target="_blank" rel="noopener">reinterpret&lt;/a> den Text in eine andere Kodierung umzuwandeln, jedoch nicht die interne Kodierung von UTF-8 anzupassen.&lt;/p>
&lt;p>Dafür benötigen wir entweder die &lt;a href="https://docs.oracle.com/javase/tutorial/i18n/text/normalizerapi.html" target="_blank" rel="noopener">Normalizer Standardfunktionalität&lt;/a> von Java via Clojure, oder die Standardbibliothek &lt;a href="https://docs.python.org/2.7/library/unicodedata.html" target="_blank" rel="noopener">unicodedata&lt;/a> von Python via Jython.&lt;/p>
&lt;p>Hier ist der entsprechende Ausdruck in Clojure:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-clojure" data-lang="clojure">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nf">java.text.Normalizer/normalize&lt;/span> &lt;span class="nv">value&lt;/span> &lt;span class="nv">java.text.Normalizer$Form/NFC&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Hier der entsprechende Ausdruck in Python/Jython:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">unicodedata&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">normalize&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="n">normalize&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;NFC&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">value&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Diese Schnippsel können z.B. via
&amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;rdquo;
auf ausgewählte oder alle Spalten im OpenRefine Projekt angewendet werden.&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Die Unterstützung von Sonderzeichen und damit speziell Umlauten in der deutschen Sprache ist in OpenRefine nicht optimal.
Das ist in den meisten Fällen technisch begründbar und es gibt Lösungen, jedoch ist es gerade für technische Laien problematisch das Problem so zu formulieren, dass die entsprechenden Lösungsansätze dafür gefunden werden.&lt;/p>
&lt;p>Mit diesem Artikel hoffen wir, die Sichtbarkeit der möglichen Lösungen für Umlautprobleme in OpenRefine zu erhöhen.&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Siehe dazu den Artikel zu &lt;a href="https://de.wikipedia.org/wiki/Normalisierung_%28Unicode%29" target="_blank" rel="noopener">Normalisierung von Unicode auf Wikipedia&lt;/a>.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Workshop - Arbeiten mit GREL</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/</guid><description>&lt;p>In diesem Tutorial beschäftigen wir uns mit der &amp;ldquo;General Refine Expression Language&amp;rdquo; (GREL).&lt;/p>
&lt;h2 id="einführung">Einführung&lt;/h2>
&lt;blockquote>
&lt;p>GREL in der &lt;a href="https://docs.openrefine.org/manual/expressions" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;br>
GREL Rezepte im &lt;a href="https://github.com/OpenRefine/OpenRefine/wiki/Recipes" target="_blank" rel="noopener">OpenRefine Wiki&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;p>Mit der &lt;em>General Refine Expression Language&lt;/em> (GREL) werden in OpenRefine die einzelnen Operationen auf den Daten ausgeführt.
Die meisten Funktionen und Dialoge in OpenRefine sind quasi nur ein Eingabeformular für GREL Ausdrücke,
die in den Facets angezeigten Daten basieren auf GREL Ausdrücken und in verschiedenen Dialogen können wir auch direkt GREL Ausdrücke verwenden, um zum Beispiel Daten zu transformieren.&lt;/p>
&lt;p>Die Syntax von GREL ist dabei an die Programmiersprache &lt;a href="https://de.wikipedia.org/wiki/JavaScript" target="_blank" rel="noopener">JavaScript&lt;/a> angelehnt, die unterliegende Technologie basiert jedoch auf der Programmiersprache &lt;a href="https://de.wikipedia.org/wiki/Java-Technologie" target="_blank" rel="noopener">Java&lt;/a>.
Dadurch entstehen Verständnisprobleme, wenn zum Beispiel reguläre Ausdrücke im Stil von JavaScript geschrieben werden,
dann jedoch in OpenRefine intern von Java ausgewertet werden und entsprechend die Funktionalität von regulären Ausdrücken in Java unterstützen.&lt;/p>
&lt;p>Die Eingabe von GREL Ausdrücken erfolgt (meistens) über Dialogfenster wie in Abbildung 1.
Hier sehen wir nicht nur eine Vorschau der Umwandlung, die wir gerade anstreben, sondern können auch vorherige oder gespeicherte (&lt;em>Starred&lt;/em>) GREL Ausdrücke laden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-eines-dialog-fensters-zur-transformation-von-daten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto eines Dialog Fensters zur Transformation von Daten in OpenRefine." srcset="
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-dialog_hua71ff9a0142e0958db5b592ee2c14782_23356_aaddd7ddcf7efbe93ed3bb28ae4854b6.webp 400w,
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-dialog_hua71ff9a0142e0958db5b592ee2c14782_23356_fdcf9e0e2fff7ecc7edec1973a2a3769.webp 760w,
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-dialog_hua71ff9a0142e0958db5b592ee2c14782_23356_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-dialog_hua71ff9a0142e0958db5b592ee2c14782_23356_aaddd7ddcf7efbe93ed3bb28ae4854b6.webp"
width="628"
height="647"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto eines Dialog Fensters zur Transformation von Daten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="werte-variablen-objekte">Werte, Variablen, Objekte&lt;/h3>
&lt;p>In Programmiersprachen gibt es verschiedene Konzepte um mit Daten zu arbeiten.&lt;/p>
&lt;p>Ein Konzept ist die Typisierung von Daten. So wird bei Werten zum Beispiel zwischen Text und Zahlen unterschieden.
Mit diesen Werten können dann verschiedene Operationen und Berechnungen durchgeführt werden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="m">5&lt;/span> &amp;gt; &lt;span class="m">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;gt; &lt;span class="nb">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Diesen Werten können via Variablen auch Namen zugewiesen werden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">laenge&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">breite&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">laenge &amp;gt; breite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;gt; &lt;span class="nb">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Oder es gibt spezielle Funktionen für Werte eines bestimmten Typs:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;Lorem ipsum&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">length&lt;span class="o">(&lt;/span>text&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;gt; &lt;span class="m">11&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Werte und Funktionen lassen sich zu Objekten zusammenfassen.
Via Variable kann ein bestimmtes Objekt gespeichert und darauf zugegriffen werden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">Rechteck&lt;span class="o">(&lt;/span>laenge, breite&lt;span class="o">)&lt;/span>:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">laenge&lt;/span> &lt;span class="o">=&lt;/span> leange
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">breite&lt;/span> &lt;span class="o">=&lt;/span> breite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> flaeche&lt;span class="o">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> laenge * breite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">rechteck1&lt;/span> &lt;span class="o">=&lt;/span> Rechteck&lt;span class="o">(&lt;/span>5, 2&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">rechteck2&lt;/span> &lt;span class="o">=&lt;/span> Rechteck&lt;span class="o">(&lt;/span>4, 2&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rechteck1.flaeche &amp;gt; rechteck2.flaeche
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;gt; &lt;span class="nb">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>In GREL verwenden wir hauptsächlich schon existierende Variablen, Funktionen und Objekte.&lt;/p>
&lt;h3 id="datentypen">Datentypen&lt;/h3>
&lt;p>In der OpenRefine Oberfläche arbeiten wir mit vier Datentypen: &lt;em>boolean&lt;/em>, &lt;em>date&lt;/em>, &lt;em>number&lt;/em> und &lt;em>string&lt;/em>.
In GREL gibt es noch die Datentypen &lt;em>array&lt;/em>, &lt;em>object&lt;/em> und &lt;em>regex&lt;/em>.
Texte (&lt;em>string&lt;/em>) können zusätzlich in eine Repräsentation für &lt;em>HTML&lt;/em>, &lt;em>JSON&lt;/em> oder &lt;em>XML&lt;/em> geparsed werden.
Das bedeutet vereinfacht, dass die (Text-)Daten intern von OpenRefine in eine Repräsentation überführt werden, die zum Beispiel XML versteht und dafür passende Funktionen anbietet. Also zum Beispiel die Funktion über alle XML-Knoten mit einem bestimmten Namen zu iterieren.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Typ&lt;/th>
&lt;th>Kürzel&lt;/th>
&lt;th>GUI&lt;/th>
&lt;th>Beispiel(e)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>array&lt;/td>
&lt;td>a&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;code>[&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;]&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>boolean&lt;/td>
&lt;td>b&lt;/td>
&lt;td>Ja&lt;/td>
&lt;td>&lt;code>true&lt;/code>, &lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>date&lt;/td>
&lt;td>d&lt;/td>
&lt;td>Ja&lt;/td>
&lt;td>&lt;code>[date 2022-05-03T15:00:00Z]&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>number&lt;/td>
&lt;td>n&lt;/td>
&lt;td>Ja&lt;/td>
&lt;td>&lt;code>1&lt;/code>, &lt;code>3.1415&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>object&lt;/td>
&lt;td>o&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;code>[object Cell]&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>regex&lt;/td>
&lt;td>p&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;code>/\d{4}/&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>string&lt;/td>
&lt;td>s&lt;/td>
&lt;td>Ja&lt;/td>
&lt;td>&lt;code>Lorem ipsum...&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="variablen">Variablen&lt;/h3>
&lt;p>Beim Arbeiten mit GREL stehen uns zusätzlich einige &lt;a href="https://docs.openrefine.org/manual/expressions#variables" target="_blank" rel="noopener">Umgebungsvariablen&lt;/a> zur Verfügung.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Variable&lt;/th>
&lt;th>Alternative&lt;/th>
&lt;th>Beschreibung&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>cell&lt;/td>
&lt;td>row.cells[columnName]&lt;/td>
&lt;td>Aktuelle Zelle der ausgewählten Spalte.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cell.recon&lt;/td>
&lt;td>&lt;/td>
&lt;td>Reconciliation Daten für die Zelle.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cell.recon. &amp;hellip;&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;a href="https://docs.openrefine.org/manual/expressions#reconciliation" target="_blank" rel="noopener">Dokumentation zu Recon&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cell.value&lt;/td>
&lt;td>value&lt;/td>
&lt;td>Wert der Zelle.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cell. &amp;hellip;.&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;a href="https://docs.openrefine.org/manual/expressions#cell" target="_blank" rel="noopener">Dokumentation zu Cell&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>columnName&lt;/td>
&lt;td>&lt;/td>
&lt;td>Name der ausgewählten Spalte.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>row&lt;/strong>&lt;/td>
&lt;td>&lt;/td>
&lt;td>Aktuelle Zeile.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>row.cells&lt;/td>
&lt;td>cells&lt;/td>
&lt;td>Zellen in der aktuellen Zeile.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>row.cells. &amp;hellip;&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;a href="https://docs.openrefine.org/manual/expressions#cells" target="_blank" rel="noopener">Dokumentation zu Cells&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>row.index&lt;/td>
&lt;td>rowIndex&lt;/td>
&lt;td>Index der aktuellen Zeile.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>row.record&lt;/td>
&lt;td>&lt;/td>
&lt;td>Record der aktuellen Zeile.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>row.record. &amp;hellip;&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;a href="https://docs.openrefine.org/manual/expressions#record" target="_blank" rel="noopener">Dokumentation zu Record&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>row. &amp;hellip;.&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;a href="https://docs.openrefine.org/manual/expressions#row" target="_blank" rel="noopener">Dokumentation zu Row&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>value1&lt;/td>
&lt;td>&lt;/td>
&lt;td>Neu seit OpenRefine 3.9 für &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/#distance-functions">Distanz basiertes Clustering&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>value2&lt;/td>
&lt;td>&lt;/td>
&lt;td>Neu seit OpenRefine 3.9 für &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/#distance-functions">Distanz basiertes Clustering&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Die Variablen beinhalten teilweise einfache Werte (&lt;code>value&lt;/code>, &lt;code>rowIndex&lt;/code>) wie einen Text oder eine Zahl.
Teilweise verweisen sie auf komplexe Objekte, worin die Werte gesammelt oder verschachtelt gespeichert sind (&lt;code>row&lt;/code>).
Manche Variablen stellen auch Abkürzungen dar. So kann auf den Wert der aktuellen Zeile in der ausgewählten Spalte direkt mit &lt;code>value&lt;/code> zugegriffen werden, anstatt dies via &lt;code>row.cells[columnName].value&lt;/code> machen zu müssen.&lt;/p>
&lt;p>Hier eine Übersicht der Objekte und Variablen.&lt;/p>
&lt;div class="mermaid">---
title: Datenstruktur
config:
look: handDrawn
theme: neutral
---
flowchart LR
columnName
row.index[index]
row.cells[cells]
row.columnNames[columnNames]
row.starred[starred]
row.flagged[flagged]
row.record[record]
row.cells.cell[cell...]
row.cells.cell.value[value]
row.cells.cell.recon[recon]
row.cells.cell.recon.properties[...]
row.cells.cell.errorMessage[errorMessage]
row.cells.cell.errorMessage.value[value]
row.record.index[index]
row.record.cells[cells]
row.record.fromRowIndex[fromRowIndex]
row.record.toRowIndex[toRowIndex]
row.record.rowCount[rowCount]
row --> row.index &amp; row.cells &amp; row.columnNames &amp; row.starred &amp; row.flagged &amp; row.record
row.cells --> row.cells.cell
row.cells.cell --> row.cells.cell.value &amp; row.cells.cell.recon &amp; row.cells.cell.errorMessage
row.cells.cell.errorMessage --> row.cells.cell.errorMessage.value
row.cells.cell.recon --> row.cells.cell.recon.properties
row.record --> row.record.index &amp; row.record.cells &amp; row.record.fromRowIndex &amp; row.record.toRowIndex &amp; row.record.rowCount
cell -.-> row.cells.cell
cells -.-> row.cells
rowIndex -.-> row.index
value -.-> row.cells.cell.value
&lt;/div>
&lt;p>Fortsetzung für Reconciliation Daten einer Zelle:&lt;/p>
&lt;div class="mermaid">---
title: Datenstruktur - recon
config:
look: handDrawn
theme: neutral
---
flowchart LR
row.cells.cell.recon[row.cells.cell....recon]
row.cells.cell.recon.judgment[judgment]
row.cells.cell.recon.judgmentAction[judgmentAction]
row.cells.cell.recon.judgmentHistory[judgmentHistory]
row.cells.cell.recon.matched[matched]
row.cells.cell.recon.match[match]
row.cells.cell.recon.best[best]
row.cells.cell.recon.features[features]
row.cells.cell.recon.candidates[candidates]
row.cells.cell.recon.features.typeMatch[typeMatch]
row.cells.cell.recon.features.nameMatch[nameMatch]
row.cells.cell.recon.features.nameLevenshtein[nameLevenshtein]
row.cells.cell.recon.features.nameWordDistance[nameWordDistance]
match.id[id]
match.name[name]
match.type[type]
match.score[score]
row.cells.cell.recon --> row.cells.cell.recon.judgment &amp; row.cells.cell.recon.judgmentAction &amp; row.cells.cell.recon.judgmentHistory &amp; row.cells.cell.recon.matched &amp; row.cells.cell.recon.match &amp; row.cells.cell.recon.best &amp; row.cells.cell.recon.features &amp; row.cells.cell.recon.candidates
row.cells.cell.recon.match --> match.id &amp; match.name &amp; match.type
row.cells.cell.recon.best --> match.id &amp; match.name &amp; match.type &amp; match.score
row.cells.cell.recon.candidates --> match.id &amp; match.name &amp; match.type &amp; match.score
row.cells.cell.recon.features --> row.cells.cell.recon.features.typeMatch &amp; row.cells.cell.recon.features.nameMatch &amp; row.cells.cell.recon.features.nameLevenshtein &amp; row.cells.cell.recon.features.nameWordDistance
&lt;/div>
&lt;p>Auf Attribute eines Objekts kann punktnotiert &lt;code>row.cells&lt;/code> oder via Klammern &lt;code>row[&amp;quot;cells&amp;quot;]&lt;/code> zugegriffen werden.
Prinzipiell empfiehlt es sich aus Gründen der Lesbarkeit die Punktnotation zu verwenden und die Variante mit Klammern nur, wenn der Name in einer Variablen steht &lt;code>cells[columnName]&lt;/code> oder wir mit Spaltennamen arbeiten, die potentiell &amp;ldquo;Sonderzeichen&amp;rdquo; beinhalten können &lt;code>cells[&amp;quot;GND-ID&amp;quot;]&lt;/code>.&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
Aktuell kann nicht auf &lt;strong>alle&lt;/strong> Werte einer Spalte zugegriffen werden.
Man kann aber auf alle Werte einer Spalte eines Records zugreifen: &lt;code>row.record.cells[columnName]&lt;/code>.
&lt;/div>
&lt;/div>
&lt;h3 id="kontrollstrukturen">Kontrollstrukturen&lt;/h3>
&lt;p>Etwas verwirrend ist das Definieren von eigenen Variablen in GREL.
Das geschieht mit einer &lt;a href="https://docs.openrefine.org/manual/grel#withe1-variable-v-e2" target="_blank" rel="noopener">with&lt;/a> Anweisung.
Im folgenden Beispiel setzen wir die Variable &lt;code>jahr&lt;/code> auf den Wert &lt;code>1988&lt;/code> und berechnen dann den Ausdruck &lt;code>jahr &amp;lt; 2000&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1988&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">jahr&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">jahr&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">2000&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-note">
&lt;div>
Wir geben das erwartete Ergebnis der GREL Ausdrücke in den Beispielen zusätzlich via &lt;code>== ...&lt;/code> an, so dass das Ergebnis auch abgelesen werden kann, ohne den Ausdruck in OpenRefine oder im Kopf auswerten zu müssen.
&lt;/div>
&lt;/div>
&lt;p>Eine der essentiellen Kontrollstrukturen in der Informatik ist die Verzweigung.
In GREL wird dies mit &lt;a href="https://docs.openrefine.org/manual/grel#ife-etrue-efalse" target="_blank" rel="noopener">if&lt;/a> realisiert.
Im folgenden Beispiel setzen wir wie zuvor die Variable &lt;code>jahr&lt;/code> auf den Wert &lt;code>1988&lt;/code>, geben aber abhängig von dem Ergebnis einer Prüfung unterschiedliche Werte zurück. Die if-Anweisungen können auch ineinander verschachtelt werden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1988&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">jahr&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">if&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="nx">jahr&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">1980&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">and&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">jahr&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">1990&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="s2">&amp;#34;80er&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Sonstiges&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;80er&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anstatt einer Verzweigung ist es manchmal auch nötig eine komplette Liste (technisch Array) von Werten zu filtern.
Dafür gibt es in GREL eine &lt;a href="https://docs.openrefine.org/manual/grel#filtere1-v-e-test" target="_blank" rel="noopener">filter()&lt;/a> Funktion.
Im folgenden Beispiel erstellen wir einen Array aus einem Text indem wir ihn mit &lt;a href="https://docs.openrefine.org/manual/grelfunctions#splits-s-or-p-sep-b-preservetokens-optional" target="_blank" rel="noopener">split()&lt;/a> am Trennzeichen &lt;code>,&lt;/code> trennen.
Anschließend wandeln die einzelnen Elemente mit &lt;a href="https://docs.openrefine.org/manual/grelfunctions#tonumbers" target="_blank" rel="noopener">toNumber()&lt;/a> in Zahlen um und filtern anschließend nur die geraden Zahlen via &lt;code>mod(number, 2) == 2&lt;/code>.
Um das Ergebnis in OpenRefine ausgeben zu können, wandeln wir die Daten im Array anschließend mit &lt;a href="https://docs.openrefine.org/manual/grelfunctions#joina-sep" target="_blank" rel="noopener">join()&lt;/a> wieder in einen Text um, da OpenRefine in der GUI keine Arrays anzeigen kann.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;1,2,3,4,5,6,7,8,9,10&amp;#34;&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toNumber&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;2,4,6,8,10&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Um alle Werte einer Liste (technisch Array) durchzugehen, gibt es in GREL die
&lt;a href="https://docs.openrefine.org/manual/grel#foreache1-v-e2" target="_blank" rel="noopener">forEach&lt;/a> Anweisung.
Im folgenden Beispiel erstellen wir mit &lt;code>split()&lt;/code> einen Array aus einem Text und fügen mit &lt;code>+&lt;/code> zu jedem Element die Endung &amp;ldquo;er&amp;rdquo; hinzu.
Anschließend fügen wir die Daten im Array mit &lt;code>join()&lt;/code> wieder zu einen Text zusammen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;70,80,90&amp;#34;&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">v&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;er&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;70er,80er,90er&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Zusätzlich gibt es noch weitere Helfer. Um den Typ eines Wertes zu prüfen gibt es verschiedene Varianten von &lt;a href="https://docs.openrefine.org/manual/grel#isblanke-isnonblanke-isnulle-isnotnulle-isnumerice-iserrore" target="_blank" rel="noopener">is&amp;hellip;&lt;/a>, um einen bestimmten Bereich aufzuzählen &lt;a href="https://docs.openrefine.org/manual/grel#forrangen-from-n-to-n-step-v-e" target="_blank" rel="noopener">forRange&lt;/a> oder um eine Liste (technisch Array) aufzuzählen &lt;a href="https://docs.openrefine.org/manual/grel#foreachindexe1-i-v-e2" target="_blank" rel="noopener">forEachIndex&lt;/a>.&lt;/p>
&lt;details class="spoiler " id="spoiler-6">
&lt;summary>Extra: forNonBlank&lt;/summary>
&lt;p>&lt;p>Da sie etwas verwirrend ist, geben wir der Funktion &lt;a href="https://docs.openrefine.org/manual/grel#fornonblanke-v-enonblank-eblank" target="_blank" rel="noopener">forNonBlank&lt;/a> hier noch einen separaten Absatz.
Angenommen wir wollen eine Liste (technisch Array) von Werten durchgehen und dabei nur Werte bearbeiten, die einen Inhalt haben.
Also zum Beispiel die &lt;code>[&amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;4&amp;quot;, &amp;quot;5&amp;quot;]&lt;/code> umwandeln in &lt;code>1,2,0,4,5&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forNonBlank&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="s2">&amp;#34;1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;4&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;5&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;1,2,,4,5&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Das klappt so nicht, da &lt;code>forNonBlank(v, ...)&lt;/code> eine andere Schreibweise für &lt;code>if(isNonBlank(v), ...)&lt;/code> ist.
Der korrekte Weg ist also einer der beiden folgenden Ausdrücke.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="s2">&amp;#34;1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;4&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;5&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isNonBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">v&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;1,2,0,4,5&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="s2">&amp;#34;1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;4&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;5&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">forNonBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;1,2,0,4,5&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h3 id="standardbibliothek">Standardbibliothek&lt;/h3>
&lt;p>Üblicherweise haben Programmiersprachen eine Standardbibliothek von Funktionen zum Arbeiten mit den zur Verfügung gestellten Datentypen.&lt;/p>
&lt;p>Diese ist bei GREL im Vergleich zu anderen Programmiersprachen zwar recht übersichtlich, kann hier aber trotzdem nicht vollständig besprochen werden.
Wir empfehlen daher, die &lt;a href="https://docs.openrefine.org/manual/grelfunctions" target="_blank" rel="noopener">Liste der in OpenRefine verfügbaren Funktionen&lt;/a> als Referenz verfügbar zu halten.&lt;/p>
&lt;p>Wir gehen hier auf ein paar Besonderheiten von GREL ein.&lt;/p>
&lt;h4 id="syntax-für-funktionsaufrufe">Syntax für Funktionsaufrufe&lt;/h4>
&lt;p>Eine Besonderheit in GREL ist, dass Funktionen zur besseren Lesbarkeit auch in Punktnotation aufgerufen werden können.
Also &lt;code>length(value)&lt;/code> auch geschrieben werden kann als &lt;code>value.length()&lt;/code>.&lt;/p>
&lt;h4 id="aliase">Aliase&lt;/h4>
&lt;p>Es gibt Funktionen, die unter mehreren Namen verfügbar sind.&lt;/p>
&lt;p>Beispielsweise sind &lt;a href="https://docs.openrefine.org/manual/grelfunctions#trims" target="_blank" rel="noopener">trim()&lt;/a> und &lt;a href="https://docs.openrefine.org/manual/grelfunctions#strips" target="_blank" rel="noopener">strip()&lt;/a> bis auf ihre Namen identisch und wurden auch &lt;a href="https://github.com/OpenRefine/OpenRefine/commit/f1923758e771f1c3ce385859599cf2c06d6d9d71" target="_blank" rel="noopener">gleichzeitig&lt;/a> in OpenRefine eingeführt.
Vermutlich sollte das Quereinsteigern von anderen Programmiersprachen den Einstieg vereinfachen.&lt;/p>
&lt;h2 id="vorbereitung-projekt-erstellen">Vorbereitung: Projekt erstellen&lt;/h2>
&lt;p>Wir laden die folgende Datei in ein OpenRefine Projekt.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/09_kretschmann-kabinett-iii-grel.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Kretschmann Kabinett III&lt;/a>
&lt;p>Wie in Abbildung 2 beinhaltet die Datei das Kabinett Kretschmann III mit den Berufen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-direkt-nach-dem-laden">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes direkt nach dem Laden." srcset="
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-start_hucaa2914f8e6f784b182b02a52782faf6_32946_35fd9e933e599a3cfaf21fbfaa66933a.webp 400w,
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-start_hucaa2914f8e6f784b182b02a52782faf6_32946_97d584b4dd42d2964deb633925819e2a.webp 760w,
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-start_hucaa2914f8e6f784b182b02a52782faf6_32946_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-start_hucaa2914f8e6f784b182b02a52782faf6_32946_35fd9e933e599a3cfaf21fbfaa66933a.webp"
width="760"
height="210"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes direkt nach dem Laden.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-1-grel-variablen-nutzen">Aufgabe 1: GREL Variablen nutzen&lt;/h2>
&lt;p>Das Geburtsdatum ist in drei Spalten aufgeteilt, wir wollen das Geburtsdatum jedoch in einer Spalte haben und dabei den Monat auch noch ausgeschrieben haben.
Das haben wir in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/#aufgabe-5-spalten-zusammenf%C3%BChren">03 Transformieren: Aufgabe 5&lt;/a> so ähnlich schon einmal mit Funktionen in der Benutzeroberfläche gelöst.
Hier wollen wir GREL Funktionen verwenden, um die Bearbeitung in einem Schritt durchzuführen.&lt;/p>
&lt;p>Dafür verwenden wir
&amp;ldquo;Geburtsjahr&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;rdquo;
und entwickeln schrittweise den in Abbildung 3 gezeigten GREL Ausdruck.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialogs-zur-transformation">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialogs zur Transformation." srcset="
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-geburtsdatum_hu167ffd8fd3774eb2db5afd8a5930610c_27972_9d760af1f939e4e979b9eb59914f2681.webp 400w,
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-geburtsdatum_hu167ffd8fd3774eb2db5afd8a5930610c_27972_22b9fe69ce55c9872391a1afb88bdc25.webp 760w,
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-geburtsdatum_hu167ffd8fd3774eb2db5afd8a5930610c_27972_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-geburtsdatum_hu167ffd8fd3774eb2db5afd8a5930610c_27972_9d760af1f939e4e979b9eb59914f2681.webp"
width="759"
height="596"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialogs zur Transformation.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="schritt-1-geburtsmonat-umwandeln">Schritt 1: Geburtsmonat umwandeln&lt;/h3>
&lt;p>Um die Spalte &amp;ldquo;Geburtsmonat&amp;rdquo; in einen Namen umzuwandeln verwenden wir den Zugriff über &lt;code>row.cells[&amp;quot;Geburtsjahr&amp;quot;]&lt;/code> und die Funktionen &lt;a href="https://docs.openrefine.org/manual/grelfunctions#todateo-b-monthfirst-s-format1-s-format2-" target="_blank" rel="noopener">toDate()&lt;/a> und &lt;a href="https://docs.openrefine.org/manual/grelfunctions#tostringo-string-format-optional" target="_blank" rel="noopener">toString()&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtsmonat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toDate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;M&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">toString&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;MMMM&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="schritt-2-spalten-zusammenfügen">Schritt 2: Spalten zusammenfügen&lt;/h3>
&lt;p>Um die Spalten zusammenzufügen verwenden wir den Operator &lt;code>+&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtstag&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;. &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtsmonat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtsjahr&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="schritt-3-verzweigung-einbauen">Schritt 3: Verzweigung einbauen&lt;/h3>
&lt;p>Für manche Zeilen wird entweder eine Fehlermeldung oder &lt;code>null&lt;/code> angezeigt.
Das sind die Zeilen, wo kein Geburtstag und kein Geburtsmonat vorhanden sind.&lt;/p>
&lt;p>Diese behandeln wir separat mit einer Verzweigung und passen dabei den Typ der Inhalte der Spalte &amp;ldquo;Geburtsjahr&amp;rdquo; an.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">isBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtstag&amp;#34;&lt;/span>&lt;span class="p">]),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtsjahr&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toString&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="aufgabe-1">Aufgabe 1&lt;/h3>
&lt;p>Fügen Sie die drei obigen GREL Ausdrücke zu einem GREL Ausdruck zusammen.&lt;/p>
&lt;details class="spoiler " id="spoiler-13">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">isBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtstag&amp;#34;&lt;/span>&lt;span class="p">]),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtsjahr&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toString&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtstag&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;. &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtsmonat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toDate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;M&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">toString&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;MMMM&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtsjahr&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-2-werte-aufräumen-und-sortieren">Aufgabe 2: Werte aufräumen und sortieren&lt;/h2>
&lt;p>Die Werte in der Spalte &amp;ldquo;Beruf oder Beschäftigung&amp;rdquo; sind nicht sortiert, haben teilweise Duplikate und teilweise numerische Referenzen hinter den Berufsbezeichnungen.
Diese Spalte wollen wir daher in einem Schritt mit einem GREL Ausdruck aufräumen und dabei die numerischen Referenzen entfernen, Duplikate entfernen und die Werte alphabetisch sortieren.&lt;/p>
&lt;p>Dafür verwenden wir den Dialog
&amp;ldquo;Beruf oder Beschäftigung&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;rdquo;
und erarbeiten uns einen GREL Ausdruck.&lt;/p>
&lt;h3 id="schritt-1-text-in-liste-umwandeln">Schritt 1: Text in Liste umwandeln&lt;/h3>
&lt;p>Um die einzelnen Werte im Text in eine Liste (technisch Array) umzuwandeln, verwenden wir &lt;a href="https://openrefine.org/docs/manual/grelfunctions#splits-s-or-p-sep-b-preservetokens-optional" target="_blank" rel="noopener">split()&lt;/a> mit &lt;code>,&lt;/code> als Trennzeichen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;Politiker, Abgeordneter, Lehrer, Regierungschef, Politiker (5), Lehrer (3)&amp;#34;&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;, &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="schritt-2-numerische-referenzen-entfernen">Schritt 2: Numerische Referenzen entfernen&lt;/h3>
&lt;p>Um die numerischen Referenzen zu entfernen verwenden wir &lt;a href="https://docs.openrefine.org/manual/grelfunctions#replaces-s-or-p-find-s-replace" target="_blank" rel="noopener">replace()&lt;/a> mit einem regulären Ausdruck und entfernen zusätzliche Leerzeichen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;Politiker (5)&amp;#34;&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\(\d+\)/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="schritt-3-funktion-auf-alle-elemente-anwenden">Schritt 3: Funktion auf alle Elemente anwenden&lt;/h3>
&lt;p>Um die Ersetzung der numerischen Referenzen auf alle Elemente in der Liste (technisch Array) anzuwenden nutzen wir &lt;a href="https://docs.openrefine.org/manual/grel#foreache1-v-e2" target="_blank" rel="noopener">forEach&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Politiker, Abgeordneter, Lehrer, Regierungschef, Politiker (5), Lehrer (3)&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="schritt-4-werte-vereinheitlichen-und-sortieren">Schritt 4: Werte vereinheitlichen und sortieren&lt;/h3>
&lt;p>Um die Werte zu vereinheitlichen und zu sortieren nutzen wir &lt;a href="https://docs.openrefine.org/manual/grelfunctions#uniquesa" target="_blank" rel="noopener">uniques()&lt;/a> und &lt;a href="https://docs.openrefine.org/manual/grelfunctions#sorta" target="_blank" rel="noopener">sort()&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Politiker, Abgeordneter, Lehrer, Regierungschef, Politiker, Lehrer&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">uniques&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">sort&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="schritt-5-text-aus-liste-erstellen">Schritt 5: Text aus Liste erstellen&lt;/h3>
&lt;p>Um aus der Liste (technisch Array) wieder einen Text zu erzeugen, verwenden wir &lt;a href="https://docs.openrefine.org/manual/grelfunctions#joina-sep" target="_blank" rel="noopener">join()&lt;/a> mit &lt;code>,&lt;/code> als Trennzeichen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Abgeordneter&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Lehrer&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Politiker&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Regierungschef&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;, &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="aufgabe-3">Aufgabe 3&lt;/h3>
&lt;p>Fügen Sie die fünf obigen GREL Ausdrücke zu einem GREL Ausdruck zusammen.
Das Ergebnis sollte in etwa wie in Abbildung 4 aussehen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-nach-der-bearbeitung">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes nach der Bearbeitung." srcset="
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-ziel_hu31884fd8468e9c60e0fcc9ebd508d4bd_29493_429f4d7120b8c3c72d377983cae502af.webp 400w,
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-ziel_hu31884fd8468e9c60e0fcc9ebd508d4bd_29493_79ac9b03c7a5805ff8e688c808b06fef.webp 760w,
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-ziel_hu31884fd8468e9c60e0fcc9ebd508d4bd_29493_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-ziel_hu31884fd8468e9c60e0fcc9ebd508d4bd_29493_429f4d7120b8c3c72d377983cae502af.webp"
width="732"
height="322"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes nach der Bearbeitung.
&lt;/figcaption>&lt;/figure>
&lt;details class="spoiler " id="spoiler-17">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;, &amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\(\d+\)/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">uniques&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">sort&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;, &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Viele Umwandlungen lassen sich in Einzelschritten über die graphische Oberfläche von OpenRefine ansteuern und umsetzen.
So kommt man auch ohne in GREL zu programmieren in OpenRefine recht weit.
Das Wissen um den Zugriff auf die Umgebungsvariablen und nützliche Funktionen wie &lt;code>find()&lt;/code>, &lt;code>replace()&lt;/code> oder Datumsumwandlungen ersetzt viele manuelle Schritte.&lt;/p>
&lt;p>Das explizite Programmieren mit Verzweigungen und Schleifen ergänzt Arbeitsschritte oder reduziert mehrere Einzelschritte in der graphischen Oberfläche zu einem Schritt. Beim &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/">Export von XML in OpenRefine (Templating)&lt;/a> sind die Kontrollstrukturen noch einmal relevant.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil behandeln wir das Konzept von &amp;ldquo;Records&amp;rdquo; in OpenRefine.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records" class="btn btn-primary px-3 py-3">10 Arbeiten mit Records&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Arbeiten mit regulären Ausdrücken</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/</guid><description>&lt;p>Ein wichtiges Werkzeug beim Arbeiten mit Daten sind reguläre Ausdrücke.
Diese werden in OpenRefine von verschiedenen Funktionen unterstützt.&lt;/p>
&lt;h2 id="einführung">Einführung&lt;/h2>
&lt;blockquote>
&lt;p>Reguläre Ausdrücke in der &lt;a href="https://docs.openrefine.org/manual/expressions#regular-expressions" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;p>Mit regulären Ausdrücken können wir Muster definieren, mit denen wir bestimmte Zeichenfolgen in einem Text finden, extrahieren und/oder ersetzen können. Dies funktioniert nicht nur in Programmiersprachen wie Python oder Programmen wie OpenRefine, sondern auch in frei verfügbaren Text Editoren wie &lt;a href="https://notepad-plus-plus.org/" target="_blank" rel="noopener">Notepad++&lt;/a> oder &lt;a href="https://code.visualstudio.com/" target="_blank" rel="noopener">Visual Studio Code&lt;/a>.&lt;/p>
&lt;figure id="figure-perl-problemshttpsxkcdcom1171-von-randall-munroe-unter-cc-by-nc-lizenzhttpcreativecommonsorglicensesby-nc25">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="[Perl Problems](https://xkcd.com/1171/) von Randall Munroe unter [CC BY-NC Lizenz](http://creativecommons.org/licenses/by-nc/2.5/)." srcset="
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/perl_problems_hu0e0484462f33f916343aead87d9b7933_20532_8fdf08fae82e8346817146df2a00337b.webp 400w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/perl_problems_hu0e0484462f33f916343aead87d9b7933_20532_df861a877b6fd6a5993e9f6618d9596b.webp 760w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/perl_problems_hu0e0484462f33f916343aead87d9b7933_20532_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/perl_problems_hu0e0484462f33f916343aead87d9b7933_20532_8fdf08fae82e8346817146df2a00337b.webp"
width="548"
height="205"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
&lt;a href="https://xkcd.com/1171/" target="_blank" rel="noopener">Perl Problems&lt;/a> von Randall Munroe unter &lt;a href="http://creativecommons.org/licenses/by-nc/2.5/" target="_blank" rel="noopener">CC BY-NC Lizenz&lt;/a>.
&lt;/figcaption>&lt;/figure>
&lt;p>Bei Memes zu &lt;a href="https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck" target="_blank" rel="noopener">regulären Ausdrücken&lt;/a> wird wie in Abbildung 1 häufig der Eindruck erweckt, dass sie mehr Probleme erzeugen als sie tatsächlich lösen. Richtig dosiert sind sie jedoch ein hilfreiches Werkzeug bei der Datenextraktion.&lt;/p>
&lt;p>Das Vorgehen beim Entwickeln von regulären Ausdrücken unterscheidet sich von Person zu Person.
Wir zeigen hier unser bevorzugtes Vorgehen, von dem gerne abgewichen werden darf.&lt;/p>
&lt;p>Zum Entwickeln, Testen und Verstehen von regulären Ausdrücken, nutzen wir &lt;a href="https://regex101.com/" target="_blank" rel="noopener">RegEx101&lt;/a> (Alternative: &lt;a href="https://regexr.com/" target="_blank" rel="noopener">RegExr&lt;/a>).
Hier bekommen wir wie in Abbildung 2 visuelles Feedback, auf welche Textzeilen unsere regulären Ausdrücke passen und was die einzelnen Bestandteile bedeuten.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-regex101httpsregex101com-mit-art-ecmascript-einem-regulären-ausdruck-zur-extraktion-von-datumsangaben-in-der-mitte-oben-mehreren-beispielen-direkt-darunter-und-hilfreichen-informationen-auf-der-rechten-seite">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von [RegEx101](https://regex101.com/) mit Art *ECMAScript*, einem regulären Ausdruck zur Extraktion von **Datumsangaben** in der Mitte oben, mehreren Beispielen direkt darunter und hilfreichen Informationen auf der rechten Seite." srcset="
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101_hu4d42a9ea634230dd2891861f8c3240d1_195054_d53b9bb6a485b284a574d997193da119.webp 400w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101_hu4d42a9ea634230dd2891861f8c3240d1_195054_4de000c996966a66f861355dd8859f87.webp 760w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101_hu4d42a9ea634230dd2891861f8c3240d1_195054_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101_hu4d42a9ea634230dd2891861f8c3240d1_195054_d53b9bb6a485b284a574d997193da119.webp"
width="760"
height="511"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von &lt;a href="https://regex101.com/" target="_blank" rel="noopener">RegEx101&lt;/a> mit Art &lt;em>ECMAScript&lt;/em>, einem regulären Ausdruck zur Extraktion von &lt;strong>Datumsangaben&lt;/strong> in der Mitte oben, mehreren Beispielen direkt darunter und hilfreichen Informationen auf der rechten Seite.
&lt;/figcaption>&lt;/figure>
&lt;p>Die Verwendung eines visuell unterstützenden Werkzeuges wie RegEx101 hat den Vorteil, dass wir einen übersichtlichen regulären Ausdruck entwickeln können, den wir dann in unsere Ursprungsanwendung, wie zum Beispiel OpenRefine, übertragen können. Ein Nachteil ist, dass zum Beispiel in OpenRefine nicht alle Features von regulären Ausdrücken unterstützt werden und der reguläre Ausdruck nachträglich ggf. angepasst werden muss.&lt;/p>
&lt;h2 id="vorbereitung">Vorbereitung&lt;/h2>
&lt;p>Wir erstellen uns eine kleine Sammlung von Beispielen für Daten, die wir mit einem regulären Ausdruck bearbeiten wollen.
Dazu ergänzen wir einige Negativbeispiele, also Beispiele, die von unserem regulären Ausdruck nicht extrahiert werden sollten.&lt;/p>
&lt;p>Die Beispiele für dieses Tutorial sind im Folgenden gelistet und wir kopieren sie in das Testfenster von &lt;a href="https://regex101.com/" target="_blank" rel="noopener">RegEx101&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl">2021-11-25 Einsteigerworkshop 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2021-12-08 Einsteigerworkshop 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2022-04-07 Einsteigerworkshop 3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2022-04-13 Einsteigerworkshop 4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2022-05-03 Fortgeschrittenenworkshop
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1970-01-01
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2005-1-1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- - - - - - - - - - - - - - - - - - -
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Do not match!
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1234-56-78
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2022-13-01
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2022-01-32
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">12-34-56
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">abcd-ef-gh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-note">
&lt;div>
Wir werden bei den folgenden Aufgaben teilweise keine &amp;ldquo;perfekten&amp;rdquo; regulären Ausdrücke entwickeln,
also teilweise Treffer in der Liste der Negativbeispiele haben!
&lt;/div>
&lt;/div>
&lt;p>Reguläre Ausdrücke werden von verschiedenen Programmiersprachen und Werkzeugen unterstützt.
Dabei unterscheidet sich die Art, wie reguläre Ausdrücke als solche markiert werden.
Außerdem werden je nach Programmiersprache, Version der Programmiersprache oder Werkzeug nicht alle Features von regulären Ausdrücken unterstützt.&lt;/p>
&lt;p>In RegEx101 können wir daher ein so genanntes &lt;em>Flavor&lt;/em> für die Eingabe der regulären Ausdrücke auswählen.
Wir verwenden für unser Tutorial &amp;ldquo;ECMAScript (JavaScript)&amp;rdquo;.
Das hat den Hintergrund, dass sich GREL an der Syntax für JavaScript orientiert, auch wenn es im Hintergrund Java zur Auswertung verwendet. Reguläre Ausdrücke werden hier durch zwei Schrägstriche &lt;code>/.../&lt;/code> markiert.&lt;/p>
&lt;p>Hinter dem regulären Ausdruck gibt es optional noch Optionen.
Wir verwenden für RegEx101 die Optionen &lt;code>g&lt;/code> und &lt;code>m&lt;/code>.
Das sind die Standardoptionen, die bewirken, dass ein regulärer Ausdruck auf den kompletten Text (&lt;code>g&lt;/code> für &lt;em>global&lt;/em>) und auch Zeilen übergreifend (&lt;code>m&lt;/code> für &lt;em>multiline&lt;/em>) angewendet werden kann.&lt;/p>
&lt;p>Wir haben sie in den Beispielen explizit gesetzt, damit sie beim Kopieren und Einfügen von regulären Ausdrücken hier aus dem Tutorial nicht ungewollt deaktiviert werden. In OpenRefine benötigen wir diese Optionen für unser Tutorial nicht.&lt;/p>
&lt;h2 id="aufgabe-1-zeichenauswahl-character-classes">Aufgabe 1: Zeichenauswahl (Character Classes)&lt;/h2>
&lt;p>Wir wollen die Datumsangaben extrahieren. Diese haben das Muster &lt;code>Jahreszahl-Monat-Tag&lt;/code> bzw. &lt;code>ZahlZahlZahlZahl-ZahlZahl-ZahlZahl&lt;/code>.
Ein erster Ansatz ist es, dies direkt zu formulieren.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)-(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)-(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Mit dem Pipe-Symbol &lt;code>|&lt;/code> können wir in regulären Ausdrücken Alternativen formulieren. Also zum Beispiel &lt;code>0|1&lt;/code>.
Mit den runden Klammern &lt;code>(&lt;/code> und &lt;code>)&lt;/code> können wir die Alternativen gruppieren.&lt;/p>
&lt;p>Dies ist etwas umständlich und unleserlich. Daher gibt es in regulären Ausdrücken auch ein Muster zur Zeichenauswahl, welches die eckigen Klammern &lt;code>[&lt;/code> und &lt;code>]&lt;/code> verwendet. Mit den &lt;em>Character Classes&lt;/em> lässt sich der obige Ausdruck vereinfachen zu:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die Zeichenauswahl lässt sich kombinieren und limitieren.
So lassen sich Zahlen im &lt;a href="https://de.wikipedia.org/wiki/Hexadezimalsystem" target="_blank" rel="noopener">Hexadezimalsystem&lt;/a> identifizieren mit &lt;code>[0-9A-F]&lt;/code>.&lt;/p>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Passen Sie den obigen regulären Ausdruck so an, dass das erste Zeichen der Jahreszahl des Datums nur eine 1 oder 2 sein darf.&lt;/p>
&lt;details class="spoiler " id="spoiler-4">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/[1-2][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/gm&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/(1|2)[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-2-zeichenklassen-shape-matching">Aufgabe 2: Zeichenklassen (Shape Matching)&lt;/h2>
&lt;p>Alternativ zu der recht flexiblen Zeichenauswahl gibt es vordefinierte Zeichenklassen, die es einfacher machen, die Form des Musters zu beschreiben.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Klasse&lt;/th>
&lt;th>Steht für&lt;/th>
&lt;th>Zeichenauswahl&lt;/th>
&lt;th>Beschreibung&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>\d&lt;/code>&lt;/td>
&lt;td>&lt;em>digit&lt;/em>&lt;/td>
&lt;td>&lt;code>[0-9]&lt;/code>&lt;/td>
&lt;td>Beliebige Zahl&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>\w&lt;/code>&lt;/td>
&lt;td>&lt;em>word&lt;/em>&lt;/td>
&lt;td>&lt;code>[a-zA-Z0-9_]&lt;/code>&lt;/td>
&lt;td>Buchstaben in Groß- oder Kleinschreibung, Zahlen und Unterstrich.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>\s&lt;/code>&lt;/td>
&lt;td>&lt;em>space&lt;/em>&lt;/td>
&lt;td>&lt;/td>
&lt;td>Leerraum: Leerzeichen, Tabulator, &amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>\b&lt;/code>&lt;/td>
&lt;td>&lt;em>boundary&lt;/em>&lt;/td>
&lt;td>&lt;/td>
&lt;td>Wortgrenze, erfasst kein separates Zeichen.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Mit der Klasse &lt;code>\d&lt;/code> für Zahlen sieht der reguläre Ausdruck aus Aufgabe 1 wie folgt aus:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/\d\d\d\d-\d\d-\d\d/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Aufgabe:&lt;/strong> Passen Sie den obigen regulären Ausdruck so an, dass er (nur) auf das Datumsformat &lt;code>2005-1-1&lt;/code> passt.&lt;/p>
&lt;details class="spoiler " id="spoiler-5">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/\d\d\d\d-\d-\d/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-3-verneinungen">Aufgabe 3: Verneinungen&lt;/h2>
&lt;p>Die Zeichenauswahl oder Zeichenklasse lässt sich auch negieren.
Bei der Zeichenauswahl funktioniert das mit dem Sonderzeichen &lt;code>^&lt;/code>, bei den Zeichenklassen durch Großschreibung.&lt;/p>
&lt;ul>
&lt;li>Negierte Zeichenauswahl für Zahlen: &lt;code>[^0-9]&lt;/code>&lt;/li>
&lt;li>Negierte Zeichenklasse für Zahlen: &lt;code>\D&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Negieren Sie die regulären Ausdrücke für das Datum aus Aufgabe 1 und Aufgabe 2.&lt;/p>
&lt;details class="spoiler " id="spoiler-6">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/[^0-9][^0-9][^0-9][^0-9]-[^0-9][^0-9]-[^0-9][^0-9]/gm&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/\D\D\D\D-\D\D-\D\D/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-4-quantoren-quantifiers">Aufgabe 4: Quantoren (Quantifiers)&lt;/h2>
&lt;p>Anstatt Zeichen, Zeichenauswahl oder Zeichenklassen wiederholt zu schreiben, lassen sich Wiederholungen auch durch Quantoren definieren.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Quantor&lt;/th>
&lt;th style="text-align:center">Alternative&lt;/th>
&lt;th>Beschreibung&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>{2,}&lt;/code>&lt;/td>
&lt;td style="text-align:center">&lt;/td>
&lt;td>Mindestens zweimal&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>{1,2}&lt;/code>&lt;/td>
&lt;td style="text-align:center">&lt;/td>
&lt;td>Mindest einmal, höchstens zweimal&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>?&lt;/code>&lt;/td>
&lt;td style="text-align:center">&lt;code>{0,1}&lt;/code>&lt;/td>
&lt;td>Kann vorkommen&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>+&lt;/code>&lt;/td>
&lt;td style="text-align:center">&lt;code>{1,}&lt;/code>&lt;/td>
&lt;td>Kann sich wiederholen&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>*&lt;/code>&lt;/td>
&lt;td style="text-align:center">&lt;code>{0,}&lt;/code>&lt;/td>
&lt;td>Kann vorkommen und sich wiederholen&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Ein möglicher regulärer Ausdruck für unsere Daten wäre also:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/\d{4}-\d\d?-\d\d?/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Aufgabe:&lt;/strong> Schreiben Sie den obigen regulären Ausdruck so um, dass er den &lt;code>?&lt;/code> Quantor nicht mehr verwendet.&lt;/p>
&lt;details class="spoiler " id="spoiler-7">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/\d{4}-\d{1,2}-\d{1,2}/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-5-gruppierungen-group-constructs">Aufgabe 5: Gruppierungen (Group Constructs)&lt;/h2>
&lt;p>Mit den runden Klammern &lt;code>(&lt;/code> und &lt;code>)&lt;/code> lassen sich Gruppen in regulären Ausdrücken definieren.
Das ist nicht nur hilfreich, wenn man mit dem Pipe Symbol &lt;code>|&lt;/code> Alternativen definieren möchte, sondern auch um einzelne Bestandteile zu markieren.&lt;/p>
&lt;p>Setzen wir die einzelnen Bestandteile des regulären Ausdrucks in runde Klammern, dann zeigt uns RegEx101 wie in Abbildung 3 in Gruppe 1 die Jahreszahl, in Gruppe 2 den Monat und in Gruppe 3 den Tag. Auch bei der Verwendung von regulären Ausdrücken in OpenRefine können wir auf die einzelnen Gruppen zugreifen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/(\d{4})-(\d{1,2})-(\d{1,2})/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;figure id="figure-bildschirmfoto-von-regex101httpsregex101com-mit-den-extrahierten-gruppen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von [RegEx101](https://regex101.com/) mit den extrahierten Gruppen." srcset="
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-matches_hu6ff4b2b90356336f98034e3c0e3c37b7_8361_2c21c28cf9419ae2c6352f91bdc4e7e7.webp 400w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-matches_hu6ff4b2b90356336f98034e3c0e3c37b7_8361_3cf30331722d19be6be1321dd2d0f58a.webp 760w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-matches_hu6ff4b2b90356336f98034e3c0e3c37b7_8361_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-matches_hu6ff4b2b90356336f98034e3c0e3c37b7_8361_2c21c28cf9419ae2c6352f91bdc4e7e7.webp"
width="240"
height="189"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von &lt;a href="https://regex101.com/" target="_blank" rel="noopener">RegEx101&lt;/a> mit den extrahierten Gruppen.
&lt;/figcaption>&lt;/figure>
&lt;p>Die einzelnen Gruppen können auch benannt werden um dann wie in Abbildung 4 über den Gruppennamen aufgerufen werden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/(?&amp;lt;Jahr&amp;gt;\d{4})-(?&amp;lt;Monat&amp;gt;\d{1,2})-(?&amp;lt;Tag&amp;gt;\d{1,2})/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;figure id="figure-bildschirmfoto-von-regex101httpsregex101com-mit-den-benannten-gruppen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von [RegEx101](https://regex101.com/) mit den benannten Gruppen." srcset="
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-named-matches_hu9071d89d65be8ab24c22d906808b7586_9563_bf933ef1ff2b0482a722865acf01410b.webp 400w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-named-matches_hu9071d89d65be8ab24c22d906808b7586_9563_d34fac50809a666d3163e0cc294e2a2b.webp 760w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-named-matches_hu9071d89d65be8ab24c22d906808b7586_9563_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-named-matches_hu9071d89d65be8ab24c22d906808b7586_9563_bf933ef1ff2b0482a722865acf01410b.webp"
width="276"
height="197"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von &lt;a href="https://regex101.com/" target="_blank" rel="noopener">RegEx101&lt;/a> mit den benannten Gruppen.
&lt;/figcaption>&lt;/figure>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Erstellen Sie einen regulären Ausdruck mit den zwei benannten Gruppen &lt;code>Datum&lt;/code> und &lt;code>Event&lt;/code>. Das erwartete Ergebnis ist in Abbildung 5 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-regex101httpsregex101com-mit-den-erwarteten-ergebnissen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von [RegEx101](https://regex101.com/) mit den erwarteten Ergebnissen." srcset="
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-expected-matches_hu5ce7f208bf5f90ace184f0d78ee94637_77476_ba0297e2927abc5a486f48e6310a0796.webp 400w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-expected-matches_hu5ce7f208bf5f90ace184f0d78ee94637_77476_acc9bc2d3037731d62c49990d0a1e14d.webp 760w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-expected-matches_hu5ce7f208bf5f90ace184f0d78ee94637_77476_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-expected-matches_hu5ce7f208bf5f90ace184f0d78ee94637_77476_ba0297e2927abc5a486f48e6310a0796.webp"
width="554"
height="667"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von &lt;a href="https://regex101.com/" target="_blank" rel="noopener">RegEx101&lt;/a> mit den erwarteten Ergebnissen.
&lt;/figcaption>&lt;/figure>
&lt;details class="spoiler " id="spoiler-11">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/(?&amp;lt;Datum&amp;gt;\d{4}-\d{1,2}-\d{1,2}) (?&amp;lt;Event&amp;gt;[a-zA-Z0-9 ]+)/gm&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/(?&amp;lt;Datum&amp;gt;\d{4}-\d{1,2}-\d{1,2}) (?&amp;lt;Event&amp;gt;.+)/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;div class="alert alert-note">
&lt;div>
&lt;p>In OpenRefine 3.5, 3.6 und 3.7 werden benannte Gruppierungen nicht überall unterstützt.
Beispielsweise wird bei &lt;a href="https://docs.openrefine.org/manual/grelfunctions#finds-sub-or-p" target="_blank" rel="noopener">find()&lt;/a> immer nur der vollständige Treffer zurückgegeben und bei &lt;a href="https://docs.openrefine.org/manual/grelfunctions#matchs-p" target="_blank" rel="noopener">match()&lt;/a> die Gruppen ausschließlich durchnummeriert. Lediglich bei &lt;a href="https://docs.openrefine.org/manual/grelfunctions#replaces-s-or-p-find-s-replace" target="_blank" rel="noopener">replace()&lt;/a> lässt sich auf die benannten Gruppen zugreifen.&lt;/p>
&lt;p>Der folgende GREL Ausdruck nutzt benannte Gruppen um mit &lt;code>replace()&lt;/code> die Reihenfolge des Datums umzudrehen:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/(?&amp;lt;Jahr&amp;gt;\d{4})-(?&amp;lt;Monat&amp;gt;\d{1,2})-(?&amp;lt;Tag&amp;gt;\d{1,2})/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;${Tag}-${Monat}-${Jahr}&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;/div>
&lt;h2 id="aufgabe-6-look-around-look-aheadlook-behind">Aufgabe 6: Look-around (Look-ahead/Look-behind)&lt;/h2>
&lt;p>Manchmal möchte man die Daten weiter einschränken.&lt;/p>
&lt;p>Hier ein einfaches Beispiel um nur Daten aus dem Jahr &lt;code>2022&lt;/code> zu extrahieren:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/2022-\d{1,2}-\d{1,2}/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Aufwendiger wird es, wenn ein Datum nur extrahiert werden soll, wenn ein bestimmter Begriff dahinter steht.
Dies funktioniert mit so genannten &lt;em>Look-around&lt;/em> Anweisungen.
Man kann via &lt;em>positive Look-ahead&lt;/em> &lt;code>(?=...)&lt;/code> definieren, dass ein Begriff &lt;strong>nach&lt;/strong> einem Muster vorkommen soll und
via &lt;em>positive Look-behind&lt;/em> &lt;code>(?&amp;lt;=...)&lt;/code> kann definiert werden, dass ein Begriff &lt;strong>vor&lt;/strong> einem Muster vorkommen soll.&lt;/p>
&lt;p>So findet der folgende reguläre Ausdruck alle Daten unserer Einsteigerworkshops, ohne den Begriff &amp;ldquo;Einsteigerworkshop&amp;rdquo; mit in das Ergebnis aufzunehmen:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/\d{4}-\d{1,2}-\d{1,2}(?= Einsteigerworkshop)/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die &lt;em>Look-around&lt;/em> Anweisungen lassen sich auch verneinen, indem man das Gleichheitszeichen &lt;code>=&lt;/code> durch ein Ausrufezeichen &lt;code>!&lt;/code> austauscht.
So findet der folgende reguläre Ausdruck mit einem &lt;em>negative Look-ahead&lt;/em> &lt;code>(?!...)&lt;/code> alle Daten von &lt;strong>nicht&lt;/strong> Einsteigerworkshops:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/\d{4}-\d{1,2}-\d{1,2} (?!Einsteigerworkshop)/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Aufgabe:&lt;/strong> Extrahieren Sie die Titel aller drei Workshops im Jahr 2022. Nutzen Sie dazu eine &lt;em>positive Look-behind&lt;/em> Anweisung &lt;code>(?&amp;lt;=...)&lt;/code>.&lt;/p>
&lt;details class="spoiler " id="spoiler-13">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>Quantoren wie &lt;code>+&lt;/code>, &lt;code>*&lt;/code>, &lt;code>?&lt;/code>, &lt;code>{1,9}&lt;/code> werden in &lt;em>Look-around&lt;/em> Gruppen &lt;strong>nicht überall&lt;/strong> unterstützt! Das kommt auf die benutzte Programmiersprache, deren Version und/oder verwendeten Zusatzbibliotheken an. Daher im Zweifel erst einmal testen!&lt;/li>
&lt;li>&lt;em>Look-around&lt;/em> Anweisungen verlangsamen die Auswertung eines regulären Ausdrucks deutlich und sollten daher mit Bedacht eingesetzt werden.&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;details class="spoiler " id="spoiler-14">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/(?&amp;lt;=2022-\d\d-\d\d )(?&amp;lt;Titel&amp;gt;[a-zA-Z0-9 ]+)/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-7-datums-einschränkungen">Aufgabe 7: Datums Einschränkungen&lt;/h2>
&lt;p>Mit einer Kombination von Alternativen, Gruppierungen, Zeichenauswahl und Quantoren lässt sich auch ein regulärer Ausdruck entwickeln, der ausschließlich valide Datumsangaben zwischen 1900 und 2029 extrahiert.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/(?&amp;lt;Jahr&amp;gt;19\d\d|20[0-2]\d)-(?&amp;lt;Monat&amp;gt;0?\d|1[0-2])-(?&amp;lt;Tag&amp;gt;[0-2]?\d|3[0-1])(?=\s)/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Auch wenn er fachlich und technisch richtig ist, welche Probleme treten bei diesem regulären Ausdruck eventuell auf?&lt;/p>
&lt;details class="spoiler " id="spoiler-15">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>Der reguläre Ausdruck ist sehr komplex und schwer zu verstehen.&lt;/li>
&lt;li>Überflüssig da es ggf. gar keine invaliden Datumsangaben gibt?&lt;/li>
&lt;li>Ggf. möchte man falsch geschriebene Daten explizit mit in die Ergebnisse aufnehmen und nachkorrigieren?&lt;/li>
&lt;li>Ggf. Datumsangaben vor 1900 oder nach 2029 übersehen?&lt;/li>
&lt;li>Unterscheidet nicht zwischen Monaten mit 28/30 und 31 Tagen.&lt;/li>
&lt;li>&amp;hellip;&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-8-spezielle-zeichen">Aufgabe 8: Spezielle Zeichen&lt;/h2>
&lt;p>Es gibt eine Liste mit speziellen Zeichen, die bei Vorkommen in einem regulären Ausdruck mit einem Backslash &lt;code>\&lt;/code> &lt;em>escaped&lt;/em> werden müssen um sie zu deaktivieren.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Zeichen&lt;/th>
&lt;th>Bedeutung&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>.&lt;/code>&lt;/td>
&lt;td>Wildcard, beliebiges Zeichen&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>^&lt;/code>&lt;/td>
&lt;td>Zeilenbeginn oder Verneinung&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>$&lt;/code>&lt;/td>
&lt;td>Zeilenende&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>\&lt;/code>&lt;/td>
&lt;td>Escapezeichen&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>+&lt;/code>&lt;/td>
&lt;td>Quantor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>*&lt;/code>&lt;/td>
&lt;td>Quantor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>?&lt;/code>&lt;/td>
&lt;td>Quantor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>{&lt;/code>, &lt;code>}&lt;/code>&lt;/td>
&lt;td>Quantor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>(&lt;/code>, &lt;code>)&lt;/code>&lt;/td>
&lt;td>Gruppe&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>[&lt;/code>, &lt;code>]&lt;/code>&lt;/td>
&lt;td>Zeichenklasse&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Der folgende reguläre Ausdruck passt zum Beispiel auf Zeilen, in denen nur ein Datum steht.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/^\d{4}-\d{1,2}-\d{1,2}$/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Aufgabe:&lt;/strong> Schreiben Sie einen regulären Ausdruck, der in dem folgenden Text ausschließlich Dezimalzahlen in englischer Schreibweise mit Punkt &lt;code>.&lt;/code> als Trennzeichen extrahiert.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl">Der Literpreis für Diesel ist erstmals über 2.00 Euro gestiegen.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Siehe auch Code AFE2A00F.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;details class="spoiler " id="spoiler-16">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/\d+\.\d+/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-9-reguläre-ausdrücke-in-openrefine">Aufgabe 9: Reguläre Ausdrücke in OpenRefine&lt;/h2>
&lt;p>In OpenRefine kann anstelle von Text auch häufig ein regulärer Ausdruck verwendet werden.
Zum Beispiel beim Suchen via Textfilter, dem Aufteilen von Spalten oder dem &lt;em>Replace&lt;/em>-Dialog.
Eine &lt;a href="https://docs.openrefine.org/manual/expressions#grel-supported-regex" target="_blank" rel="noopener">Liste der GREL Funktionen mit Unterstützung von regulären Ausdrücken&lt;/a> gibt es in der OpenRefine Dokumentation.&lt;/p>
&lt;p>Für diese Aufgabe wechseln wir zu OpenRefine und laden die Datei &lt;code>08_kurzbiographien.csv&lt;/code> in das Projekt &amp;ldquo;Kurzbiographien&amp;rdquo;.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/08_kurzbiographien.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Kurzbiographien als CSV&lt;/a>
&lt;blockquote>
&lt;p>Die Datei &lt;code>08_kurzbiographien.csv&lt;/code> verwendet Texte von verschiedenen und in der Datei referenzierten Wikipedia Artikeln, die unter einer &lt;a href="http://creativecommons.org/licenses/by-sa/3.0/" target="_blank" rel="noopener">CC BY-SA 3.0 Lizenz&lt;/a> veröffentlicht wurden.
Die Datei &lt;code>08_kurzbiographien.csv&lt;/code> ist entsprechend ebenfalls lizenziert unter einer &lt;a href="http://creativecommons.org/licenses/by-sa/3.0/" target="_blank" rel="noopener">CC BY-SA 3.0 Lizenz&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;p>Die Datei enthält aus Wikipedia gesammelte Kurzbiographien einiger Autoren einer bestimmten Literaturströmung.&lt;/p>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Wir wollen aus den Kurzbiographien mit Hilfe von regulären Ausdrücken vier neue Spalten erstellen:
Geburtsdatum, Geburtsort, Sterbedatum und Sterbeort.&lt;/p>
&lt;blockquote>
&lt;p>Bonusfrage: zu welcher Literaturströmung gehören die Autoren?&lt;/p>
&lt;/blockquote>
&lt;details class="spoiler " id="spoiler-18">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>Um mit einem regulären Ausdruck nur einen Teil der Daten aus einer Spalte in eine neue zu überführen bietet sich der &amp;ldquo;Add column based on this column&amp;hellip;&amp;rdquo; Dialog und die GREL Funktion &lt;a href="https://docs.openrefine.org/manual/grelfunctions#finds-sub-or-p" target="_blank" rel="noopener">find()&lt;/a> an.&lt;/li>
&lt;li>Der GREL Ausdruck &lt;code>value.find(/\d{4}/)[0]&lt;/code> findet beispielsweise alle Jahreszahlen in Form einer Liste (technisch Array) zurück und wir extrahieren mit &lt;code>[0]&lt;/code> das erste Element.&lt;/li>
&lt;li>Reguläre Ausdrücke werden in OpenRefine Funktionen mit &lt;code>/.../&lt;/code> eingefasst.&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;details class="spoiler " id="spoiler-19">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;p>F&lt;/p>
&lt;p>Es gibt unterschiedliche Lösungswege, hier ist eine recht einfache Variante aufgezeigt.
Hierbei verzichten wir auf komplexe reguläre Ausdrücke und formulieren verständliche Einzelschritte.&lt;/p>
&lt;ol>
&lt;li>Neue Spalte &amp;ldquo;Geburtsdatum&amp;rdquo; erstellen via &amp;ldquo;Kurzbiographie&amp;rdquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;ldquo;Edit column&amp;rdquo;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;ldquo;Add column based on this column&amp;hellip;&amp;rdquo; und dem GREL Ausdruck &lt;code>value.find(/\*[^;]+/)[0]&lt;/code>.&lt;/li>
&lt;li>Wiederhole Schritt 1 mit &amp;ldquo;Sterbedatum&amp;rdquo; und dem GREL Ausdruck &lt;code>value.find(/†[^\;)]+/)[0]&lt;/code>.&lt;/li>
&lt;li>Die Spalte &amp;ldquo;Geburtsdatum&amp;rdquo; in zwei Spalten aufteilen via
&amp;ldquo;Geburtsdatum&amp;rdquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;ldquo;Edit column&amp;rdquo;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;ldquo;Split into several columns&amp;hellip;&amp;rdquo;
und dem Seperator &lt;code>\s+in\s+&lt;/code> (Häkchen bei &lt;em>regular expression&lt;/em> nicht vergessen).&lt;/li>
&lt;li>Wiederhole Schritt 3 auf der Spalte &amp;ldquo;Sterbedatum&amp;rdquo;.&lt;/li>
&lt;li>Spalten umbenennen&lt;/li>
&lt;li>Unnötige Zeichen in Spalte &amp;ldquo;Geburtsdatum&amp;rdquo; ersetzen via
&amp;ldquo;Geburtsdatum&amp;rdquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;ldquo;Edit cells&amp;rdquo;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;ldquo;Transform&amp;hellip;&amp;rdquo;
und dem GREL Ausdruck &lt;code>value.replace(/(\*\s*|†\s*)/, &amp;quot;&amp;quot;)&lt;/code> (alternativ geht das auch über den &amp;ldquo;Replace&amp;rdquo; Dialog).&lt;/li>
&lt;li>Wiederhole Schritt 6 auf der Spalte &amp;ldquo;Sterbedatum&amp;rdquo;.&lt;/li>
&lt;/ol>
&lt;/p>
&lt;/details>
&lt;details class="spoiler " id="spoiler-20">
&lt;summary>&lt;strong>Alternative Lösung(en):&lt;/strong>&lt;/summary>
&lt;p>&lt;p>Wir verwenden &lt;code>match()&lt;/code> und einen komplexen regulären Ausdruck um alle Datenbestandteile gleichzeitig zu extrahieren:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">match&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/.+\* (?&amp;lt;Geburtsdatum&amp;gt;\d{1,2}\. [a-zA-Zä]+ \d{4}) in (?&amp;lt;Geburtsort&amp;gt;[^;]+); † (?&amp;lt;Sterbedatum&amp;gt;\d{1,2}\. [a-zA-Zä]+ \d{4}) in (?&amp;lt;Sterbeort&amp;gt;[^;|\)]+).+/&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Diesen GREL Ausdruck können wir dann viermal mit &amp;ldquo;Kurzbiographie&amp;rdquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;ldquo;Edit column&amp;rdquo;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;ldquo;Add column based on this column&amp;hellip;&amp;rdquo; anwenden und jeweils via &lt;code>value.match(...)[0]&lt;/code> (Geburtsdatum) bis &lt;code>value.match(...)[3]&lt;/code> (Sterbeort) die einzelnen Bestandteile für die jeweilige Spalte extrahieren.&lt;/p>
&lt;p>Oder wir verwenden anstatt &lt;code>value.match(...)[...]&lt;/code> die Funktion &lt;code>value.match(...).join(&amp;quot;;&amp;quot;)&lt;/code> und teilen die neue Spalte anschließend an dem Trennzeichen &lt;code>;&lt;/code> in vier Spalten auf.&lt;/p>
&lt;p>Oder wir extrahieren die Daten zuerst gemeinsam und transponieren sie anschließend, wie in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/">Daten mit OpenRefine Transponieren&lt;/a> beschrieben.
Vor dem Transponieren müssen wir die Daten anhand von einem Zeilenumbruch &lt;code>\n&lt;/code> in mehrere Zeilen aufteilen, die Spalte anhand von &lt;code>:&lt;/code> in zwei Spalten aufteilen und mit &amp;ldquo;Edit cells&amp;rdquo;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;ldquo;Fill down&amp;rdquo; die restlichen Spalten auffüllen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">match&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/.+\* (?&amp;lt;Geburtsdatum&amp;gt;\d{1,2}\. [a-zA-Zä]+ \d{4}) in (?&amp;lt;Geburtsort&amp;gt;[^;]+); † (?&amp;lt;Sterbedatum&amp;gt;\d{1,2}\. [a-zA-Zä]+ \d{4}) in (?&amp;lt;Sterbeort&amp;gt;[^;|\)]+).+/&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Geburtsdatum: &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;\nGeburtsort: &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;\nSterbedatum: &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;\nSterbeort: &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-10-vorsicht-bei-umlauten">Aufgabe 10: Vorsicht bei Umlauten&lt;/h2>
&lt;p>Wie schon erwähnt basiert OpenRefine auf Java und in der hier im Tutorial eingesetzten OpenRefine Version 3.9.3 wird Java in Version 11 mitgeliefert. Eine Übersicht über alle von Java in dieser Version unterstützen Features von regulären Ausdrücken findet sich in der &lt;a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html" target="_blank" rel="noopener">Java 11 Dokumentation zu RegEx Pattern&lt;/a>.
Die Unicode Unterstützung ist bei den Mustern in Java 11 &lt;strong>optional&lt;/strong> und muss daher separat aktiviert werden.
Das hat zur Folge, dass &amp;ldquo;Sonderzeichen&amp;rdquo; wie unsere Umlaute &lt;em>äöü&lt;/em>, oder die in der französischen Sprache gebräuchlichen Buchstaben mit Akzenten &lt;em>éêè&lt;/em>, nicht von den Mustern &lt;code>[a-z]&lt;/code> oder &lt;code>\w&lt;/code> berücksichtigt werden.&lt;/p>
&lt;p>Um zum Beispiel auch Umlaute zu berücksichtigen gibt es mehrere Möglichkeiten:&lt;/p>
&lt;ol>
&lt;li>Umlaute explizit auflisten: &lt;code>[a-zäöüß]&lt;/code>&lt;/li>
&lt;li>Spezielle Klasse für Buchstaben (&lt;em>letter&lt;/em>) verwenden: &lt;code>\p{L}&lt;/code>&lt;/li>
&lt;li>Spezielle Klasse für alphabetische Zeichen verwenden: &lt;code>\p{IsAlphabetic}&lt;/code>&lt;/li>
&lt;li>Unicode Modus mit &lt;em>inline Flag&lt;/em> aktivieren: &lt;code>(?U)\w&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Kopieren Sie den folgenden GREL Ausdruck in einen GREL Dialog und ersetzen Sie &lt;code>...&lt;/code> mit den oben genannten Möglichkeiten auch Unicode-Zeichen zu berücksichtigen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;abcöüßéêè€$123!-&amp;#34;&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/.../&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;details class="spoiler " id="spoiler-21">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>In RegEx101 wird bei der Auswahl des &lt;em>Flavors&lt;/em> Java 8 die Unicode Unterstützung über das &lt;code>U&lt;/code> Flag nach dem regulären Ausdruck aktiviert. &lt;em>Inline Flags&lt;/em> werden dort nicht unterstützt.&lt;/li>
&lt;li>In OpenRefine wird &lt;code>U&lt;/code> nur als &lt;em>inline Flag&lt;/em> und nicht als Regex Flag unterstützt.&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Bei der Verwendung von regulären Ausdrücken sollte stets die Balance zwischen &lt;a href="https://en.wikipedia.org/wiki/Precision_and_recall" target="_blank" rel="noopener">Genauigkeit und Trefferquote&lt;/a> im Hinterkopf behalten werden.
Liegt die Priorität darauf nur genau die Daten zu finden, die einem sehr präzisen Muster folgen?
Oder formulieren wir das Muster eher unpräzise und filtern die überflüssigen Treffer in einem separaten Schritt?&lt;/p>
&lt;p>Wie bei der Lösung zur Aufgabe 9 angesprochen, ist es manchmal einfacher und verständlicher die Arbeiten in mehrere einfache Schritte zu teilen, anstatt sie in einem komplexen Schritt zu formulieren.
Also zum Beispiel Geburtsdatum und Geburtsort zusammenhängend zu extrahieren und dann aufzusplitten, anstatt komplexe reguläre Ausdrücke für ein Geburtsdatum &lt;strong>und&lt;/strong> den Geburtsort separat zu formulieren.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil beschäftigen wir uns mit der Programmiersprache GREL.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel" class="btn btn-primary px-3 py-3">09 Arbeiten mit GREL&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Daten mit OpenRefine Transponieren</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/</guid><description>&lt;p>OpenRefine kann Zeilen und Spalten tauschen. Diese Transposition kann sowohl auf dem kompletten Datensatz, als auch nur auf einer Auswahl an Spalten durchgeführt werden. In diesem Tutorial besprechen wir zwei Varianten des Transponierens.&lt;/p>
&lt;h2 id="einführung">Einführung&lt;/h2>
&lt;blockquote>
&lt;p>Transponieren in der &lt;a href="https://docs.openrefine.org/manual/transposing" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;p>In der Praxis kommt es vor, dass wir Daten in Spalten organisiert bekommen, die wir eigentlich zeilenweise benötigen, oder umgekehrt.
In der nächsten Tabelle ist ein Ausschnitt von Daten zu Politikern im &lt;a href="https://de.wikipedia.org/wiki/Kabinett_Kretschmann_III" target="_blank" rel="noopener">Kabinett Kretschmann III&lt;/a> gezeigt, mit dem wir im Laufe dieser Aufgabe arbeiten werden. Die Daten sind in Spalten gespeichert.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>GND-ID&lt;/th>
&lt;th>Name&lt;/th>
&lt;th>Geschlecht&lt;/th>
&lt;th>Geburtsdatum&lt;/th>
&lt;th>Geburtsort&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>143926683&lt;/td>
&lt;td>Kretschmann, Winfried&lt;/td>
&lt;td>Männlich&lt;/td>
&lt;td>1948-05-17&lt;/td>
&lt;td>Spaichingen&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>122189930&lt;/td>
&lt;td>Hermann, Winfried&lt;/td>
&lt;td>Männlich&lt;/td>
&lt;td>1952&lt;/td>
&lt;td>Rottenburg am Neckar&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;hellip;&lt;/td>
&lt;td>&amp;hellip;&lt;/td>
&lt;td>&amp;hellip;&lt;/td>
&lt;td>&amp;hellip;&lt;/td>
&lt;td>&amp;hellip;&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>In der nächsten Tabelle sind die gleichen Daten zeilenweise gespeichert.
Mit der zusätzlichen &amp;ldquo;GND-ID&amp;rdquo; Spalte, die wir nicht mittransponiert haben, ergibt sich dadurch eine Record-Struktur, wie wir sie im letzten Teil des Workshops kennen gelernt und besprochen haben.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>GND-ID&lt;/th>
&lt;th>Schlüssel&lt;/th>
&lt;th>Wert&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>143926683&lt;/td>
&lt;td>Name&lt;br>Geschlecht&lt;br>Geburtsdatum&lt;br>Geburtsort&lt;/td>
&lt;td>Kretschmann, Winfried&lt;br>Männlich&lt;br>1948-05-17&lt;br>Spaichingen&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>122189930&lt;/td>
&lt;td>Name&lt;br>Geschlecht&lt;br>Geburtsdatum&lt;br>Geburtsort&lt;/td>
&lt;td>Hermann, Winfried&lt;br>Männlich&lt;br>1952&lt;br>Rottenburg am Neckar&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;hellip;&lt;/td>
&lt;td>Name&lt;br>Geschlecht&lt;br>Geburtsdatum&lt;br>Geburtsort&lt;/td>
&lt;td>&amp;hellip;&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Mit der Option Daten in OpenRefine zu transponieren, können wir Daten in den oben gezeigten Formaten ineinander umwandeln.&lt;/p>
&lt;h2 id="vorbereitung-projekt-erstellen">Vorbereitung: Projekt erstellen&lt;/h2>
&lt;p>Die folgende Datei in ein OpenRefine-Projekt laden.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/11_kretschmann-kabinett-iii-transposing.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Kretschmann III als CSV&lt;/a>
&lt;p>Die importierten Daten sind in Abbildung 1 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-daten-nach-dem-import">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Daten nach dem Import." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-start_huc187b1dbb604743a4be7c7b012955770_32568_3b8e284e79b785a59538b06e127d066c.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-start_huc187b1dbb604743a4be7c7b012955770_32568_1836e7cebb377b9ad07be7f7abf9ad62.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-start_huc187b1dbb604743a4be7c7b012955770_32568_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-start_huc187b1dbb604743a4be7c7b012955770_32568_3b8e284e79b785a59538b06e127d066c.webp"
width="606"
height="304"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Daten nach dem Import.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-1-transponieren-ohne-schlüsselspalte">Aufgabe 1: Transponieren ohne Schlüsselspalte&lt;/h2>
&lt;p>Wir transponieren in dieser Aufgabe die in Abbildung 1 abgebildeten Daten in ein zeilenweises Datenformat.
Dabei lassen wir die Spalte &amp;ldquo;GND-ID&amp;rdquo; stehen um anschließend eine Record-Struktur zu erzeugen.&lt;/p>
&lt;p>Zum Transponieren gehen wir in den zugehörigen Dialog via
&amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Transpose&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transpose cells across columns into rows&amp;hellip;&amp;rdquo;
und wählen dort die zu transponierenden Spalten aus.
Wie in Abbildung 2 geben wir als Zielformat an, dass wir die Daten in einer Spalte (&lt;em>One column&lt;/em>) zusammengefasst bekommen möchten.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialoges-zum-transponieren-in-eine-spalte">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialoges zum Transponieren in eine Spalte." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-dialog_hu416a1c59c59d09ca201d612300d1c188_21638_30df7c8bb64b5e54731974621deaaee1.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-dialog_hu416a1c59c59d09ca201d612300d1c188_21638_ab4e3edb27494a271ca57456fb14cdef.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-dialog_hu416a1c59c59d09ca201d612300d1c188_21638_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-dialog_hu416a1c59c59d09ca201d612300d1c188_21638_30df7c8bb64b5e54731974621deaaee1.webp"
width="724"
height="555"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialoges zum Transponieren in eine Spalte.
&lt;/figcaption>&lt;/figure>
&lt;p>Das Ergebnis ist in Abbildung 3 gezeigt. Wir haben nun eine Record-Struktur mit der GND-ID als Identifikator und allen zugehörigen Daten in einem Record-Feld.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-daten-nach-dem-transponieren-in-eine-spalte">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Daten nach dem Transponieren in eine Spalte." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-result_hu55345c40a036518fbbadc3a4d9ff17df_48013_d842f6a3627d8018e3d2d5ec78af1826.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-result_hu55345c40a036518fbbadc3a4d9ff17df_48013_541433ba443a2d482e66b9ccd0686b95.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-result_hu55345c40a036518fbbadc3a4d9ff17df_48013_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-result_hu55345c40a036518fbbadc3a4d9ff17df_48013_d842f6a3627d8018e3d2d5ec78af1826.webp"
width="219"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Daten nach dem Transponieren in eine Spalte.
&lt;/figcaption>&lt;/figure>
&lt;p>Der Schritt von einer zeilenweiser Speicherung zurück zu Spalten geht über
&amp;ldquo;Daten&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Transpose&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transpose cells in rows into columns&amp;hellip;&amp;rdquo;.
In dem Dialog geben wir &lt;code>4&lt;/code> Zeilen zum Transponieren an.
Das Ergebnis ist in Abbildung 4 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-daten-nach-dem-transponieren-von-einer-spalte">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Daten nach dem Transponieren von einer Spalte." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-back_hu3613ac0bb226976d546cf9f423f45913_39963_a7f93ab24f67683df17ee594de95f904.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-back_hu3613ac0bb226976d546cf9f423f45913_39963_76c9b95c64bc546eab65d3249d8c24de.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-back_hu3613ac0bb226976d546cf9f423f45913_39963_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-back_hu3613ac0bb226976d546cf9f423f45913_39963_a7f93ab24f67683df17ee594de95f904.webp"
width="747"
height="307"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Daten nach dem Transponieren von einer Spalte.
&lt;/figcaption>&lt;/figure>
&lt;p>Hier sind auch schon zwei Nachteile beim Transponieren ohne Schlüssel zu sehen:&lt;/p>
&lt;ol>
&lt;li>Die Spalten müssen nachgearbeitet werden (Name ändern, Präfix entfernen).&lt;/li>
&lt;li>Die Daten müssen einheitlich sein, also gleiche Anzahl an Elementen und gleiche Sortierung, da die Umwandlung sonst &amp;ldquo;verrutscht&amp;rdquo;.&lt;/li>
&lt;/ol>
&lt;h2 id="aufgabe-2-transponieren-mit-schlüsselspalte">Aufgabe 2: Transponieren mit Schlüsselspalte&lt;/h2>
&lt;p>Wir machen die Änderungen rückgängig und stellen den in Abbildung 1 gezeigten Ursprungszustand des Projektes wieder her.&lt;/p>
&lt;p>Diesmal transponieren wir die Daten in zwei Spalten, indem wir eine separate Schlüsselspalte erzeugen lassen.
Dies funktioniert über den gleichen Dialog wie in Aufgabe 1 über
&amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Transpose&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transpose cells across columns into rows&amp;hellip;&amp;rdquo;.
Die Einstellungen sind in Abbildung 5 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialoges-zum-transponieren-in-zwei-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialoges zum Transponieren in zwei Spalten." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-dialog_hu510b757ac86dc37e40038a586ebb0b10_21994_62901b34eae7bc096bee3361304162f8.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-dialog_hu510b757ac86dc37e40038a586ebb0b10_21994_098998390f06cff0dc1ea4aa206b05f9.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-dialog_hu510b757ac86dc37e40038a586ebb0b10_21994_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-dialog_hu510b757ac86dc37e40038a586ebb0b10_21994_62901b34eae7bc096bee3361304162f8.webp"
width="726"
height="562"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialoges zum Transponieren in zwei Spalten.
&lt;/figcaption>&lt;/figure>
&lt;p>Das Ergebnis der Umwandlung ist in Abbildung 6 gezeigt. Wir haben eine Record-Struktur mit der GND-ID als Identifikator und allen zugehörigen Daten in einem Record-Feld.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-daten-nach-dem-transponieren-in-zwei-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Daten nach dem Transponieren in zwei Spalten." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-result_hu3f4a78b2e58f0b45df36cc08cdbc5129_52717_f7a768fdeecd58c17d41741370a64df1.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-result_hu3f4a78b2e58f0b45df36cc08cdbc5129_52717_5f702248d71dfa8440f45ade40cf613e.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-result_hu3f4a78b2e58f0b45df36cc08cdbc5129_52717_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-result_hu3f4a78b2e58f0b45df36cc08cdbc5129_52717_f7a768fdeecd58c17d41741370a64df1.webp"
width="252"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Daten nach dem Transponieren in zwei Spalten.
&lt;/figcaption>&lt;/figure>
&lt;p>Bevor wir von diesem Format zu einem Spaltenformat kommen, müssen wir zuerst die Records auflösen.
Wir haben in diesem Datensatz nur eine Spalte (&amp;ldquo;GND-ID&amp;rdquo;) mit leeren Feldern, also genügt es diese über
&amp;ldquo;GND-ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Fill down&amp;rdquo;
aufzufüllen.&lt;/p>
&lt;p>Anschließend können wir diesmal über
&amp;ldquo;Schluessel&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Transpose&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Columnize by key/value columns&amp;hellip;&amp;rdquo;
mit den in Abbildung 7 gezeigten Einstellungen wieder zum Ursprungsformat zurückgelangen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialoges-zum-transponieren-von-schlüsselwerte-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialoges zum Transponieren von Schlüssel/Werte Spalten." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-back-dialog_hu683815b3ed402187374b439010f8894f_9767_9e85b7f2f26571de69776d857269c8ee.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-back-dialog_hu683815b3ed402187374b439010f8894f_9767_3e7abba6fcdb4ca4b8b076b056ad9d8a.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-back-dialog_hu683815b3ed402187374b439010f8894f_9767_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-back-dialog_hu683815b3ed402187374b439010f8894f_9767_9e85b7f2f26571de69776d857269c8ee.webp"
width="603"
height="456"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialoges zum Transponieren von Schlüssel/Werte Spalten.
&lt;/figcaption>&lt;/figure>
&lt;p>Diesmal benötigen wir anschließend keine Anpassungen oder im Vorfeld schon sortierte Daten.
Lediglich die Schlüssel in der Spalte &amp;ldquo;Schluessel&amp;rdquo; sollten einheitlich geschrieben sein.&lt;/p>
&lt;h2 id="aufgabe-3-transponieren-ausgewählter-spalten">Aufgabe 3: Transponieren ausgewählter Spalten&lt;/h2>
&lt;p>Eine weitere praktische Anwendung des Transponierens liegt vor, wenn man &lt;strong>mehrere Spalten&lt;/strong> von einem Typ hat, die man in &lt;strong>einem Arbeitsgang&lt;/strong> zum Beispiel via Clustering vereinheitlichen oder mit einer Normdatenquelle abgleichen möchte.
Für diese Aufgabe wurden exemplarisch die Daten des bisher verwendeten Datensatzes mit den jeweiligen Wirkorten der Politikerinnen und Politikern ergänzt. Das Ergebnis nach dem Import wird in Abbildung 8 gezeigt.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/11_kretschmann-kabinett-iii-transposing-orte.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Kretschmann III als CSV&lt;/a>
&lt;figure id="figure-bildschirmfoto-der-daten-mit-mehreren-ortsspalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Daten mit mehreren Ortsspalten." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-start_huee16abf08d774fd1ec2b2be1018a74e1_51122_dc6322ac43ef3266bb9cb99f3bb97495.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-start_huee16abf08d774fd1ec2b2be1018a74e1_51122_74eba6c26fca47143cb140784e784060.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-start_huee16abf08d774fd1ec2b2be1018a74e1_51122_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-start_huee16abf08d774fd1ec2b2be1018a74e1_51122_dc6322ac43ef3266bb9cb99f3bb97495.webp"
width="760"
height="227"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Daten mit mehreren Ortsspalten.
&lt;/figcaption>&lt;/figure>
&lt;p>Um alle Orte in der Tabelle in einem Arbeitsgang mit z.B. der GND abzugleichen, müssen wir die Daten der einzelnen Spalten in eine gemeinsame Spalte überführen.
Dabei müssen wir uns merken, aus welcher Spalte die einzelnen Orte kommen, um sie nach dem Abgleich wieder zurück schreiben zu können.&lt;/p>
&lt;p>Hierfür eignet sich ebenfalls das Transponieren.
Die Voraussetzung dafür ist, dass die zu transponierenden Spalten alle direkt nacheinander gelistet sind.
Dies lässt sich relativ komfortabel mit
&amp;ldquo;ALL&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit columns&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Re-order / remove columns&amp;hellip;&amp;rdquo;
erledigen.&lt;/p>
&lt;p>Anschließend werden nur die Ortsspalten über
&amp;ldquo;Geburtsort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Transpose&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transpose cells across columns into rows&amp;hellip;&amp;rdquo;
zusammengeführt.
Die Einstellungen sind in Abbildung 9 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialoges-zum-transponieren-von-spalten-in-zeilen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialoges zum Transponieren von Spalten in Zeilen." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/_hu9531286a05212efd4754e15ec69c182d_34441_df2a010f7821691e1a863a4d8781459b.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/_hu9531286a05212efd4754e15ec69c182d_34441_bd2dfc90f7314b82a0b92122e3cf3edd.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/_hu9531286a05212efd4754e15ec69c182d_34441_2b32fe1f2b1a277a36d629044e5723d3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/_hu9531286a05212efd4754e15ec69c182d_34441_df2a010f7821691e1a863a4d8781459b.webp"
width="728"
height="548"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialoges zum Transponieren von Spalten in Zeilen.
&lt;/figcaption>&lt;/figure>
&lt;p>Hierbei nicht vergessen, den Haken bei &amp;ldquo;Fill down in other columns&amp;rdquo; zu setzen.
Das spart das spaltenweise Auffüllen der einzelnen Spalten vor der Rückumwandlung.
Das Ergebnis nach der Umwandlung ist in Abbildung 10 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-daten-mit-den-zusammengefassten-ortsspalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Daten mit den zusammengefassten Ortsspalten." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-transposed_hu67d8978cb8a99b3cf1a7ef328c08a147_97535_561e77efd9069c7996bee9ed16244c72.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-transposed_hu67d8978cb8a99b3cf1a7ef328c08a147_97535_dd2f0dd42ce17ac1b9eed7730a1e9587.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-transposed_hu67d8978cb8a99b3cf1a7ef328c08a147_97535_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-transposed_hu67d8978cb8a99b3cf1a7ef328c08a147_97535_561e77efd9069c7996bee9ed16244c72.webp"
width="742"
height="616"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Daten mit den zusammengefassten Ortsspalten.
&lt;/figcaption>&lt;/figure>
&lt;p>Nach dem Abgleich werden die Daten mit
wie in Abbildung 11 gezeigt wieder in das Spaltenformat umgewandelt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialoges-zum-zurückführen-der-zeilen-in-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialoges zum zurückführen der Zeilen in Spalten." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/_hu3fcf722cf19cb83c224fe48cf0ebdc99_19235_f136eeeab379e9dcf3a58d22c8e65b4e.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/_hu3fcf722cf19cb83c224fe48cf0ebdc99_19235_276ecfbb87bc3b7401db31a6b1c2d915.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/_hu3fcf722cf19cb83c224fe48cf0ebdc99_19235_03b47d2927c736ea462a949e31e5d8eb.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/_hu3fcf722cf19cb83c224fe48cf0ebdc99_19235_f136eeeab379e9dcf3a58d22c8e65b4e.webp"
width="602"
height="448"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialoges zum zurückführen der Zeilen in Spalten.
&lt;/figcaption>&lt;/figure>
&lt;p>Das Ergebnis der Rückumwandlung ist in Abbildung 12 gezeigt.
Bei Bedarf kann man die Ortsspalten jetzt wieder einsortieren und/oder für jede Ortsspalte eine GND-ID Spalte hinzufügen mit
&amp;ldquo;Ortsspalte&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add entity identifiers column&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-mit-den-mit-der-gnd-abgeglichenen-daten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit den mit der GND abgeglichenen Daten." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-end_huf535e77c4bbc8f5c19476c8ee70eae18_79814_7ac1b7d559d07442fcd48e8d53072c0e.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-end_huf535e77c4bbc8f5c19476c8ee70eae18_79814_6c5ce184903cab5308dc84ba1062ac47.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-end_huf535e77c4bbc8f5c19476c8ee70eae18_79814_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-end_huf535e77c4bbc8f5c19476c8ee70eae18_79814_7ac1b7d559d07442fcd48e8d53072c0e.webp"
width="760"
height="321"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit den mit der GND abgeglichenen Daten.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="automatischer-fill-down">Automatischer Fill-down&lt;/h3>
&lt;p>Sollte man beim Umwandeln in das Zeilenformat vergessen haben, den Haken bei &amp;ldquo;Fill down in other columns&amp;rdquo; zu setzen, dann kann man das noch spaltenweise mit
&amp;ldquo;Spaltenname&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Fill down&amp;rdquo;
nachholen.&lt;/p>
&lt;p>Hat man sehr viele Spalten, so kann man stattdessen via
&amp;ldquo;ALL&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
den folgenden GREL Ausdruck verwenden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">columnName&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Dabei ist darauf zu achten, dass man die ID-Spalte entweder auslässt und separat auffüllt, oder die ID-Spalte bei der Massenbearbeitung via &amp;ldquo;Drag&amp;amp;Drop&amp;rdquo; ans Ende verschiebt.
Ansonsten ändert sich die &amp;ldquo;Record&amp;rdquo;-Struktur, bevor alle Spalten befüllt wurden und der GREL-Ausdruck funktioniert nicht mehr.&lt;/p>
&lt;h3 id="alternative-für-gnd-id-spalten">Alternative für GND-ID Spalten&lt;/h3>
&lt;p>Hat man sehr viele Ortsspalten, dann lässt sich die Erzeugung der GND-ID-Spalten auch etwas automatisieren.&lt;/p>
&lt;p>Nachdem man die Daten mit der GND abgeglichen hat (also bevor man die Zeilen wieder in Spalten überführt), ergänzt man die GND-Nummer im Namen des Ortes über
&amp;ldquo;Ort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
und dem folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;||&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">cell&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">recon&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">match&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anschließend werden die Werte via
&amp;ldquo;Ort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Split multi-valued cells&amp;hellip;&amp;rdquo;
und den Trennzeichen &lt;code>||&lt;/code> in mehrere Zeilen aufgeteilt.&lt;/p>
&lt;p>Der zukünftige Spaltenname wird ergänzt via
&amp;ldquo;Ortstyp&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
und dem folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">columnName&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34; (GND-ID)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Das Ergebnis sieht dann wie in Abbildung 13 aus.
Dort müssen jetzt noch die restlichen Spalten vor der Umwandlung in das auf Spalten basierte Format zum Beispiel mit &amp;ldquo;Fill down&amp;rdquo; aufgefüllt werden&lt;/p>
&lt;figure id="figure-bildschirmfoto-ergänzten-zeilen-für-die-zukünftigen-gnd-id-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto ergänzten Zeilen für die zukünftigen GND-ID Spalten." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-mit-gnd-id_hu4c26e534cac07c8f5c1e10852e2e07f6_161693_342a707ad00c5b5c1010a4b92202f03d.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-mit-gnd-id_hu4c26e534cac07c8f5c1e10852e2e07f6_161693_8f7ca77516a134d4733b1755cd8ae038.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-mit-gnd-id_hu4c26e534cac07c8f5c1e10852e2e07f6_161693_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-mit-gnd-id_hu4c26e534cac07c8f5c1e10852e2e07f6_161693_342a707ad00c5b5c1010a4b92202f03d.webp"
width="498"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto ergänzten Zeilen für die zukünftigen GND-ID Spalten.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Transponieren in OpenRefine hat noch weitere Features, wie zum Beispiel die Berücksichtigung von extra Spalten, mehreren Werten und separaten Spalten für Notizen. Dabei ist OpenRefine gerade beim Unwandeln von zeilenweisen Daten in spaltenweise sehr sensibel gegenüber der Sortierung der Werte in der Schlüsselspalte und ggf. weiteren Spalten, die nicht mit umgewandelt werden sollen.&lt;/p>
&lt;p>Ein typischer Fehler ist zum Beispiel die Umwandlung von &amp;ldquo;Records&amp;rdquo; mit &amp;ldquo;Columnize by key/value columns&amp;rdquo; &lt;strong>ohne&lt;/strong> die &amp;ldquo;Records&amp;rdquo; vorher mit &amp;ldquo;Fill down&amp;rdquo; aufzulösen. Das führt dazu, dass &amp;ldquo;Leer&amp;rdquo; als eigener Wert berücksichtigt wird und OpenRefine die Daten dadurch wie in Abbildung 8 sehr unerwartet sortiert.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-ergebnisses-von-aufgabe-2-ohne-fill-down">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Ergebnisses von Aufgabe 2 ohne &amp;#39;Fill down&amp;#39;." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-no-fill-down_hu1ecbac96f023095782251cdc331a2bbd_26674_ba5828d9adf4f3b89ce161fd9d32d814.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-no-fill-down_hu1ecbac96f023095782251cdc331a2bbd_26674_a9feb44018dbb0d9708cacb8c9a83fca.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-no-fill-down_hu1ecbac96f023095782251cdc331a2bbd_26674_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-no-fill-down_hu1ecbac96f023095782251cdc331a2bbd_26674_ba5828d9adf4f3b89ce161fd9d32d814.webp"
width="582"
height="327"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Ergebnisses von Aufgabe 2 ohne &amp;lsquo;Fill down&amp;rsquo;.
&lt;/figcaption>&lt;/figure>
&lt;hr>
&lt;p>Im nächsten Teil ergänzen wir mit OpenRefine ein Projekt mit Daten aus anderen Projekten.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen" class="btn btn-primary px-3 py-3">12 Daten zwischen Projekten in OpenRefine abgleichen&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Die Welt der Facets in OpenRefine</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/</guid><description>&lt;p>Nachdem wir uns im Workshops für Einsteiger hauptsächlich mit den Text Facets in OpenRefine beschäftigt haben, betrachten wir in diesem Tutorial weitere nützliche Facets.&lt;/p>
&lt;h2 id="einführung">Einführung&lt;/h2>
&lt;blockquote>
&lt;p>Facets in der &lt;a href="https://docs.openrefine.org/manual/facets" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;br>
Reconciliation Facets in der &lt;a href="https://docs.openrefine.org/manual/reconciling#reconciliation-facets" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;h2 id="vorbereitung-projekt-erstellen">Vorbereitung: Projekt erstellen&lt;/h2>
&lt;p>Wir verwenden das im Tutorial &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/">12 Daten zwischen Projekten abgleichen&lt;/a> erstellte Projekt &amp;ldquo;Staedte in BW&amp;rdquo;.&lt;/p>
&lt;h2 id="aufgabe-1-datentypen-anpassen">Aufgabe 1: Datentypen anpassen&lt;/h2>
&lt;p>Der Grundzustand des Projektes ist in Abbildung 1 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-staedte-in-bw-ohne-anpassungen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes &amp;#39;Staedte in BW&amp;#39; ohne Anpassungen." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte_hu23b4a18812c4c690b101ceea0ef50968_126831_3e27bc5b8bdb9eb5de1b81ec31bebaf8.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte_hu23b4a18812c4c690b101ceea0ef50968_126831_0947e76a68bc3805dd0caa3e116c0ba3.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte_hu23b4a18812c4c690b101ceea0ef50968_126831_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte_hu23b4a18812c4c690b101ceea0ef50968_126831_3e27bc5b8bdb9eb5de1b81ec31bebaf8.webp"
width="760"
height="495"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes &amp;lsquo;Staedte in BW&amp;rsquo; ohne Anpassungen.
&lt;/figcaption>&lt;/figure>
&lt;p>An der schwarzen Farbe der Spalteninhalte erkennen wir, dass wir es hier ausschließlich mit Textspalten zu tun haben.
Da wir in diesem Tutorial Facets für verschiedene Datentypen kennen lernen wollen, passen wir die Datentypen der einzelnen Spalten an.&lt;/p>
&lt;p>Hierfür gibt es in OpenRefine schon Befehle, die wir im Spaltenmenü finden
&amp;ldquo;&amp;hellip;&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Common Transforms&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;rdquo;&amp;hellip;&amp;rdquo;&lt;/p>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Wir passen die Datentypen in den folgenden Spalten an:&lt;/p>
&lt;ul>
&lt;li>Urkundlich erwaehnt: &lt;em>Datum&lt;/em> (&lt;code>toDate&lt;/code>)&lt;/li>
&lt;li>Flaeche (km2): &lt;em>Zahl&lt;/em> (&lt;code>toNumber&lt;/code>)&lt;/li>
&lt;li>Bevoelkerung (2021): &lt;em>Zahl&lt;/em> (&lt;code>toNumber&lt;/code>)&lt;/li>
&lt;li>Weibliche Bevoelkerung (2021): &lt;em>Zahl&lt;/em> (&lt;code>toNumber&lt;/code>)&lt;/li>
&lt;li>Maennliche Bevoelkerung (2021): &lt;em>Zahl&lt;/em> (&lt;code>toNumber&lt;/code>)&lt;/li>
&lt;/ul>
&lt;p>Das Ergebnis sollte dann aussehen wie in Abbildung 2.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-staedte-in-bw-nach-typanpassungen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes &amp;#39;Staedte in BW&amp;#39; nach Typanpassungen." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-typed_hu6cdee9e0c93fbb379cb717a453836e7b_132898_de527d6027e7578ac1ea42f841a81ce3.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-typed_hu6cdee9e0c93fbb379cb717a453836e7b_132898_8e781d30749539ccdaa2d51ce12db629.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-typed_hu6cdee9e0c93fbb379cb717a453836e7b_132898_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-typed_hu6cdee9e0c93fbb379cb717a453836e7b_132898_de527d6027e7578ac1ea42f841a81ce3.webp"
width="760"
height="497"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes &amp;lsquo;Staedte in BW&amp;rsquo; nach Typanpassungen.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-2-all-facets">Aufgabe 2: All Facets&lt;/h2>
&lt;p>In der &amp;ldquo;All&amp;rdquo; Spalte gibt es Facets, die auf den ganzen Datensatz angewendet werden können.
Neben den schon bekannten Facets zum Filtern von mit Sternen oder Flaggen markierten Zeilen sowie komplett leeren Zeilen gibt es auch Facets zum Filtern von leeren Einträgen in Spalten oder Records. In Abbildung 3 sind die beiden Facets für &amp;ldquo;Blank value per column&amp;rdquo; und &amp;ldquo;Non-blank value per column&amp;rdquo; gezeigt. Mit diesen Facets lassen sich schnell und übersichtlich Zeilen filtern, ohne das &amp;ldquo;Facet by blank&amp;rdquo; für jede Spalte separat aufzurufen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-facets-zur-identifikation-von-leeren-feldern">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Facets zur Identifikation von leeren Feldern." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-all_hud9b07ea4e8c881de79178040bef9c8b4_17740_9af10a0215a2885708a93e74684a0b3e.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-all_hud9b07ea4e8c881de79178040bef9c8b4_17740_d584b652e99332dcccbd68bb56d7a2f5.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-all_hud9b07ea4e8c881de79178040bef9c8b4_17740_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-all_hud9b07ea4e8c881de79178040bef9c8b4_17740_9af10a0215a2885708a93e74684a0b3e.webp"
width="292"
height="411"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Facets zur Identifikation von leeren Feldern.
&lt;/figcaption>&lt;/figure>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Überprüfen Sie die folgende Aussage.&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Alle Orte in diesem Datensatz ohne Angabe zum männlichen Bevölkerungsanteil haben auch keine Angabe zum weiblichen Bevölkerungsanteil.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;h2 id="aufgabe-3-null-oder-leer">Aufgabe 3: Null oder Leer&lt;/h2>
&lt;p>Bei den einzelnen Spalten gibt es drei Facets zur Identifikation von leeren Zeilen.
Das Äquivalent zu den in Aufgabe 2 vorgestellten Facets ist das &amp;ldquo;Facet by blank (null or empty string)&amp;rdquo;, welches in Abbildung 4 abgebildet ist.
Das Facet wurde geöffnet mit
&amp;ldquo;Urkundlich erwaehnt&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Customized facets&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Facet by blank (null or empty string)&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-facet-by-blank-null-or-empty-string">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des &amp;#39;Facet by blank (null or empty string)&amp;#39;." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-null-or-empty_hu1bc10f721940be5ebb0cd71462078d40_5003_74b2cee75cb7d9f9588145bd403d6d4e.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-null-or-empty_hu1bc10f721940be5ebb0cd71462078d40_5003_635e0622387449b57d128fe762cbf91a.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-null-or-empty_hu1bc10f721940be5ebb0cd71462078d40_5003_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-null-or-empty_hu1bc10f721940be5ebb0cd71462078d40_5003_74b2cee75cb7d9f9588145bd403d6d4e.webp"
width="294"
height="145"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des &amp;lsquo;Facet by blank (null or empty string)&amp;rsquo;.
&lt;/figcaption>&lt;/figure>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Öffnen Sie auf der Spalte &amp;ldquo;Urkundlich erwaehnt&amp;rdquo; zusätzlich die Facets &amp;ldquo;Facet by null&amp;rdquo; und &amp;ldquo;Facet by empty string&amp;rdquo;. Worin unterscheiden sich die drei Facets?&lt;/p>
&lt;details class="spoiler " id="spoiler-12">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>OpenRefine unterscheidet zwischen nichts (&lt;em>null&lt;/em>) und einem leeren Text (&amp;quot;&amp;quot;), der ja zumindest vom Typ Text ist.
Da wir aber häufig &lt;em>null&lt;/em> und &amp;quot;&amp;quot; gemeinsam behandeln wollen, gibt es zusätzlich &lt;em>blank&lt;/em>, was &lt;em>null&lt;/em> und &amp;quot;&amp;quot; zusammenfasst.&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-4-numeric-facets">Aufgabe 4: Numeric Facets&lt;/h2>
&lt;p>OpenRefine bietet unterschiedliche visuelle Darstellungen für Zahlen in Facets an.
In Abbildung 5 ist die Histogrammansicht gezeigt. Auf der X-Achse ist der Wertebereich abgebildet und auf der Y-Achse die Häufigkeit des entsprechenden Wertes. Der angezeigte Bereich lässt sich mit Schiebern an den Seiten einschränken.&lt;/p>
&lt;p>Zusätzlich zu dem normalen &amp;ldquo;Numeric Facet&amp;rdquo; gibt es bei den &amp;ldquo;Customized Facets&amp;rdquo; noch eine logarithmische Darstellung (&amp;ldquo;Numeric log facet&amp;rdquo;) und eine begrenzte logarithmische Darstellung (&amp;ldquo;1-boundet numeric log facet&amp;rdquo;).&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-facets-für-zahlen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Facets für Zahlen." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric_huff1be850b24c274c92d9a0557282ed50_8483_2b08673d7a095266ae1e35f80891bf47.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric_huff1be850b24c274c92d9a0557282ed50_8483_93988c38af4a094ec6bf70fff1a50cd4.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric_huff1be850b24c274c92d9a0557282ed50_8483_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric_huff1be850b24c274c92d9a0557282ed50_8483_2b08673d7a095266ae1e35f80891bf47.webp"
width="294"
height="370"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Facets für Zahlen.
&lt;/figcaption>&lt;/figure>
&lt;p>Eine andere Darstellung ist das &amp;ldquo;Scatterplot facet&amp;rdquo;, welches zuerst ein &lt;a href="https://de.wikipedia.org/wiki/Streudiagramm" target="_blank" rel="noopener">Streudiagramm&lt;/a> über alle numerischen Spalten anzeigt (Abbildung 6) und durch Auswahl eines Streudiagramms dieses in die Facet Ansicht übernimmt (Abbildung 7).&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-scatterplots-über-alle-numerischen-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Scatterplots über alle numerischen Spalten." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-scatter-all_huaf6d563d6277d1afdafaa72fdb7e9429_15212_8e6e42c8db6ed8c05b3ccd024d7a309c.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-scatter-all_huaf6d563d6277d1afdafaa72fdb7e9429_15212_a4fa0641858a082f6129d5fb78b0753b.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-scatter-all_huaf6d563d6277d1afdafaa72fdb7e9429_15212_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-scatter-all_huaf6d563d6277d1afdafaa72fdb7e9429_15212_8e6e42c8db6ed8c05b3ccd024d7a309c.webp"
width="501"
height="591"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Scatterplots über alle numerischen Spalten.
&lt;/figcaption>&lt;/figure>
&lt;p>In dem Streudiagramm in Abbildung 7 lassen sich auch Werte und Bereiche mit der Maus auswählen und danach filtern.&lt;/p>
&lt;figure id="figure-bildschirmfoto-eines-scatterplots-in-der-facet-ansicht">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto eines Scatterplots in der Facet Ansicht." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-scatter-one_hu699ad9181a84fcfbcbd0e8e7fdb09890_7568_c3aec09954d265fab433184d1d0f0c61.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-scatter-one_hu699ad9181a84fcfbcbd0e8e7fdb09890_7568_535aa6ae50d4f3ac09fb8c913550716a.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-scatter-one_hu699ad9181a84fcfbcbd0e8e7fdb09890_7568_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-scatter-one_hu699ad9181a84fcfbcbd0e8e7fdb09890_7568_c3aec09954d265fab433184d1d0f0c61.webp"
width="297"
height="210"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto eines Scatterplots in der Facet Ansicht.
&lt;/figcaption>&lt;/figure>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> In dem Datensatz gibt es laut Streudiagramm eine Stadt mit einem leichten &amp;ldquo;Männerüberschuss&amp;rdquo;. Um welche Stadt handelt es sich dabei?&lt;/p>
&lt;details class="spoiler " id="spoiler-16">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>Bei der Stadt handelt es sich um Karlsruhe.&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-5-timeline-und-custom-facets">Aufgabe 5: Timeline (und Custom) Facets&lt;/h2>
&lt;p>Es gibt ein separates Timeline Facet, welches auf eine Spalte vom Typ Datum (&amp;ldquo;date&amp;rdquo;) angewendet werden kann.
Wie in Abbildung 8 zu sehen, ist das ähnlich wie beim &amp;ldquo;Numeric facet&amp;rdquo; ein Histogramm, nur dass die Daten auf der X-Achse nach Datum geordnet sind.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-timeline-facet">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des &amp;#39;Timeline facet&amp;#39;." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-timeline_huab5159b19ff462b24c39e95d422a8e1a_5027_fe3e5a359c834200424ea5b28eff5b66.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-timeline_huab5159b19ff462b24c39e95d422a8e1a_5027_5ee51a6615e457f86915c680264daad9.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-timeline_huab5159b19ff462b24c39e95d422a8e1a_5027_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-timeline_huab5159b19ff462b24c39e95d422a8e1a_5027_fe3e5a359c834200424ea5b28eff5b66.webp"
width="294"
height="160"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des &amp;lsquo;Timeline facet&amp;rsquo;.
&lt;/figcaption>&lt;/figure>
&lt;p>Da das bei Jahreszahlen auch recht schnell unübersichtlich wird, können wir so ein Facet auch selbst erstellen.
Wir gehen dazu auf
&amp;ldquo;Urkundlich erwaehnt&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Custome Numeric Facet&amp;hellip;&amp;rdquo;
und verwenden den folgenden GREL-Ausdruck um das in Abbildung 9 gezeigte Facet zu erstellen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">datePart&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;year&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;figure id="figure-bildschirmfoto-eines-custom-numeric-facet">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto eines &amp;#39;Custom Numeric Facet&amp;#39;." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-custom_hu35842dd8e8809bf3f7054b2c6e4f2aa4_4621_3836c8922a0ebb210796ec0c41555b33.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-custom_hu35842dd8e8809bf3f7054b2c6e4f2aa4_4621_6ea57695d0a51403cc0b38c672862a55.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-custom_hu35842dd8e8809bf3f7054b2c6e4f2aa4_4621_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-custom_hu35842dd8e8809bf3f7054b2c6e4f2aa4_4621_3836c8922a0ebb210796ec0c41555b33.webp"
width="292"
height="158"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto eines &amp;lsquo;Custom Numeric Facet&amp;rsquo;.
&lt;/figcaption>&lt;/figure>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Erstellen Sie ein Facet mit den Differenzen für &amp;ldquo;weibliche - männliche&amp;rdquo; Bevölkerung.&lt;/p>
&lt;details class="spoiler " id="spoiler-21">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;p>Dafür benötigen wir ein &amp;ldquo;Custom Numeric Facet&amp;rdquo; mit dem folgenden GREL-Ausdruck:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Weibliche Bevoelkerung (2021)&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">-&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Maennliche Bevoelkerung (2021)&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Da wir in dem GREL Ausdruck die Spalten direkt aufrufen, ist es egal von welcher Spalte aus wir das Facet erstellen.&lt;/p>
&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-6-text-facets">Aufgabe 6: Text Facets&lt;/h2>
&lt;p>Es gibt neben dem &amp;ldquo;normalen&amp;rdquo; Text Facet auch noch weitere Facets zum Umgang mit Text.
In Abbildung 10 sind untereinander das &amp;ldquo;Text length facet&amp;rdquo;, das &amp;ldquo;Log of text length facet&amp;rdquo; und das &amp;ldquo;Unicode char-code facet&amp;rdquo; gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-facets-zu-textlängen-und-dem-unicode-zeichenbereich">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Facets zu Textlängen und dem Unicode Zeichenbereich." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-text_hufdec9d14403abe47bf72cff729c63847_7203_08939bbb71eb51960d8c59c7baa698e2.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-text_hufdec9d14403abe47bf72cff729c63847_7203_6236bd4395a16688faad707094a40e9e.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-text_hufdec9d14403abe47bf72cff729c63847_7203_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-text_hufdec9d14403abe47bf72cff729c63847_7203_08939bbb71eb51960d8c59c7baa698e2.webp"
width="294"
height="372"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Facets zu Textlängen und dem Unicode Zeichenbereich.
&lt;/figcaption>&lt;/figure>
&lt;p>Ziemlich hilfreich bei Texten ist auch das in Abbildung 11 gezeigte &amp;ldquo;Word Facet&amp;rdquo;, welches alle in der Spalte vorkommenden Worte aufzählt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-word-facet">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des &amp;#39;Word facet&amp;#39;." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-words_hud6643859f4ac9ce878705b5ed527b7fe_8207_9c82c2a262a62e0ea281bf29cf7ed546.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-words_hud6643859f4ac9ce878705b5ed527b7fe_8207_d8260662a8f14438f2194f22143dce9d.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-words_hud6643859f4ac9ce878705b5ed527b7fe_8207_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-words_hud6643859f4ac9ce878705b5ed527b7fe_8207_9c82c2a262a62e0ea281bf29cf7ed546.webp"
width="291"
height="292"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des &amp;lsquo;Word facet&amp;rsquo;.
&lt;/figcaption>&lt;/figure>
&lt;p>In Abbildung 11 ist zum Beispiel bei &amp;ldquo;erwähnt,&amp;rdquo; zu sehen, dass das normale Wort Facet auch Satzzeichen berücksichtigt.
Möchte man das vermeiden, so kann dies durch einen Klick auf das blaue &amp;ldquo;change&amp;rdquo; im Kopfbereich des Facets angepasst werden.
Wir passen den GREL-Ausdruck wie folgt an und erhalten das in Abbildung 12 gezeigte Facet.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/(?&amp;lt;=[a-z])[,.-]/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39; &amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;figure id="figure-bildschirmfoto-des-angepassten-word-facet">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des angepassten &amp;#39;Word facet&amp;#39;." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-words-custom_hu485392b8583c1c8fa3886d7282f85979_9964_9c164403c9cadd375e87ca198755752a.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-words-custom_hu485392b8583c1c8fa3886d7282f85979_9964_428d13a6e213c7898258fcdd9859f1e3.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-words-custom_hu485392b8583c1c8fa3886d7282f85979_9964_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-words-custom_hu485392b8583c1c8fa3886d7282f85979_9964_9c164403c9cadd375e87ca198755752a.webp"
width="293"
height="325"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des angepassten &amp;lsquo;Word facet&amp;rsquo;.
&lt;/figcaption>&lt;/figure>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Erstellen Sie auf der Spalte &amp;ldquo;Kurzbiographie&amp;rdquo; ein Facet, welches alle darin vorkommenden Jahreszahlen darstellt.&lt;/p>
&lt;details class="spoiler " id="spoiler-25">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;p>Dafür benötigen wir ein &amp;ldquo;Custom Text Facet&amp;rdquo; mit dem folgenden GREL-Ausdruck:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\d{3,4}/&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-7-facets-für-reconciliation">Aufgabe 7: Facets für Reconciliation&lt;/h2>
&lt;p>Es gibt spezielle Facets zur Unterstützung von Reconciliation Vorgängen.
Zwei davon (&amp;ldquo;Jugment action type&amp;rdquo; und &amp;ldquo;Best candidate&amp;rsquo;s score&amp;rdquo;) werden automatisch geladen.&lt;/p>
&lt;p>Es können weitere Facets nachgeladen werden.
Dafür starten wir einen Reconciliation Vorgang über
&amp;ldquo;Stadt&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start Reconciling&amp;rdquo;
und verwenden als &amp;ldquo;Service&amp;rdquo; den &amp;ldquo;GND reconciliation for OpenRefine&amp;rdquo; Service von lobid (siehe &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/">06 Reconciling mit OpenRefine und der GND&lt;/a> für die grundlegende Einrichtung und Benutzung des Dienstes).&lt;/p>
&lt;p>Wir suchen nach einem &amp;ldquo;Geografikum&amp;rdquo; und lassen gut passende Treffer automatisch auswählen.
Die Einstellungen sind in Abbildung 13 abgebildet.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-einstellungen-für-den-reconciling-dialog">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Einstellungen für den Reconciling Dialog." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-dialog_hu8757b0071674b685548561bd0d4f44e7_39892_2c56352f8f2098319e16f500492dbde2.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-dialog_hu8757b0071674b685548561bd0d4f44e7_39892_b6a4fd8c8b3541c945e5593fb8831a65.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-dialog_hu8757b0071674b685548561bd0d4f44e7_39892_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-dialog_hu8757b0071674b685548561bd0d4f44e7_39892_2c56352f8f2098319e16f500492dbde2.webp"
width="760"
height="508"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Einstellungen für den Reconciling Dialog.
&lt;/figcaption>&lt;/figure>
&lt;p>Über
&amp;ldquo;Stadt&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Facets&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;rdquo;&amp;hellip;&amp;quot;
können wir dann die restlichen Facets nachladen.&lt;/p>
&lt;h3 id="gruppe-1-entscheidung">Gruppe 1: Entscheidung&lt;/h3>
&lt;ul>
&lt;li>&lt;em>By judgment&lt;/em> (default)&lt;/li>
&lt;li>&lt;em>Jugment action type&lt;/em>&lt;/li>
&lt;li>&lt;em>Jugment action timestamp&lt;/em>&lt;/li>
&lt;/ul>
&lt;figure id="figure-bildschirmfoto-der-ersten-facet-gruppe">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der ersten Facet Gruppe." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-01_hufb43dc021b79d0661277cd65202d17d6_16099_b51356598975812d06162db0c003e7f5.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-01_hufb43dc021b79d0661277cd65202d17d6_16099_92e9345cfbf57a6e68989fbc6acdaf68.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-01_hufb43dc021b79d0661277cd65202d17d6_16099_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-01_hufb43dc021b79d0661277cd65202d17d6_16099_b51356598975812d06162db0c003e7f5.webp"
width="280"
height="466"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der ersten Facet Gruppe.
&lt;/figcaption>&lt;/figure>
&lt;p>In der Gruppe 1 sind Facets zu den getroffenen Entscheidungen zu finden.
Hier kann danach gefiltert werden, ob für eine Zeile schon eine Entscheidung getroffen wurde, ob die Entscheidung automatisch oder manuell getroffen wurde und sogar zu welchem Zeitpunkt (Zeitstempel) die Entscheidung getroffen wurde.&lt;/p>
&lt;h3 id="gruppe-2-treffer">Gruppe 2: Treffer&lt;/h3>
&lt;ul>
&lt;li>&lt;em>Best candidate&amp;rsquo;s score&lt;/em> (default)&lt;/li>
&lt;li>&lt;em>Best candidate&amp;rsquo;s type match&lt;/em>&lt;/li>
&lt;li>&lt;em>Best candidate&amp;rsquo;s name match&lt;/em>&lt;/li>
&lt;/ul>
&lt;figure id="figure-bildschirmfoto-der-zweiten-facet-gruppe">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der zweiten Facet Gruppe." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-02_hu6ba9966f242a4d53cb6b0a5011c0445b_12221_19befeddf21251f62c61e1e742e0ce7a.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-02_hu6ba9966f242a4d53cb6b0a5011c0445b_12221_4b7bc6df19224e1f77d7d3ffef1a95c2.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-02_hu6ba9966f242a4d53cb6b0a5011c0445b_12221_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-02_hu6ba9966f242a4d53cb6b0a5011c0445b_12221_19befeddf21251f62c61e1e742e0ce7a.webp"
width="279"
height="384"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der zweiten Facet Gruppe.
&lt;/figcaption>&lt;/figure>
&lt;p>Die zweite Gruppe bezieht sich auf die Treffer und zwar immer nur auf den &amp;ldquo;besten&amp;rdquo; Treffer.
Hier gibt es das Standard Facet mit der Bewertung des Treffers durch den Reconciliation Service.
Außerdem gibt es noch zwei Facets, welche nützlich sind, wenn man iterativ mehrere Reconciliation Versuche auf einer Spalte durchführt und dabei mit und ohne Typisierung sucht.&lt;/p>
&lt;h3 id="gruppe-3-treffer-ähnlichkeit">Gruppe 3: Treffer Ähnlichkeit&lt;/h3>
&lt;ul>
&lt;li>&lt;em>Best candidate&amp;rsquo;s name edit distance&lt;/em>&lt;/li>
&lt;li>&lt;em>Best candidate&amp;rsquo;s name work similarity&lt;/em>&lt;/li>
&lt;/ul>
&lt;figure id="figure-bildschirmfoto-der-dritten-facet-gruppe">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der dritten Facet Gruppe." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-03_hu8542ba5db7f0697ee778cc6e05462e8b_6595_29c30c443862bff2a50d03cc79e47395.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-03_hu8542ba5db7f0697ee778cc6e05462e8b_6595_7d33090d1ef78b25364a5fbb3531fa15.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-03_hu8542ba5db7f0697ee778cc6e05462e8b_6595_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-03_hu8542ba5db7f0697ee778cc6e05462e8b_6595_29c30c443862bff2a50d03cc79e47395.webp"
width="278"
height="277"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der dritten Facet Gruppe.
&lt;/figcaption>&lt;/figure>
&lt;p>Der Algorithmus zur Auswahl von Treffern durch den Reconciliation Service ist häufig nicht transparent oder direkt nachvollziehbar.
Daher lassen sich in OpenRefine zusätzliche Facets laden, die die Ähnlichkeit des Spalteninhalts mit dem jeweils besten Treffer anzeigen.&lt;/p>
&lt;p>Die Editierdistanz basiert auf der &lt;a href="https://de.wikipedia.org/wiki/Levenshtein-Distanz" target="_blank" rel="noopener">Levenshtein Distanz&lt;/a>, die wir schon in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/05-clustering/">05 Daten mit OpenRefine clustern&lt;/a> kennen gelernt haben. Die &lt;strong>Wortähnlichkeit&lt;/strong> hingegen wird berechnet, indem die Anzahl der übereinstimmenden Wörter &lt;strong>ohne&lt;/strong> Stoppwörter zwischen Zellinhalt und bestem Treffer gezählt und normalisiert wird. Der Wertebereich geht dabei von 0 für keine Ähnlichkeit bis 1 für vollkommene Übereinstimmung.&lt;/p>
&lt;h3 id="gruppe-4-treffer-typ">Gruppe 4: Treffer Typ&lt;/h3>
&lt;ul>
&lt;li>&lt;em>Best candidate&amp;rsquo;s types&lt;/em>&lt;/li>
&lt;/ul>
&lt;figure id="figure-bildschirmfoto-der-vierten-facet-gruppe">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der vierten Facet Gruppe." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-04_hu6953efe4de676f06219f247b6b2520fa_6014_95b7bab093e73fe2ae9bf8243059b856.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-04_hu6953efe4de676f06219f247b6b2520fa_6014_35aeb03dd0c24cdbaadc46e3366d9c5a.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-04_hu6953efe4de676f06219f247b6b2520fa_6014_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-04_hu6953efe4de676f06219f247b6b2520fa_6014_95b7bab093e73fe2ae9bf8243059b856.webp"
width="292"
height="144"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der vierten Facet Gruppe.
&lt;/figcaption>&lt;/figure>
&lt;p>Die Liste der Typen, die sich aus dem jeweils besten Treffer für die einzelnen Zeilen ergeben.&lt;/p>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Beim Erstellen des Tutorials sind vier Städte automatisch mit einem Treffer gematcht worden. Ein Treffer ist jedoch falsch. Überlegen Sie, mit welcher Facet Kombination Sie diesen falschen Treffer schnell isolieren können.&lt;/p>
&lt;details class="spoiler " id="spoiler-38">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;p>Eine mögliche Kombination wäre im Facet &amp;ldquo;Jugment action type&amp;rdquo; den Wert &lt;em>auto&lt;/em> auszuwählen und im Facet &amp;ldquo;Best candidate’s name edit distance&amp;rdquo; auf eine Distanz größer 1 zu filtern.&lt;/p>
&lt;p>Der falsch zugeordnete Treffer ist dann &amp;ldquo;Freiburg im Breisgau&amp;rdquo;.&lt;/p>
&lt;p>Da sich die Implementierung der Suchstrategie im lobid Reconciliation Server ändern kann, ist es möglich, dass Sie andere Ergebnisse erhalten.&lt;/p>
&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-8-duplikate">Aufgabe 8: Duplikate&lt;/h2>
&lt;p>Das Duplikate Facet haben wir bewusst übersprungen und an das Ende verschoben.&lt;/p>
&lt;p>Über &amp;ldquo;Urkundlich erwaehnt&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Customized facets&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Duplicates facet&amp;rdquo; können wir uns Zeilen anzeigen lassen, deren Werte mehr als einmal vorkommen.
Wir können hier aber keine Duplikate auswählen, markieren oder wie beim Clustern mit Ungenauigkeiten arbeiten.&lt;/p>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Überlegen Sie sich, wo das Duplikate Facet sinnvoll eingesetzt werden kann.&lt;/p>
&lt;details class="spoiler " id="spoiler-42">
&lt;summary>&lt;strong>Mögliche Lösung:&lt;/strong>&lt;/summary>
&lt;p>Im FDMLab nutzen wir das Facet zur schnellen Überprüfung, ob zum Beispiel eine ID-Spalte nur eindeutige Werte beinhaltet.&lt;/p>
&lt;/details>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Mit Facets können wir uns durch die Daten filtern, sie für die explorative Datenanalyse verwenden oder beim Data Cleaning zu bearbeitende Gruppen identifizieren und diese gesammelt korrigieren.
Mit einem Grundverständnis von GREL können wir uns selbst Facets programmieren oder den Code der voreingestellten Facets anpassen.
In Kombination mit regulären Ausdrücken können wir auf spezifischen Mustern basierende Facets erstellen.&lt;/p>
&lt;p>Da die Facets nicht selbst benannt werden können, gibt es jedoch das Risiko, sich in seinen eigenen Filtern zu verlaufen.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil beschäftigen wir uns mit dem Import und Export von XML in OpenRefine.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren" class="btn btn-primary px-3 py-3">14 XML importieren und exportieren&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>OpenRefine Workshop für Einsteiger veröffentlicht</title><link>https://fdmlab.landesarchiv-bw.de/post/2022-04-openrefine-workshop-veroeffentlicht/</link><pubDate>Tue, 19 Apr 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/post/2022-04-openrefine-workshop-veroeffentlicht/</guid><description>&lt;p>Was hat denn der Osterhase hier im Blog entdeckt?
Da ist seit Anfang April ein OpenRefine Workshop versteckt!&lt;/p>
&lt;p>Wir haben schon 2021 im FDMLab einen an die Bedürfnisse im Archiv angepassten Workshop für OpenRefine entwickelt. Diesen internen Workshop haben wir anschließend zum Nachlesen oder selbst Lernen für den FDMLab Blog aufbereitet und online gestellt.&lt;/p>
&lt;p>Im &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/warum-openrefine/">Workshop für Einsteiger&lt;/a> geben wir eine grundlegende Einführung in die Bedienung mit OpenRefine.
Dabei behandeln wir das Filtern, Sortieren und Umwandeln von Daten.
Anschließend beschäftigen wir uns mit den Funktionalitäten von OpenRefine um Daten zu Clustern, mit der Gemeinsamen Normdatei (GND) oder Wikidata abzugleichen.&lt;/p>
&lt;p>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/warum-openrefine/">
&lt;figure id="figure-link-zum-einsteiger-workshop-für-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Folie zum Einsteiger Workshop zu OpenRefine" srcset="
/post/2022-04-openrefine-workshop-veroeffentlicht/einsteiger-workshop_huae1fc9740e631dcd5f3ab7c106300ec3_255031_aa392a193ca03f2bd4e7b25597cad8fe.webp 400w,
/post/2022-04-openrefine-workshop-veroeffentlicht/einsteiger-workshop_huae1fc9740e631dcd5f3ab7c106300ec3_255031_c978c4014edcaa15435a7a004d5d1fa7.webp 760w,
/post/2022-04-openrefine-workshop-veroeffentlicht/einsteiger-workshop_huae1fc9740e631dcd5f3ab7c106300ec3_255031_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-04-openrefine-workshop-veroeffentlicht/einsteiger-workshop_huae1fc9740e631dcd5f3ab7c106300ec3_255031_aa392a193ca03f2bd4e7b25597cad8fe.webp"
width="760"
height="494"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Link zum Einsteiger Workshop für OpenRefine
&lt;/figcaption>&lt;/figure>
&lt;/a>&lt;/p>
&lt;p>Im Mai veröffentlichen wir darauf aufbauend einen &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/warum-openrefine/">Workshop für Fortgeschrittene&lt;/a>.
Hier werden wir uns uns mit regulären Ausdrücken und der Programmiersprache GREL beschäftigen.
Anschließend vertiefen wir die Arbeit mit OpenRefine im Kontext von Records und dem Umgang mit XML.
Als Bonus lernen wir die erweiterten Suchoptionen beim Abgleich mit dem lobid GND API kennen.&lt;/p>
&lt;p>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/warum-openrefine/">
&lt;figure id="figure-link-zum-fortgeschrittenen-workshop-für-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Folie zum Fortgeschrittenen Workshop zu OpenRefine" srcset="
/post/2022-04-openrefine-workshop-veroeffentlicht/fortgeschrittenen-workshop_hu00fd59ce174da3b35c679c79bdf7d37f_135707_3fd3e401d70943332d628859cd815222.webp 400w,
/post/2022-04-openrefine-workshop-veroeffentlicht/fortgeschrittenen-workshop_hu00fd59ce174da3b35c679c79bdf7d37f_135707_f48739266f38b516b4b9e68346058966.webp 760w,
/post/2022-04-openrefine-workshop-veroeffentlicht/fortgeschrittenen-workshop_hu00fd59ce174da3b35c679c79bdf7d37f_135707_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-04-openrefine-workshop-veroeffentlicht/fortgeschrittenen-workshop_hu00fd59ce174da3b35c679c79bdf7d37f_135707_3fd3e401d70943332d628859cd815222.webp"
width="760"
height="494"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Link zum Fortgeschrittenen Workshop für OpenRefine
&lt;/figcaption>&lt;/figure>
&lt;/a>&lt;/p></description></item><item><title>Workshop - Daten mit OpenRefine umwandeln</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/</link><pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/</guid><description>&lt;p>Wir lernen verschiedene Methoden kennen um Daten aufzuräumen und umzuwandeln.&lt;/p>
&lt;blockquote>
&lt;p>Daten transformieren in der &lt;a href="https://docs.openrefine.org/manual/transforming" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;h2 id="hintergrund">Hintergrund&lt;/h2>
&lt;p>OpenRefine bietet unterschiedliche Arten an Daten umzuwandeln.
Dies kann manuell auf Zellebene passieren, in einem &amp;ldquo;Facet&amp;rdquo;, auf Spaltenebene oder für bestimmte Aktionen auf dem kompletten Datensatz.&lt;/p>
&lt;p>In den folgenden Aufgaben werden wir nun aktiv Daten filtern, umwandeln und zusammenführen.&lt;/p>
&lt;h2 id="aufgabe-1-leere-zeilen-identifizieren-und-löschen">Aufgabe 1: Leere Zeilen identifizieren und löschen&lt;/h2>
&lt;p>Wie in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/02-filtern-und-sortieren/#aufgabe-3-facets-auf-alle-spalten">Aufgabe 3 in 02 Filtern und Sortieren&lt;/a> verwenden wir das &amp;ldquo;Facet by blank (null or empty string)&amp;rdquo; um Leerzeilen zu identifizieren.
Denn in den 4.000 Einträgen (rows) sollte es 5 Leerzeilen geben.
Diese werden jedoch nicht angezeigt, da sie nicht leer sind, sondern Leerzeichen beinhalten.&lt;/p>
&lt;p>Die Leerzeichen können wir global über
&amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit all columns&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Trim leading and trailing whitespace&amp;rdquo;
entfernen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-openrefine-mit-blank-facet">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine mit Blank Facet." srcset="
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_blank_hu378b95591ddb24bf1fc8cc32ccdc3103_28410_32164c41a1792ed7b6bbcdfdcbf4f0e4.webp 400w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_blank_hu378b95591ddb24bf1fc8cc32ccdc3103_28410_66f621a0f4b2860544a20fe42bcc1e49.webp 760w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_blank_hu378b95591ddb24bf1fc8cc32ccdc3103_28410_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_blank_hu378b95591ddb24bf1fc8cc32ccdc3103_28410_32164c41a1792ed7b6bbcdfdcbf4f0e4.webp"
width="760"
height="231"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine mit Blank Facet.
&lt;/figcaption>&lt;/figure>
&lt;p>Anschließend können wir, wie in Abbildung 1, mit dem &amp;ldquo;Facet by blank (null or empty string)&amp;rdquo; die Leerzeilen auswählen und via
&amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit rows&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Remove matching rows&amp;rdquo;
entfernen.&lt;/p>
&lt;p>Gehen Sie noch einmal zurück zu den Bildschirmfotos der Importeinstellungen in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden/">Projekte in OpenRefine laden und verwalten&lt;/a> und vergleichen diese für Aufgabe 1 und 2.&lt;/p>
&lt;p>Wir können Probleme mit Leerzeilen schon beim Importieren lösen, indem wir, wie bei Aufgabe 2, das Kontrollkästchen bei &amp;ldquo;Trim leading &amp;amp; trailing whitespace from strings&amp;rdquo; aktivieren und das Kontrollkästchen bei &amp;ldquo;Store blank rows&amp;rdquo; abwählen.
Das ist jedoch nicht immer möglich, oder manchmal wird es vergessen.&lt;/p>
&lt;h2 id="aufgabe-2-geschlechter-vereinheitlichen">Aufgabe 2: Geschlechter vereinheitlichen&lt;/h2>
&lt;p>Die Geschlechtsbezeichnungen in der Spalte &amp;ldquo;Geschlecht (m/w)&amp;rdquo; sind sehr uneinheitlich.
Wir wollen dies vereinheitlichen, so dass überall nur noch die Werte &amp;ldquo;m&amp;rdquo; und &amp;ldquo;w&amp;rdquo; stehen.&lt;/p>
&lt;p>Dafür testen wir mehrere Methoden.&lt;/p>
&lt;h3 id="1-einzeln-bearbeiten">1. Einzeln bearbeiten&lt;/h3>
&lt;p>Wenn wir mit der Maus über eine Zelle gehen, dann erscheint wie in Abbildung 2 eine blaue Bedienfläche mit der Bezeichnung &amp;ldquo;edit&amp;rdquo;.
Darüber können wir einzelne Zellen bearbeiten.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-edit-bedienfläche-in-zelle">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von Edit Bedienfläche in Zelle." srcset="
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_geschlecht_edit_cell_hu9003179a9c2d1df58f6647238692909f_1878_5043ab5c026ba3cf3f00d682d398b4f2.webp 400w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_geschlecht_edit_cell_hu9003179a9c2d1df58f6647238692909f_1878_4d16fa3e640c9369efe7485262fd8b09.webp 760w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_geschlecht_edit_cell_hu9003179a9c2d1df58f6647238692909f_1878_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_geschlecht_edit_cell_hu9003179a9c2d1df58f6647238692909f_1878_5043ab5c026ba3cf3f00d682d398b4f2.webp"
width="123"
height="42"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von Edit Bedienfläche in Zelle.
&lt;/figcaption>&lt;/figure>
&lt;details class="spoiler " id="spoiler-9">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>Die Bearbeitung auf diesem Weg kann zwar rückgängig gemacht, aber &lt;strong>nicht&lt;/strong> als Aktion exportiert werden!&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;h3 id="2-im-facet-bearbeiten">2. Im Facet bearbeiten&lt;/h3>
&lt;p>Wenn wir mit der Maus über einen Wert im Facet gehen, dann erscheint wie in Abbildung 3 ein blauer &amp;ldquo;edit&amp;rdquo; Link.
Darüber können wir alle Zellen mit diesem Wert in der Spalte gleichzeitig bearbeiten.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-edit-bedienfläche-in-facet">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von Edit Bedienfläche in Facet." srcset="
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_geschlecht_hu080af32c4dc2c9b0fcea7c796a263dec_11914_944b096cb01d3aaa514dd3112e2eac0e.webp 400w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_geschlecht_hu080af32c4dc2c9b0fcea7c796a263dec_11914_de525552bfa6b853e0c335c741dbdc6c.webp 760w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_geschlecht_hu080af32c4dc2c9b0fcea7c796a263dec_11914_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_geschlecht_hu080af32c4dc2c9b0fcea7c796a263dec_11914_944b096cb01d3aaa514dd3112e2eac0e.webp"
width="288"
height="432"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von Edit Bedienfläche in Facet.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="3-ersetzen-in-der-spalte">3. Ersetzen in der Spalte&lt;/h3>
&lt;p>Im Spaltenmenü findet sich unter
&amp;ldquo;Geschlecht (m/w)&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Replace&amp;rdquo;
ein Dialog, mit dem in dieser Spalte Ersetzungen durchgeführt werden können.&lt;/p>
&lt;h3 id="4-textfilter-und-transform">4. Textfilter und Transform&lt;/h3>
&lt;p>Eine andere Methode ist eine Kombination aus Textfilter und &amp;ldquo;Transform&amp;rdquo;.
Im Spaltenmenü wählen wir
&amp;ldquo;Geschlecht (m/w)&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Textfilter&amp;rdquo;
und geben im Eingabefeld des Filters nur den Buchstaben &amp;ldquo;w&amp;rdquo; ein, der praktischerweise in &amp;ldquo;männlich&amp;rdquo; nicht vorkommt.&lt;/p>
&lt;p>Im &amp;ldquo;Text Facet&amp;rdquo; für die Spalte Geschlecht, sehen wir analog zu Abbildung 4 die gefilterten Werte.&lt;/p>
&lt;figure id="figure-bildschirmfoto-mit-kombination-aus-facet-und-textfilter">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit Kombination aus Facet und Textfilter." srcset="
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_filter_geschlecht_hu06f838c25ee978cac463847e92f7f1d7_12086_6bf18f78c0133e7c1a4f78bc23b9db95.webp 400w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_filter_geschlecht_hu06f838c25ee978cac463847e92f7f1d7_12086_bbe7c44877f809d106d29a1505f0aeaa.webp 760w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_filter_geschlecht_hu06f838c25ee978cac463847e92f7f1d7_12086_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_filter_geschlecht_hu06f838c25ee978cac463847e92f7f1d7_12086_6bf18f78c0133e7c1a4f78bc23b9db95.webp"
width="288"
height="524"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit Kombination aus Facet und Textfilter.
&lt;/figcaption>&lt;/figure>
&lt;p>Anschließend rufen wir den Dialog zum Transformieren über das Spaltenmenü via
&amp;ldquo;Geschlecht (m/w)&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
auf.&lt;/p>
&lt;p>In dem Dialog könnte komplexer Code geschrieben werden, wir wollen den Inhalt jeder Zelle jedoch einfach mit dem Wert &lt;code>&amp;quot;w&amp;quot;&lt;/code> ersetzen. Die Anführungszeichen sind wichtig, da wir dadurch OpenRefine mitteilen, dass wir den Wert &lt;code>w&lt;/code> meinen, und keinen Programmcode.&lt;/p>
&lt;h2 id="aufgabe-3-spalte-akad-gradtitel-vereinheitlichen">Aufgabe 3: Spalte akad. Grad/Titel vereinheitlichen&lt;/h2>
&lt;p>In der Spalte &amp;ldquo;akad. Grad/Titel&amp;rdquo; sind die akademischen Grade uneinheitlich geschrieben (siehe auch Abbildung 5).
Überlegen Sie, welche der in Aufgabe 2 gelernten Methoden hier geeignet wäre und vereinheitlichen Sie die Titel.&lt;/p>
&lt;figure id="figure-bildschirmfoto-mit-text-facet-auf-spalte-titel">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit Text Facet auf Spalte Titel." srcset="
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_titel_hud98cf43111f0fa64f872a053c322fb7f_11328_30b0c4a31aab0daf18f39dcf2dc2628a.webp 400w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_titel_hud98cf43111f0fa64f872a053c322fb7f_11328_099667ca615f430511ba7213d8baa03e.webp 760w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_titel_hud98cf43111f0fa64f872a053c322fb7f_11328_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_titel_hud98cf43111f0fa64f872a053c322fb7f_11328_30b0c4a31aab0daf18f39dcf2dc2628a.webp"
width="288"
height="435"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit Text Facet auf Spalte Titel.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-4-spalten-auftrennen">Aufgabe 4: Spalten auftrennen&lt;/h2>
&lt;p>Bei den Ortsangaben sind der Ortsname und die GND-ID des Ortes mit &lt;code>|&lt;/code> getrennt in einer Zelle.
Wir wollen die Spalte &amp;ldquo;Geburtsort&amp;rdquo; auftrennen, so dass wir jeweils eine Spalte mit dem Ortsnamen und eine mit der zugehörigen GND-ID haben.&lt;/p>
&lt;p>Dafür verwenden wir im Spaltenmenü den Dialog
&amp;ldquo;Geburtsort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Split into several columns&amp;hellip;&amp;rdquo;
mit den in Abbildung 6 gezeigten Einstellungen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-vom-dialog-zum-auftrennen-von-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto vom Dialog zum Auftrennen von Spalten." srcset="
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_split_column_hua24e41abaf33f0085585e637446515dd_15506_5aa6213ad2f873d5991a6d07d190fe34.webp 400w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_split_column_hua24e41abaf33f0085585e637446515dd_15506_905ab864be45f409dc7f9cbca87ce243.webp 760w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_split_column_hua24e41abaf33f0085585e637446515dd_15506_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_split_column_hua24e41abaf33f0085585e637446515dd_15506_5aa6213ad2f873d5991a6d07d190fe34.webp"
width="602"
height="321"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto vom Dialog zum Auftrennen von Spalten.
&lt;/figcaption>&lt;/figure>
&lt;p>Anschließend entfernen wir überflüssige Leerzeichen via
&amp;ldquo;Geburtsort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Common transforms&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Trim leading and trailing whitespace&amp;rdquo;
und benennen die neuen Spalten entsprechend in &amp;ldquo;Geburtsort&amp;rdquo; und &amp;ldquo;Geburtsort (GND-ID)&amp;rdquo; um.&lt;/p>
&lt;details class="spoiler " id="spoiler-24">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>Mit Hilfe des regulären Ausdrucks &lt;code>\s*\|\s*&lt;/code> hätten wir die Leerzeichen beim Aufsplitten auch direkt entfernen können.&lt;/li>
&lt;li>Vielleicht sind Ihnen Zeilen aufgefallen, wo anstelle des Ortes nur die GND-ID steht. Um diese kümmern wir uns später.&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-5-spalten-zusammenführen">Aufgabe 5: Spalten zusammenführen&lt;/h2>
&lt;p>Beim Sterbedatum haben wir das umgekehrte Problem. Hier ist das Datum in drei Spalten aufgeteilt, wir wollen jedoch eine Spalte haben.
Bevor wir die Spalten zusammenführen, prüfen wir, ob die Werte in den einzelnen Spalten sinnvoll sind, und korrigieren die Werte bei Bedarf.&lt;/p>
&lt;p>Anschließend rufen wir im Spaltenmenü den Dialog zum Zusammenführen von Spalten auf
&amp;ldquo;Todesdatum (Tag)&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Join columns&amp;hellip;&amp;rdquo;
mit den in Abbildung 7 gezeigten Einstellungen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-vom-dialog-zum-zusammenführen-von-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto vom Dialog zum Zusammenführen von Spalten." srcset="
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_join_columns_hu5409e89bb940588afaebe13a709cb939_35082_072651385d676f82fd4dd4c0b9b198b2.webp 400w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_join_columns_hu5409e89bb940588afaebe13a709cb939_35082_eb0b404a55e10512c6b9398741113963.webp 760w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_join_columns_hu5409e89bb940588afaebe13a709cb939_35082_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_join_columns_hu5409e89bb940588afaebe13a709cb939_35082_072651385d676f82fd4dd4c0b9b198b2.webp"
width="760"
height="437"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto vom Dialog zum Zusammenführen von Spalten.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-6-datum-vereinheitlichen">Aufgabe 6: Datum vereinheitlichen&lt;/h2>
&lt;p>In der Spalte &amp;ldquo;Geburtsdatum (exakt)&amp;rdquo; gibt es mehrere Formate für das Geburtsdatum:&lt;/p>
&lt;ul>
&lt;li>&amp;ldquo;31.03.1920&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;31-03-1920&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;31. März 1920&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>OpenRefine bietet verschiedene Funktionen an, um mit Daten zu arbeiten.&lt;/p>
&lt;blockquote>
&lt;p>Datumsfunktionen in der &lt;a href="https://docs.openrefine.org/manual/grelfunctions#date-functions" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;p>Um die Daten in ein einheitliches Format zu bringen, wandeln wir sie zuerst in ein Datumsobjekt um und schreiben sie anschließend als Text wieder raus.&lt;/p>
&lt;p>Dafür müssen wir OpenRefine noch mitteilen, wie die Eingabe- und Zielformate aussehen:&lt;/p>
&lt;ul>
&lt;li>&amp;ldquo;dd.MM.yyyy&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;dd-MM-yyyy&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;dd. MMMM yyyy&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>Um die Daten umzuwandeln öffnen wir den Dialog zum Transformieren über das Spaltenmenü von
&amp;ldquo;Geburtsdatum (exakt)&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;rdquo;
und verwenden den Ausdruck:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toDate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;dd.MM.yyyy&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;dd-MM-yyyy&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;dd. MMMM yyyy&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">toString&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;dd.MM.yyyy&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;details class="spoiler " id="spoiler-30">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>OpenRefine bietet die Möglichkeit Programmcode zu nutzen um Transformationen durchzuführen. Dazu gehören &lt;a href="https://docs.openrefine.org/manual/jythonclojure" target="_blank" rel="noopener">Clojure/Python&lt;/a> und die &lt;a href="https://docs.openrefine.org/manual/expressions" target="_blank" rel="noopener">General Refine Expression Language (GREL)&lt;/a>.&lt;/li>
&lt;li>Die Datumsumwandlung gehört zu den Funktionen von GREL, die wir auf Grund ihrer Relevanz in diesen Einführungsworkshop mit aufgenommen haben.&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-7-daten-mit-filter-auf-eine-andere-spalte-übertragen">Aufgabe 7: Daten mit Filter auf eine andere Spalte übertragen&lt;/h2>
&lt;p>In der Spalte &amp;ldquo;Geburtsort&amp;rdquo; ist bei einem Ort die GND-ID verrutscht und der Ortsname verloren gegangen.
Bei dem Ort handelt es sich um &amp;ldquo;Breslau (Polen)&amp;rdquo; mit der GND-ID &amp;ldquo;4008216-7&amp;rdquo;.&lt;/p>
&lt;p>Um dies zu beheben erstellen wir ein &amp;ldquo;Text Facet&amp;rdquo; für die Spalte &amp;ldquo;Geburtsort&amp;rdquo; und filtern nur die Einträge mit &amp;ldquo;4008216-7&amp;rdquo;.
Es gibt nun verschiedene Möglichkeiten die Daten in die Spalte &amp;ldquo;Geburtsort (GND-ID)&amp;rdquo; zu übertragen.&lt;/p>
&lt;ol>
&lt;li>Zellen einzeln bearbeiten&lt;/li>
&lt;li>Ein weiteres &amp;ldquo;Text Facet&amp;rdquo; für die Spalte &amp;ldquo;Geburtsort (GND-ID)&amp;rdquo; erstellen und in beiden die Werte gesammelt bearbeiten.&lt;/li>
&lt;li>Die Werte via Textfilter oder &amp;ldquo;Text Facet&amp;rdquo; filtern und die Spalten zusammenführen (
&amp;ldquo;Geburtsort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Join columns&amp;hellip;&amp;rdquo;),
ohne die Original Spalte zu löschen.&lt;/li>
&lt;li>Im Spaltenmenü via
&amp;ldquo;Geburtsort (GND-ID)&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;rdquo;
die Daten aus der anderen Spalte mit dem Ausdruck &lt;code>row.cells[&amp;quot;Geburtsort&amp;quot;].value&lt;/code> kopieren.&lt;/li>
&lt;/ol>
&lt;p>Alle Varianten haben ihre Berechtigung und je nach Kontext oder Anwendungsfall eignet sich die ein oder andere eher.&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Die Kombination aus Facets/Filtern und den Bearbeitungsmöglichkeiten machen OpenRefine zu unserem Liebling beim Aufräumen von Daten (&lt;em>Data Cleaning&lt;/em>). Manchmal vermissen wir es jedoch größere Bereiche manuell auszuwählen und in eine andere Spalte zu Verschieben.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil lernen wir verschiedene Exportmöglichkeiten in OpenRefine kennen.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/04-exportieren" class="btn btn-primary px-3 py-3">04 Daten mit OpenRefine exportieren&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Gemeinsam an OpenRefine-Projekten arbeiten</title><link>https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/</link><pubDate>Tue, 07 Dec 2021 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/</guid><description>&lt;p>Im FDMLab testeten wir verschiedene Möglichkeiten mit OpenRefine gemeinsam an Projekten zu arbeiten.
Dieser Artikel fasst unsere Erfahrungen beim kollaborativen Arbeiten mit OpenRefine 3.5.0 zusammen.&lt;/p>
&lt;p>Wir hatten in
&lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-09-fuenf-dinge-die-wir-an-openrefine-moegen/">Fünf Dinge, die wir an OpenRefine mögen&lt;/a>
schon darüber berichtet, dass uns die Architektur von OpenRefine gefällt,
da sie es ermöglicht OpenRefine sowohl auf einem Client (Laptop, Rechner), als auch auf einem Server laufen zu lassen.
Die Bedienung erfolgt anschließend über den Browser.&lt;/p>
&lt;div class="mermaid">---
title: OpenRefine Setup
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph server[fas:fa-server Server]
server_or[fas:fa-gem OpenRefine]
end
subgraph laptop[fas:fa-laptop Laptop]
browser[far:fa-window-maximize Browser]
laptop_or[fas:fa-gem OpenRefine]
end
browser -.-> laptop_or &amp; server_or
&lt;/div>
&lt;p>Da läge es nahe, dass OpenRefine auch eine Benutzerverwaltung und eine Möglichkeit zum Kollaborativen Arbeiten an Projekten anbietet.
Dafür gab es Pläne ein &lt;a href="https://github.com/OpenRefine/OpenRefine/wiki/Broker-Protocol" target="_blank" rel="noopener">Broker Protokoll für OpenRefine&lt;/a> einzuführen, die bisher aber weder umgesetzt noch eingeplant wurden.&lt;/p>
&lt;p>In der &lt;a href="https://docs.openrefine.org/" target="_blank" rel="noopener">Dokumentation von OpenRefine&lt;/a> wird folgendes Vorgehen empfohlen:&lt;/p>
&lt;blockquote>
&lt;p>Die beste Art, mit einer anderen Person zusammenzuarbeiten, ist, Projekte zu exportieren und zu importieren, wobei alle Änderungen gespeichert werden, so dass Sie an der Stelle weiterarbeiten können, wo die andere Person aufgehört hat.&lt;/p>
&lt;p>Übersetzt von &lt;a href="https://docs.openrefine.org/manual/starting#import-a-project" target="_blank" rel="noopener">Starting a project: Import a project&lt;/a>, aufgerufen am 01.12.2021.&lt;/p>
&lt;/blockquote>
&lt;div class="mermaid">---
title: Gemeinsam arbeiten - Strategie 1
config:
look: handDrawn
theme: neutral
---
flowchart TD
subgraph a["fa:fa-user Alice"]
vaa["fa:fa-table Version A"]
vab["fa:fa-table Version B"]
vac["fa:fa-table Version C"]
vad["fa:fa-table Version D"]
end
subgraph b["fa:fa-user Bob"]
vba["fa:fa-table Version A"]
vbb["fa:fa-table Version B"]
end
subgraph c["fa:fa-user Charly"]
vcb["fa:fa-table Version B"]
vcc["fa:fa-table Version C"]
end
vaa -.Übergabe.-> vba --Arbeiten--> vbb -.Übergabe.-> vab -.Übergabe.-> vcb --Arbeiten--> vcc -.Übergabe.-> vac --Arbeiten--> vad
&lt;/div>
&lt;p>Konkret bedeutet das, dass bei einer Kooperation von Alice, Bob und Charly zwar alle an dem gleichen Projekt arbeiten können, jedoch nicht gleichzeitig. Nachdem Alice das Projekt an Bob übergeben hat, arbeitet Bob daran. Nachdem Bob fertig ist, übergibt er das Projekt an Alice zurück, die es an Charly übergibt. Nachdem Charly fertig ist, übergibt er das Projekt an Alice zurück,
die dann erst daran weiterarbeiten kann.
Das war für uns im FDMLab ein eher unbefriedigender Zustand, weshalb wir zu einer anderen Strategie gewechselt haben.&lt;/p>
&lt;div class="mermaid">---
title: Gemeinsam Arbeiten - Strategie 2
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph a["fa:fa-user Alice"]
va["fa:fa-table Version A"]
vb["fa:fa-table Version B"]
vc["fa:fa-table Version C"]
vd["fa:fa-table Version D"]
end
subgraph b["fa:fa-user Bob"]
pa["fa:fa-table Part A"]
end
subgraph c["fa:fa-user Charly"]
pb["fa:fa-table Part B"]
end
va -.-> pa
vb -.-> pb
pa -.-> vc
pb -.-> vd
va --Arbeiten--> vb --Arbeiten--> vc --Arbeiten--> vd
&lt;/div>
&lt;p>Wir haben angefangen Teile eines Projektes in OpenRefine auszulagern und nach erfolgreicher Bearbeitung wieder in das Originalprojekt einzupflegen.
So kann in unserem Beispiel Alice weiter an dem Projekt arbeiten, während Bob und Charly sie durch die Bearbeitung einzelner Teile unterstützen. Diese Teile werden anschließend von Alice wieder in das Originalprojekt eingepflegt.
Wie das funktioniert besprechen wir in den folgenden Unterpunkten.&lt;/p>
&lt;h2 id="zeilenweise-zusammenführen">Zeilenweise zusammenführen&lt;/h2>
&lt;p>Manchmal ist es möglich, ein Projekt zeilenweise aufzuteilen. Also dass Alice die ersten 100 Zeilen, Bob die nächsten 100 und Charly die letzten 75 Zeilen bearbeitet.&lt;/p>
&lt;p>Die Ergebnisse können nach der Bearbeitung als CSV-Dateien exportiert und daraus anschließend ein neues OpenRefine-Projekt erstellt werden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-dateiauswahl-oberfläche-von-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Dateiauswahl Oberfläche von OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-create-multiple-1_hu402989673ec7c7ca2e68b32580c83e60_3527_f8f279f4f94d7c5e8446255ac0f8e90a.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-create-multiple-1_hu402989673ec7c7ca2e68b32580c83e60_3527_6bff2ecacd8694f256793a04bf94172b.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-create-multiple-1_hu402989673ec7c7ca2e68b32580c83e60_3527_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-create-multiple-1_hu402989673ec7c7ca2e68b32580c83e60_3527_f8f279f4f94d7c5e8446255ac0f8e90a.webp"
width="304"
height="77"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Dateiauswahl Oberfläche von OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Wie in Abbildung 1 gezeigt, kann OpenRefine ein Projekt aus mehreren Dateien erstellen.
Das kann auch ein Dateiarchiv sein, dessen Dateien in ein neues Projekt importiert werden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dateifilter-oberfläche-von-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dateifilter Oberfläche von OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-create-multiple-2_hu632d044bc7e37669654237939b6eb031_22723_1399221371f58cd8b77ea03867927303.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-create-multiple-2_hu632d044bc7e37669654237939b6eb031_22723_fabc96d2b52b33acf2c43c94a595e0fd.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-create-multiple-2_hu632d044bc7e37669654237939b6eb031_22723_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-create-multiple-2_hu632d044bc7e37669654237939b6eb031_22723_1399221371f58cd8b77ea03867927303.webp"
width="760"
height="167"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dateifilter Oberfläche von OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Bevor das Projekt konfiguriert wird, gibt es wie in Abbildung 2 gezeigt, die Möglichkeit einzelne Dateien aus- oder abzuwählen.
Im Idealfall haben die einzelnen Dateien schon die gleichen Spaltenüberschriften in der richtigen Reihenfolge.
Ansonsten bietet OpenRefine mit der Möglichkeit &lt;a href="https://docs.openrefine.org/manual/columnediting#join-columns" target="_blank" rel="noopener">Spalten zu verbinden&lt;/a> und &lt;a href="https://docs.openrefine.org/manual/columnediting#renaming-removing-and-moving" target="_blank" rel="noopener">Spalten zu verschieben&lt;/a> die Möglichkeit das nachträglich zu bereinigen.&lt;/p>
&lt;h2 id="spaltenweise-zusammenführen">Spaltenweise zusammenführen&lt;/h2>
&lt;p>Ein häufiger Anwendungsfall im FDMLab ist, dass das Aufräumen und Transformieren der Daten von einer Person erledigt wird, die zum Beispiel beim Reconciling oder dem Abgleich mit weiteren Datenquellen von weiteren Personen unterstützt wird. Dafür werden einzelne Spalten als CSV (oder Excel) exportiert, von der unterstützenden Person bearbeitet und die Ergebnisse dann wieder in das Originalprojekt übernommen.&lt;/p>
&lt;p>Ein anderer Fall kann sein, dass es schon einen anderen Datensatz gibt, dessen Daten komplett oder teilweise übernommen werden sollen.
Das haben wir in &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/">Findbuchdaten mit OpenRefine wiederverwenden&lt;/a> teilweise besprochen.&lt;/p>
&lt;h3 id="beispiel">Beispiel&lt;/h3>
&lt;p>In unserem fiktiven Beispiel arbeitet Alice mit einem Datensatz der 16 Bundesländer, wie er in Abbildung 3 gezeigt ist.
Diesen gibt sie an Bob und Charly weiter.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-oberfläche-von-openrefine-mit-den-16-bundesländern">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Oberfläche von OpenRefine mit den 16 Bundesländern." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender_hu834d87ba914778413fda02e8c0d2c96a_13980_40dbfda5bc30f47578f1087796953bee.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender_hu834d87ba914778413fda02e8c0d2c96a_13980_40fbe0ec9c8e7474c5eba9551e95a797.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender_hu834d87ba914778413fda02e8c0d2c96a_13980_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender_hu834d87ba914778413fda02e8c0d2c96a_13980_40dbfda5bc30f47578f1087796953bee.webp"
width="226"
height="367"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Oberfläche von OpenRefine mit den 16 Bundesländern.
&lt;/figcaption>&lt;/figure>
&lt;p>Bob unterstützt Alice, indem er für die 16 Bundesländer das &amp;ldquo;Motto&amp;rdquo; recherchiert, er kann jedoch nicht für alle Bundesländer ein Motto finden und liefert den in Abbildung 4 gezeigten Datensatz zurück. &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-oberfläche-von-openrefine-mit-dem-motto-einiger-bundesländer">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Oberfläche von OpenRefine mit dem Motto einiger Bundesländer." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-motto_hue850d04bcf76bdb2f02a1168cb267115_9708_e3618f764baaa0d2c91b126a4d9aefef.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-motto_hue850d04bcf76bdb2f02a1168cb267115_9708_d3434bad2b7cf904e687d49ae311e4d2.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-motto_hue850d04bcf76bdb2f02a1168cb267115_9708_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-motto_hue850d04bcf76bdb2f02a1168cb267115_9708_e3618f764baaa0d2c91b126a4d9aefef.webp"
width="372"
height="174"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Oberfläche von OpenRefine mit dem Motto einiger Bundesländer.
&lt;/figcaption>&lt;/figure>
&lt;p>Charly hat die Aufgabe die Hauptstädte der einzelnen Bundesländer zu recherchieren, und liefert den in Abbildung 5 gezeigten Datensatz zurück. Dabei wurden jedoch die Namen der Bundesländer teilweise geändert, also zum Beispiel der Begriff &amp;ldquo;Freistaat&amp;rdquo; aus dem Namen wegoptimiert.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-oberfläche-von-openrefine-mit-den-hauptstädten-der-16-bundesländer">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Oberfläche von OpenRefine mit den Hauptstädten der 16 Bundesländer." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-hauptstadt_hudb6941757d764e7bc3df4946962e3922_15914_937e0ee52a239fc231180e731f64bfde.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-hauptstadt_hudb6941757d764e7bc3df4946962e3922_15914_5ded926aea1e6c28aa156d981867df94.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-hauptstadt_hudb6941757d764e7bc3df4946962e3922_15914_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-hauptstadt_hudb6941757d764e7bc3df4946962e3922_15914_937e0ee52a239fc231180e731f64bfde.webp"
width="297"
height="373"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Oberfläche von OpenRefine mit den Hauptstädten der 16 Bundesländer.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="datensätze-herunterladen">Datensätze herunterladen&lt;/h3>
&lt;p>Die drei beschriebenen Datensätze können hier heruntergeladen werden, um die vorgestellten Methoden zum Zusammenführen von Daten beim gemeinsamen Arbeiten in OpenRefine selbst auszuprobieren&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen drei Dateien (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/bundeslaender/bundeslaender.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Bundesländer als CSV&lt;/a>
&lt;blockquote>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/bundeslaender/bundeslaender-motto.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Bundesländer Motto als CSV&lt;/a>
&lt;blockquote>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/bundeslaender/bundeslaender-hauptstadt.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Bundesländer Hauptstädte als CSV&lt;/a>
&lt;h3 id="id-spalte-erstellen">ID Spalte erstellen&lt;/h3>
&lt;p>Wir werden die Daten auf drei Arten abgleichen:&lt;/p>
&lt;ol>
&lt;li>Via einer dedizierten ID-Spalte&lt;/li>
&lt;li>Mit einer improvisierten ID-Spalte (Name des Bundeslandes)&lt;/li>
&lt;li>Via Reconciling&lt;/li>
&lt;/ol>
&lt;p>Idealerweise haben alle Datensätze eine einheitliche ID-Spalte zum Abgleichen.
Diese lässt sich in OpenRefine über
&amp;ldquo;Spaltenmenü&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
mit dem folgenden GREL Ausdruck anlegen:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">index&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wie in Abbildung 6 gezeigt, wird so eine ID-Spalte erzeugt, deren Nummerierung analog zur Nummerierung der Zeilen in OpenRefine verläuft.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-spalten-hinzufügen-dialogs-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Spalten hinzufügen Dialogs in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-add-id-col_hucd48aca33617d55cebd18e34c8369c9e_21645_259a34aa11dacb6cd88d12217fda7b0c.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-add-id-col_hucd48aca33617d55cebd18e34c8369c9e_21645_b9e3e4c99d43a2fa57a52ad9239a711c.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-add-id-col_hucd48aca33617d55cebd18e34c8369c9e_21645_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-add-id-col_hucd48aca33617d55cebd18e34c8369c9e_21645_259a34aa11dacb6cd88d12217fda7b0c.webp"
width="721"
height="530"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Spalten hinzufügen Dialogs in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Alternativ lassen sich manchmal auch ID-Spalten improvisieren, indem zum Beispiel bei Personen die Namen und Vornamen in eine ID-Spalte übernommen werden.&lt;/p>
&lt;h3 id="zusammenführen-mit-cross">Zusammenführen mit cross()&lt;/h3>
&lt;p>Alice hat von Bob und Charly zwei CSV-Dateien bekommen, die sie in ihr OpenRefine-Projekt übernehmen möchte.
Eine Möglichkeit, das innerhalb von OpenRefine zu erledigen, ist die Funktion
&lt;a href="https://docs.openrefine.org/manual/grelfunctions#crosscell-s-projectname-optional-s-columnname-optional" target="_blank" rel="noopener">cross()&lt;/a>.&lt;/p>
&lt;p>Im OpenRefine-Wiki gibt es einige
&lt;a href="https://github.com/OpenRefine/OpenRefine/wiki/Recipes#combining-datasets" target="_blank" rel="noopener">Beispiele zur Anwendung von cross()&lt;/a>.
Außerdem gibt es eine
&lt;a href="https://www.bits.vib.be/index.php/software-overview/openrefine" target="_blank" rel="noopener">OpenRefine-Erweiterung für cross()&lt;/a>
um die Funktion über Dialoge in der Oberfläche von OpenRefine zu verwenden.&lt;/p>
&lt;p>Wir verwenden die Funktion &lt;code>cross()&lt;/code> ohne Erweiterung. Dafür erstellen wir für die drei Datensätze jeweils ein Projekt.&lt;/p>
&lt;ol>
&lt;li>Projekt &amp;ldquo;Bundesländer&amp;rdquo; aus &lt;code>bundeslaender.csv&lt;/code>&lt;/li>
&lt;li>Projekt &amp;ldquo;Bundesländer Motto&amp;rdquo; aus &lt;code>bundeslaender-motto.csv&lt;/code>&lt;/li>
&lt;li>Projekt &amp;ldquo;Bundesländer Hauptstadt&amp;rdquo; aus &lt;code>bundeslaender-hauptstadt.csv&lt;/code>&lt;/li>
&lt;/ol>
&lt;div class="alert alert-info">
&lt;div>
Wir verwenden absichtlich Umlaute und Leerzeichen im Projektnamen, um zu testen, ob OpenRefine beim Auflösen mit &lt;code>cross()&lt;/code> damit klarkommt!
&lt;/div>
&lt;/div>
&lt;h4 id="zusammenführen-via-id">Zusammenführen via ID&lt;/h4>
&lt;p>Idealerweise haben wir eine eindeutige ID-Spalte, um die Projekte miteinander abzugleichen.
Mit &lt;code>cross()&lt;/code> können wir über die ID-Spalte Daten aus einem anderen OpenRefine-Projekt nachladen.
Das funktioniert aber nur, wenn die IDs eindeutig sind.&lt;/p>
&lt;h5 id="nachladen-des-mottos">Nachladen des Mottos&lt;/h5>
&lt;p>Zum Nachladen des Mottos der Bundesländer gehen wir im &amp;ldquo;Bundesländer&amp;rdquo;-Projekt über das Spaltenmenü
&amp;ldquo;ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">cell&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cross&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Bundesländer Motto&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;ID&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Mottotext&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Dabei ist &amp;ldquo;Bundesländer Motto&amp;rdquo; der Name des Projektes aus dem wir die Daten holen wollen,
und &amp;ldquo;ID&amp;rdquo; die ID-Spalte im Projekt &amp;ldquo;Bundesländer Motto&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-spalten-hinzufügen-dialogs-mit-cross-für-den-mottotext-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Spalten hinzufügen Dialogs mit cross() für den Mottotext in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-motto-1_hu8d6c0de36e7c11eb9e61089c401f8c9e_20478_0d2a60105870bc4d5e6d1f15a6ecd3ff.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-motto-1_hu8d6c0de36e7c11eb9e61089c401f8c9e_20478_ee94f02329049b7f118eb1ad7acd41ed.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-motto-1_hu8d6c0de36e7c11eb9e61089c401f8c9e_20478_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-motto-1_hu8d6c0de36e7c11eb9e61089c401f8c9e_20478_0d2a60105870bc4d5e6d1f15a6ecd3ff.webp"
width="758"
height="537"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Spalten hinzufügen Dialogs mit cross() für den Mottotext in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Wie in Abbildung 7 gezeigt, werden die Daten (also der Mottotext) aus dem anderen Projekt nachgeladen.
Es haben nicht alle Bundesländer einen Mottotext hinterlegt, was den Abgleich nicht weiter stört.&lt;/p>
&lt;h5 id="nachladen-der-hauptstadt">Nachladen der Hauptstadt&lt;/h5>
&lt;p>Zum Nachladen der Hauptstadt der Bundesländer gehen wir im &amp;ldquo;Bundesländer&amp;rdquo;-Projekt über das Spaltenmenü
&amp;ldquo;ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">cell&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cross&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Bundesländer Hauptstadt&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;ID&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Hauptstadt&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Dabei ist &amp;ldquo;Bundesländer Hauptstadt&amp;rdquo; der Name des Projektes aus dem wir die Daten holen wollen,
und &amp;ldquo;ID&amp;rdquo; die ID-Spalte im Projekt &amp;ldquo;Bundesländer Hauptstadt&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-spalten-hinzufügen-dialogs-mit-cross-für-die-hauptstadt-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Spalten hinzufügen Dialogs mit cross() für die Hauptstadt in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-hauptstadt-1_hu7b7640fd7f81d9ef7172d608638c0551_21900_60af84c29669edd40e4bd0e8a97c0b0c.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-hauptstadt-1_hu7b7640fd7f81d9ef7172d608638c0551_21900_02cea76db379ba61cec116047373dad4.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-hauptstadt-1_hu7b7640fd7f81d9ef7172d608638c0551_21900_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-hauptstadt-1_hu7b7640fd7f81d9ef7172d608638c0551_21900_60af84c29669edd40e4bd0e8a97c0b0c.webp"
width="760"
height="537"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Spalten hinzufügen Dialogs mit cross() für die Hauptstadt in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Wie in Abbildung 8 gezeigt, werden die Daten (hier die Hauptstadt) aus dem anderen Projekt nachgeladen.
Es haben alle Bundesländer eine Hauptstadt, so dass der Abgleich hier für jeden Eintrag ein Ergebnis produziert.&lt;/p>
&lt;p>Außerdem ist zu erwähnen, dass sich OpenRefine hier auch nicht daran stört, dass die ID-Spalte bei uns im Projekt &amp;ldquo;Bundesländer&amp;rdquo; als Zahl, im Projekt &amp;ldquo;Bundesländer Motto&amp;rdquo; jedoch als Typ Text gespeichert ist.&lt;/p>
&lt;h4 id="zusammenführen-via-werte">Zusammenführen via Werte&lt;/h4>
&lt;p>Es ist nicht immer eine eindeutige ID-Spalte vorhanden. Das kommt zum Beispiel vor, wenn die Daten aus verschiedenen Projekten stammen.
Man kann auch ID-Spalten improvisieren, was aber nicht immer zum gewünschten Ergebnis führt.
Wir werden den Abgleich mit &lt;code>cross()&lt;/code> diesmal über die Spalte &amp;ldquo;Bundesland&amp;rdquo; durchführen.&lt;/p>
&lt;h5 id="nachladen-des-mottos-1">Nachladen des Mottos&lt;/h5>
&lt;p>Zum Nachladen des Mottos der Bundesländer gehen wir im &amp;ldquo;Bundesländer&amp;rdquo;-Projekt diesmal über das Spaltenmenü
&amp;ldquo;&lt;strong>Bundesland&lt;/strong>&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">cell&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cross&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Bundesländer Motto&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Bundesland&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Mottotext&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wie in Abbildung 9 zu sehen ist, hat der Abgleich zwischen diesen beiden Projekten kein Problem, da die Bundesländer hier einheitlich geschrieben sind.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-spalten-hinzufügen-dialogs-mit-cross-für-den-mottotext-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Spalten hinzufügen Dialogs mit cross() für den Mottotext in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-motto-2_hu6697b78a45b788c719d01c8a114442f9_24083_d0669a6f0087e5eea3f45d6c37792cd2.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-motto-2_hu6697b78a45b788c719d01c8a114442f9_24083_5f781075b76ac04fe415c7507939cead.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-motto-2_hu6697b78a45b788c719d01c8a114442f9_24083_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-motto-2_hu6697b78a45b788c719d01c8a114442f9_24083_d0669a6f0087e5eea3f45d6c37792cd2.webp"
width="760"
height="505"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Spalten hinzufügen Dialogs mit cross() für den Mottotext in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h5 id="nachladen-der-hauptstadt-1">Nachladen der Hauptstadt&lt;/h5>
&lt;p>Zum Nachladen der Hauptstädte der Bundesländer gehen wir im &amp;ldquo;Bundesländer&amp;rdquo;-Projekt diesmal über das Spaltenmenü
&amp;ldquo;&lt;strong>Bundesland&lt;/strong>&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">cell&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cross&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Bundesländer Hauptstadt&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Bundesland&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Hauptstadt&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wie in Abbildung 10 zu sehen ist, hat der Abgleich hier Probleme, da die Bundesländer teilweise unterschiedlich geschrieben sind.
Es fehlen Ergänzungen wie &amp;ldquo;Freistaat&amp;rdquo;. Daher können die Daten für diese Bundesländer nicht nachgeladen werden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-spalten-hinzufügen-dialogs-mit-cross-für-die-hauptstadt-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Spalten hinzufügen Dialogs mit cross() für die Hauptstadt in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-hauptstadt-2_hu4c75d7fba194ae1d4237304cd6172606_24268_a132f64f5f87419fa9c7732f38156bd3.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-hauptstadt-2_hu4c75d7fba194ae1d4237304cd6172606_24268_f7b3d12e0daab7746eb26507b37ab9d0.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-hauptstadt-2_hu4c75d7fba194ae1d4237304cd6172606_24268_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-hauptstadt-2_hu4c75d7fba194ae1d4237304cd6172606_24268_a132f64f5f87419fa9c7732f38156bd3.webp"
width="760"
height="473"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Spalten hinzufügen Dialogs mit cross() für die Hauptstadt in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h4 id="ergebnis">Ergebnis&lt;/h4>
&lt;figure id="figure-bildschirmfoto-von-openrefine-mit-den-bundesländern-und-den-zusätzlichen-spalten-aus-anderen-projekten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine mit den Bundesländern und den zusätzlichen Spalten aus anderen Projekten." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-2_hu80e7646e9d78f4fe605d75de5ca9f324_25607_e877a2011489f5239b704e1e440398a0.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-2_hu80e7646e9d78f4fe605d75de5ca9f324_25607_4d9aabd79641cebb0a830ebcd68f03dc.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-2_hu80e7646e9d78f4fe605d75de5ca9f324_25607_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-2_hu80e7646e9d78f4fe605d75de5ca9f324_25607_e877a2011489f5239b704e1e440398a0.webp"
width="760"
height="363"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine mit den Bundesländern und den zusätzlichen Spalten aus anderen Projekten.
&lt;/figcaption>&lt;/figure>
&lt;p>Der Abgleich mit &lt;code>cross()&lt;/code> innerhalb von OpenRefine funktioniert recht einfach, solange es eine Spalte mit eindeutigen Werten gibt.
Der Abgleich stört sich auch nicht an Sonderzeichen, Leerzeichen oder fehlenden Werten.&lt;/p>
&lt;p>Problematisch wird es, wenn die Werte der Spalten, die abgeglichen werden, nicht komplett übereinstimmen.
Diese sind in Abbildung 11 farblich hervorgehoben. In solchen Fällen empfiehlt sich das im nächsten Abschnitt besprochene lokale Reconciling.&lt;/p>
&lt;h3 id="zusammenführen-mit-lokalem-reconciling">Zusammenführen mit lokalem Reconciling&lt;/h3>
&lt;p>Wir hatten in
&lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-09-fuenf-dinge-die-wir-an-openrefine-moegen/">Fünf Dinge, die wir an OpenRefine mögen&lt;/a>
schon die Architektur von OpenRefine gelobt, da diese so gestaltet ist, dass OpenRefine auch mit anderen APIs kommunizieren kann.
Besonders unterstützt ist dabei das &lt;a href="https://reconciliation-api.github.io/specs/latest/" target="_blank" rel="noopener">Reconciliation Service API Protokoll&lt;/a>. Damit können Daten in einem OpenRefine-Projekt nicht nur gegen &lt;a href="https://docs.openrefine.org/manual/wikibase/overview" target="_blank" rel="noopener">Wikidata&lt;/a> oder die &lt;a href="https://lobid.org/gnd/reconcile" target="_blank" rel="noopener">GND&lt;/a> abgeglichen werden, sondern mit Werkzeugen wie &lt;a href="https://github.com/gitonthescene/csv-reconcile" target="_blank" rel="noopener">csv-reconcile&lt;/a> auch mit lokalen CSV-Dateien.&lt;/p>
&lt;div class="mermaid">---
title: OpenRefine Setup
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph server[fas:fa-server Server]
server_or[fas:fa-gem OpenRefine]
server_api[fas:fa-code Reconciliation Service API]
end
subgraph laptop[fas:fa-laptop Laptop]
browser[far:fa-window-maximize Browser]
laptop_or[fas:fa-gem OpenRefine]
laptop_api[fas:fa-code Reconciliation Service API]
end
browser -.-> laptop_or &amp; server_or
laptop_or -.-> laptop_api &amp; server_api
server_or -.-> server_api
&lt;/div>
&lt;p>Für die Verwendung von csv-reconcile benötigt man &lt;a href="https://www.python.org/downloads/" target="_blank" rel="noopener">Python&lt;/a> auf seinem System.
Ist Python vorhanden, dann kann csv-reconcile einfach via Shell (PowerShell, Git Bash, &amp;hellip;) installiert werden.
Wir erstellen dafür erst eine virtuelle Umgebung in unserem Arbeitsordner, um csv-reconcile ausschließlich dort zu installieren.&lt;/p>
&lt;p>Der Arbeitsordner ist der Ordner, in dem wir unsere CSV-Dateien liegen haben, mit denen wir hier arbeiten.&lt;/p>
&lt;p>Die virtuelle Umgebung für Python ermöglicht es uns, Python Bibliotheken nur für dieses Projekt zu installieren,
so dass sie nicht mit Bibliotheken oder Python Versionen in anderen Projekten in Konflikt kommen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">python&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="n">venv&lt;/span> &lt;span class="n">venv&lt;/span> &lt;span class="c"># virtuelle Umgebung erstellen&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="p">.\&lt;/span>&lt;span class="n">venv&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">Scripts&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">activate&lt;/span> &lt;span class="c"># virtuelle Umgebung aktivieren (Windows!)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">venv&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">pip&lt;/span> &lt;span class="n">install&lt;/span> &lt;span class="nb">csv-reconcile&lt;/span> &lt;span class="c"># csv-reconcile in virtuelle Umgebung installieren&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Da csv-reconcile in Version 0.3.0 den Vorschaudienst optional anbietet und keine automatische Erkennung von Encoding und Trennzeichen in CSV-Dateien hat, erstellen wir in unserem Arbeitsordner zusätzlich eine Datei &lt;code>config.py&lt;/code> mit dem folgenden Inhalt.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">CSVKWARGS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s1">&amp;#39;delimiter&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;,&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;quotechar&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;&amp;#34;&amp;#39;&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CSVENCODING&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;UTF-8&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">MANIFEST&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;preview&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://localhost:5000/preview/{{id}}&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;width&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">400&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;height&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">300&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anschließend können wir mit aktivierter virtueller Umgebung in unserem Arbeitsordner den lokalen Reconciling Service für die &amp;ldquo;Bundesländer Motto&amp;rdquo; CSV-Datei initiieren und starten.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">venv&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">&amp;gt;&lt;/span> &lt;span class="nb">csv-reconcile&lt;/span> &lt;span class="n">init&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-config&lt;/span> &lt;span class="n">config&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">py&lt;/span> &lt;span class="nb">bundeslaender-motto&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">csv&lt;/span> &lt;span class="n">ID&lt;/span> &lt;span class="n">Bundesland&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">venv&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">&amp;gt;&lt;/span> &lt;span class="nb">csv-reconcile&lt;/span> &lt;span class="n">serve&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wenn wir mit dieser Datei fertig sind, können wir den lokalen Reconciling Service für die &amp;ldquo;Bundesländer Hauptstadt&amp;rdquo; CSV-Datei initiieren und starten.&lt;/p>
&lt;p>Ob die virtuelle Umgebung aktiv ist, sieht man an der Ergänzung &lt;code>(venv)&lt;/code> in der Shell.
Ansonnsten lässt sie sich mit &lt;code>.\venv\Scripts\activate&lt;/code> wieder aktivieren.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">venv&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">&amp;gt;&lt;/span> &lt;span class="nb">csv-reconcile&lt;/span> &lt;span class="n">init&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-config&lt;/span> &lt;span class="n">config&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">py&lt;/span> &lt;span class="nb">bundeslaender-hauptstadt&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">csv&lt;/span> &lt;span class="n">ID&lt;/span> &lt;span class="n">Bundesland&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">venv&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">&amp;gt;&lt;/span> &lt;span class="nb">csv-reconcile&lt;/span> &lt;span class="n">serve&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-note">
&lt;div>
Wir könnten die beiden lokalen Reconciling Services auch parallel laufen lassen, indem wir sie in unterschiedliche Ordner schieben und wie unter
&lt;a href="https://github.com/gitonthescene/csv-reconcile#common-configuration" target="_blank" rel="noopener">csv-reconcile: Common configuration&lt;/a>
beschrieben über die Variable &lt;code>SERVER_NAME&lt;/code> in der &lt;code>config.py&lt;/code> jeweils einen anderen Port setzen.
&lt;/div>
&lt;/div>
&lt;p>In OpenRefine fügen wir den lokalen Reconciliation Service hinzu, indem wir in einem Projekt über ein beliebiges
&amp;ldquo;Spaltenmenü&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start reconciling&amp;rdquo; aufrufen und dort via &amp;ldquo;Add Standard Service&amp;hellip;&amp;rdquo;
die Adresse &lt;code>http://localhost:5000/reconcile&lt;/code> eingeben.
Der Port 5000 muss entsprechend angepasst werden, wenn er in der &lt;code>config.py&lt;/code> geändert wurde.&lt;/p>
&lt;p>Siehe auch die &lt;a href="https://docs.openrefine.org/manual/reconciling#getting-started" target="_blank" rel="noopener">OpenRefine-Dokumentation zu Reconciling: Getting started&lt;/a>.&lt;/p>
&lt;h4 id="zusammenführen-via-id-1">Zusammenführen via ID&lt;/h4>
&lt;p>Idealerweise haben wir eine eindeutige ID-Spalte, um die Projekte miteinander abzugleichen.
Dann ist der lokale Reconciliation Service fast schon etwas zu mächtig,
und wird von uns eher eingesetzt, wenn wir es vermeiden wollen,
zu viele OpenRefine-Projekte zu jonglieren.&lt;/p>
&lt;h5 id="nachladen-des-mottos-2">Nachladen des Mottos&lt;/h5>
&lt;p>Wir haben den lokalen Reconciling Service für das &amp;ldquo;Bundesländer Motto&amp;rdquo;-Projekt, wie im oberen Abschnitt beschrieben, am laufen.&lt;/p>
&lt;p>Zum Nachladen des Mottos der Bundesländer gehen wir im &amp;ldquo;Bundesländer&amp;rdquo;-Projekt über das Spaltenmenü
&amp;ldquo;ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Use values as identifiers&amp;rdquo;
und wählen unseren CSV Reconciliation Service aus.&lt;/p>
&lt;p>Die IDs werden nun alle zu Links. Wie im Maus-Hover in Abbildung 12 sehen wir, dass nicht alle IDs aufgelöst werden, sondern manchmal eine &amp;ldquo;Nicht gefunden&amp;rdquo; Meldung angezeigt wird.
Zur Erinnerung: es gibt nicht für alle Bundesländer ein Motto in unseren Daten!&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-maus-hover-not-found-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Maus-Hover &amp;#39;Not Found&amp;#39; in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-1_hu39c718e5b27e6e52ff7ac1c81fff5d86_15469_f8f093dccbd7b2a8850142009bb6489e.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-1_hu39c718e5b27e6e52ff7ac1c81fff5d86_15469_b3a651b1ac2fd52b17ddff702eb9bddc.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-1_hu39c718e5b27e6e52ff7ac1c81fff5d86_15469_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-1_hu39c718e5b27e6e52ff7ac1c81fff5d86_15469_f8f093dccbd7b2a8850142009bb6489e.webp"
width="454"
height="394"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Maus-Hover &amp;lsquo;Not Found&amp;rsquo; in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Den Mottotext können wir über
&amp;ldquo;ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add columns from reconciled values&amp;hellip;&amp;rdquo;
nachladen.
Wie in Abbildung 13 zu sehen ist, kann der Dienst auch mit nicht auflösbaren IDs umgehen und ignoriert diese einfach.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-reconciliation-dialogs-mit-dem-mottotext-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Reconciliation Dialogs mit dem Mottotext in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-2_hu8fbb82745c3be04cdb0e0c8fcbb4f230_18678_dd0eb9816e0f13c6bc8e21f81c61c1aa.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-2_hu8fbb82745c3be04cdb0e0c8fcbb4f230_18678_129cf3167d621935f4e2c6611f91fbf3.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-2_hu8fbb82745c3be04cdb0e0c8fcbb4f230_18678_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-2_hu8fbb82745c3be04cdb0e0c8fcbb4f230_18678_dd0eb9816e0f13c6bc8e21f81c61c1aa.webp"
width="760"
height="561"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Reconciliation Dialogs mit dem Mottotext in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h5 id="nachladen-der-hauptstadt-2">Nachladen der Hauptstadt&lt;/h5>
&lt;p>Wir haben den lokalen Reconciling Service für das &amp;ldquo;Bundesländer Hauptstadt&amp;rdquo;-Projekt, wie im oberen Abschnitt beschrieben, am laufen.&lt;/p>
&lt;p>Zum Nachladen der Hauptstädte der Bundesländer gehen wir wieder im &amp;ldquo;Bundesländer&amp;rdquo;-Projekt über das Spaltenmenü
&amp;ldquo;ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Use values as identifiers&amp;rdquo;
und wählen unseren CSV Reconciliation Service aus.&lt;/p>
&lt;p>Die IDs werden nun alle wieder zu Links. Bei diesem Abgleich können alle IDs aufgelöst werden und wir sehen wie in Abbildung 14 überall Maus-Hover mit den entsprechenden Werten des gematchten Eintrags in der CSV-Datei.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-maus-hover-mit-csv-werten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Maus-Hover mit CSV Werten in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-hauptstadt-1_hu179a3c97bcee3c78ae52c69b1b89ffc0_9947_4b3ea587ba4655d167225c20f6e3dbd5.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-hauptstadt-1_hu179a3c97bcee3c78ae52c69b1b89ffc0_9947_2af901b6da235bf730c1790b1d781bc9.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-hauptstadt-1_hu179a3c97bcee3c78ae52c69b1b89ffc0_9947_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-hauptstadt-1_hu179a3c97bcee3c78ae52c69b1b89ffc0_9947_4b3ea587ba4655d167225c20f6e3dbd5.webp"
width="452"
height="360"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Maus-Hover mit CSV Werten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h4 id="zusammenführen-via-werte-1">Zusammenführen via Werte&lt;/h4>
&lt;p>Es ist nicht immer eine eindeutige ID-Spalte vorhanden.
In so einem Fall spielt der lokale Reconciliation Service seine Stärke aus,
da wir mit ihm auch &amp;ldquo;ungenaue&amp;rdquo; Werte finden und matchen können.&lt;/p>
&lt;h5 id="nachladen-des-mottos-3">Nachladen des Mottos&lt;/h5>
&lt;p>Wir haben den lokalen Reconciling Service für das &amp;ldquo;Bundesländer Motto&amp;rdquo;-Projekt, wie im oberen Abschnitt beschrieben, am laufen.&lt;/p>
&lt;p>Zum Nachladen der Mottos der Bundesländer über die Wertespalte gehen wir zu
&amp;ldquo;Bundesland&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start reconciling&amp;rdquo;
und wählen den &amp;ldquo;CSV Reconciling Service&amp;rdquo; aus.&lt;/p>
&lt;p>Wie in Abbildung 15 markiert, ist das automatische Matching etwas zu großzügig, so dass Bundesländer gematcht werden, weil sie zum Beispiel beide den Begriff &amp;ldquo;Freistaat&amp;rdquo; im Namen haben. Das kann manuell und bei größeren Datenmengen mit der Unterstützung von Facets auf den Konfidenzwerten (Wert wie gut das Matching passt) nachgearbeitet werden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-ergebnis-des-automatischen-reconciling-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Ergebnis des automatischen Reconciling in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-3_hufaaadccb8b483f740a96e0e3e4446f9e_40846_ad0dc4da1e4daaaf27e3c0cfe4bc5541.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-3_hufaaadccb8b483f740a96e0e3e4446f9e_40846_726a2272f08749e7f5c6207a6c9f6f34.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-3_hufaaadccb8b483f740a96e0e3e4446f9e_40846_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-3_hufaaadccb8b483f740a96e0e3e4446f9e_40846_ad0dc4da1e4daaaf27e3c0cfe4bc5541.webp"
width="527"
height="640"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Ergebnis des automatischen Reconciling in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Den Mottotext können wir dann wieder über
&amp;ldquo;Bundesland&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add columns from reconciled values&amp;hellip;&amp;rdquo;
nachladen.
Wie in Abbildung 16 zu sehen ist, kann der Dienst auch in diesem Fall mit nicht auflösbaren IDs umgehen und ignoriert diese einfach.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-reconciliation-dialogs-mit-dem-mottotext-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Reconciliation Dialogs mit dem Mottotext in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-4_hua1c00797d48b58235eee6dfe3065f9bd_25066_bda04180895739bc24eb0236691f4c66.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-4_hua1c00797d48b58235eee6dfe3065f9bd_25066_b8e80e344cc0bd1f5426a6a31ce7ef3c.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-4_hua1c00797d48b58235eee6dfe3065f9bd_25066_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-4_hua1c00797d48b58235eee6dfe3065f9bd_25066_bda04180895739bc24eb0236691f4c66.webp"
width="760"
height="555"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Reconciliation Dialogs mit dem Mottotext in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h5 id="nachladen-der-hauptstadt-3">Nachladen der Hauptstadt&lt;/h5>
&lt;p>Wir haben den lokalen Reconciling Service für das &amp;ldquo;Bundesländer Hauptstadt&amp;rdquo;-Projekt, wie im oberen Abschnitt beschrieben, am laufen.&lt;/p>
&lt;p>Zum Nachladen der Hauptstädte der Bundesländer über die Wertespalte gehen wir zu
&amp;ldquo;Bundesland&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start reconciling&amp;rdquo;
und wählen den &amp;ldquo;CSV Reconciliation Service&amp;rdquo; aus.&lt;/p>
&lt;p>Da wir in diesem Datensatz passende Einträge für alle Bundesländer haben, funktioniert das Matching, wie in Abbildung 17 zu sehen ist, recht gut, obwohl die Bundesländer teilweise anders geschrieben sind.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-oberfläche-von-openrefine-mit-den-reconciliation-ergebnissen-für-die-bundesländer">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Oberfläche von OpenRefine mit den Reconciliation Ergebnissen für die Bundesländer." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-hauptstadt-2_hu4c933afed31667bc96f7b0214c9301a9_28800_fc3c3332f7db8636609b779c541fe682.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-hauptstadt-2_hu4c933afed31667bc96f7b0214c9301a9_28800_39b10a95abf5152d45e2c4c10f882a39.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-hauptstadt-2_hu4c933afed31667bc96f7b0214c9301a9_28800_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-hauptstadt-2_hu4c933afed31667bc96f7b0214c9301a9_28800_fc3c3332f7db8636609b779c541fe682.webp"
width="311"
height="608"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Oberfläche von OpenRefine mit den Reconciliation Ergebnissen für die Bundesländer.
&lt;/figcaption>&lt;/figure>
&lt;h4 id="ergebnis-1">Ergebnis&lt;/h4>
&lt;p>Der Abgleich mit dem lokalen Reconciling Service hat initial einen höherne Aufwand,
da sowohl Python auf dem System als auch der CSV Reconciling Service in OpenRefine eingerichtet werden müssen.
Dann ist das Verfahren jedoch deutlich flexibler als das Zusammenführen mit &lt;code>cross()&lt;/code>,
da darüber sowohl ein exaktes ID Matching und Nachladen von Spalten durchgeführt werden kann,
als auch ein so genanntes Fuzzy-Matching, bei dem die Werte in den Spalten nicht exakt übereinstimmen.&lt;/p>
&lt;p>In Abbildung 18 sind nochmal alle nachgeladenen Spalten abgebildet, wobei&lt;/p>
&lt;ol>
&lt;li>via &lt;code>cross()&lt;/code> auf der ID-Spalte&lt;/li>
&lt;li>via &lt;code>cross()&lt;/code> auf der Werte-Spalte (Namen Bundesland)&lt;/li>
&lt;li>via lokalem Reconciling Service auf der ID-Spalte&lt;/li>
&lt;li>via lokalem Reconciling Service auf der Werte-Spalte (Namen Bundesland)&lt;/li>
&lt;/ol>
&lt;p>nachgeladen wurde.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-openrefine-mit-den-bundesländern-und-den-zusätzlichen-spalten-aus-anderen-projekten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine mit den Bundesländern und den zusätzlichen Spalten aus anderen Projekten." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-3_huc3da5552be0ef16b9ee88e54332fa22a_26618_194dc0b3625ba75ea1a731c7431780d2.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-3_huc3da5552be0ef16b9ee88e54332fa22a_26618_ed5d312a4e0a6be6d76c570357b24a80.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-3_huc3da5552be0ef16b9ee88e54332fa22a_26618_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-3_huc3da5552be0ef16b9ee88e54332fa22a_26618_194dc0b3625ba75ea1a731c7431780d2.webp"
width="760"
height="220"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine mit den Bundesländern und den zusätzlichen Spalten aus anderen Projekten.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="ausblick-auf-weitere-methoden">Ausblick auf weitere Methoden&lt;/h2>
&lt;p>Für das Zusammenführen von Datensätzen mit OpenRefine gibt es noch weitere Möglichkeiten, die sich aktuell in der Planung und Entwicklung befinden.&lt;/p>
&lt;p>Zum einen gibt es &lt;a href="%28https://github.com/OpenRefine/OpenRefine/issues/2003%29">Überlegungen&lt;/a>
für Projekte in OpenRefine automatisch einen Reconciliation Service zu erstellen,
so dass analog zu &lt;code>cross()&lt;/code> direkt innerhalb von OpenRefine ein Reconciling gegen andere Projekte durchgeführt werden kann.
Also Reconciling innerhalb von OpenRefine ohne separaten lokalen Reconciling Service.&lt;/p>
&lt;p>Zum anderen gibt es mit &lt;a href="https://datasette.io/" target="_blank" rel="noopener">Datasette&lt;/a>
ein komplettes Ökosystem um &lt;a href="https://datasette.io/tools" target="_blank" rel="noopener">Daten in SQLite einzulesen&lt;/a>
und anschließend via &lt;a href="https://datasette.io/plugins" target="_blank" rel="noopener">unterschiedlicher APIs&lt;/a> zur Verfügung zu stellen.
Es wird gerade auch ein &lt;a href="https://github.com/drkane/datasette-reconcile" target="_blank" rel="noopener">Reconciliation Plugin für Datasette&lt;/a> entwickelt.&lt;/p>
&lt;p>Gibt es in Arbeitsgruppen Datensätze, die intern oder extern veröffentlicht und auch für Reconciliation genutzt werden sollen, dann lohnt sich ein Blick auf dieses Werkzeug.&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>OpenRefine bietet mit seiner Architektur das Potential zukünftig kollaboratives Arbeiten zu ermöglichen.
Bis dahin können wir uns selbst helfen und mit wenig Extraaufwand Aufgaben aufteilen und die Ergebnisse wieder zusammenführen.
Mit der &lt;code>cross()&lt;/code> Funktion können wir direkt Daten aus anderen OpenRefine-Projekten über ID-Spalten übernehmen.
Mit einem lokalem Reconciling Service können wir auch Daten aus unterschiedlichen Projekten verbinden.&lt;/p>
&lt;p>Bisher klappt das beschriebene Vorgehen im FDMLab ganz gut und wir beobachten weiterhin gespannt die Entwicklung sowohl von OpenRefine,
als auch von anderen Werkzeugen wie csv-reconcile und Datasette, die es hervorragend ergänzen.&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Die Mottotexte wurden aus &lt;a href="https://www.wikidata.org/" target="_blank" rel="noopener">Wikidata&lt;/a> geladen und sind daher genauso (un)vollständig, wie die Daten dort.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item></channel></rss>