Suche in Tabellenkalkulationen

Aus LinuxUser 12/2017

Suche in Tabellenkalkulationen

© Genaro Diaz Melendrez, 123RF

Durchgesiebt

Daten in ein Spreadsheet zu tippen, ist einfach – sie dann wiederzufinden, eher nicht. Es sei denn, Sie haben die richtigen Tools zur Hand.

Die Suche in verschiedenen Dateiformaten ist und bleibt ein Dauerbrenner. Wer an den richtigen Stellen sucht, findet aber eine Unmenge an praktischen Werkzeugen für die Kommandozeile. Bei Bedarf lesen Sie nach, wozu diese in der Lage sind ([1],[2],[3],[4],[5]).

Aus dem Benutzen und Experimentieren mit bisher wenig eingesetzten Schaltern und Werkzeugen, die insbesondere in aktualisierten Paketen hinzukamen, ergaben sich neue, spannende Querverbindungen [6]. Im Mittelpunkt dieses Artikels steht die Frage, ob eine bestimmte Zeichenkette in einem digitalen Rechenblatt vorhanden ist, und falls ja, wo genau – quasi ein Grep für die Tabellenkalkulation.

Was wir schon kennen

In der Gnome-Abteilung der Werkzeugkiste schlummert das Kommandozeilen-Tool Ssgrep, eine Abkürzung für “spreadsheet grep”. Die Software gehört zu Gnumeric [7], der schlanken Tabellenkalkulation des Gnome-Projekts.

Entsprechend durchsucht Ssgrep vorrangig Rechenblätter, die Sie vorher mit Gnumeric erzeugt haben. Da aber Gnumeric dasselbe gepackte XML-Format verwendet wie die Tabellenkalkulation Calc von Open/LibreOffice, passt es gleich für alle drei. Experimente mit Dateien aus Microsoft Excel ab 2007 (.xlsx) waren ebenfalls von Erfolg gekrönt.

Ohne zusätzliche Schalter im Aufruf Listing 1 spuckt Ssgrep nur den oder die einzelnen Treffer aus. Das genügt, solange es nur darum geht, zu wissen, ob die Zeichenkette im Rechenblatt auftaucht. Im Beispiel aus Listing 1 sucht die Software in der Datei bestellungen.gnumeric nach der Zeichenkette Hamburg (Abbildung 1).

Abbildung 1: Mit Ssgrep suchen Sie in einem Rechenblatt, im Beispiel eines mit Bestellungen, aus der Tabellenkalkulation Gnumeric nach einer bestimmten Zeichenkette.

Abbildung 1: Mit Ssgrep suchen Sie in einem Rechenblatt, im Beispiel eines mit Bestellungen, aus der Tabellenkalkulation Gnumeric nach einer bestimmten Zeichenkette.

Listing 1

$ ssgrep Hamburg bestellungen.gnumeric
Hamburg

Um die Trefferstelle genauer einzugrenzen, kommen Schalter ins Spiel, die sich am Original-Grep orientieren. Dazu erweitern Sie im Beispiel den Aufruf um die beiden Schalter -H und -n. Ersterer sorgt dafür, dass das Programm zu Beginn jeder Zeile der Ausgabe zusätzlich den Dateinamen der Rechenblattsammlung ausgibt. Das ist nützlich, wenn Sie einen ganzen Stapel an Dateien untersuchen. Mittels -n verrät Ssgrep zusätzlich, in welchem Rechenblatt aus der Datei es fündig wurde. In Listing 2 ist es das Blatt namens Januar, wo sich Hamburg in der zweiten Zelle der ersten Spalte (A2) findet.

Listing 2

$ ssgrep -Hn Hamburg bestellungen.gnumeric
bestellungen.gnumeric:Januar!A2:Hamburg

Aber es geht noch mehr. Das Programm interpretiert das im Aufruf übergebene Muster üblicherweise als regulären Ausdruck [8]. Damit kommen Sie sowohl Tippfehlern auf die Spur als auch ähnlichen Schreibweisen. Listing 3 zeigt das anhand des Musters [Hh]amburg, was nun Treffer unabhängig von der Schreibweise des Anfangsbuchstabens ergibt. Der Schalter -w sorgt zudem dafür, dass nur ganze Worte als Treffer gelten.

Listing 3

$ ssgrep -Hnw "[Hh]amburg" bestellungen.gnumeric
bestellungen.gnumeric:Februar!A2:hamburg
bestellungen.gnumeric:Januar!A2:Hamburg
bestellungen.gnumeric:Januar!A6:hamburg

Möchten Sie die Interpretation auf feste Zeichenketten begrenzen – sprich: dafür sorgen, dass Ssgrep das Muster nicht als regulären Ausdruck begutachtet – ergänzen Sie im Aufruf den Schalter -F. Weitere Möglichkeiten fasst Tabelle “Nützliche Schalter für Ssgrep” zusammen.

Option

Langform

Bedeutung

-c

--count

Treffer zählen

-F

--fixed-strings

Muster als String interpretieren

-i

--ignore-case

Schreibweise ignorieren

-l

--files-with-matches

Dateinamen mit Treffer ausgeben

-L

--files-without-matches

Dateinamen ohne Treffer ausgeben

-n

--print-locus

Position im Rechenblatt ausgeben

-R

--search-results

Formeln auswerten und darin suchen

-v

--invert-match

Ergebnis umkehren

-w

--word-regexp

nur ganze Worte finden

Schweizer Taschenmesser

Im Nebenfach von Ssgrep liegt das Werkzeug Deepgrep [9]. Es ist eine Art Schweizer Taschenmesser und gehört zur Desktop-Suche Strigi [10] aus dem KDE-Projekt (Debian-Paket strigi-utils). Neben diversen komprimierten Formaten und Archiven durchstöbert es Debian- und RPM-Pakete sowie Rechenblätter. Im Test klappte das nur mit Calc-Dateien, nicht aber mit Rechenblättern von Gnumeric – etwas verwunderlich, da beide das gleiche Datenformat verwenden (Listing 4).

Listing 4

$ deepgrep Hamburg bestellungen.gnumeric
$ deepgrep Hamburg bestellungen.ods
bestellungen.ods:Hamburg

Prinzipiell kommt Deepgrep auch mit Excel-Dateien zurecht, aber im Test klappte das nicht so richtig: Als Ergebnis lieferte die Software den kompletten XML-String zurück (Listing 5). Hier müssen die Entwickler noch etwas Arbeit investieren.

Listing 5

$ deepgrep eins data.xlsx
data.xslx/xl/sharedStrings.xml:<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="3" uniqueCount="3"><si><t>eins</t></si><si><t>zwei</t></si><si><t>drei</t></si></sst>

Der Autor verwendet das Programm schon seit 2012. Beim wiederholten Begutachten fielen gewisse Konstanten auf: Die Parameter entsprechen nicht denen von Grep, weder existiert eine Dokumentation noch eine Manpage. Das macht es schwierig, das Programm und seine Entwickler zu loben, obwohl das Werkzeug sehr flink und im Alltag äußerst nützlich ist. Es fasst mehrere einzelne Programme zusammen.

Die Arbeit am Framework Strigi wurde mittlerweile eingestellt, bei KDE kommt es nicht mehr als Desktop-Suche zum Einsatz: Ab KDE 4.3 trat Baloo [11] an seine Stelle. Deswegen gibt es das Paket strigi-utils nach dem Release von Debian “Jessie” nicht mehr im Repository [12], in Debian 9 “Stretch” fiel es weg.

Mit Klick

Arbeiten Sie lieber mit der Maus, sollten Sie einen Blick auf Loook [13] werfen (Abbildung 2). In Python entwickelt, sucht es nach Zeichenketten in Dateien, die Sie in Open/LibreOffice, StarOffice 6.0 oder höher und Microsoft Excel ab der Version 2007 erstellt haben. Mittlerweile von Mechtilde Stehmann gepflegt, zählt das Programm seit Debian 8 “Jessie” zum Debian-Fundus [14].

Abbildung 2: Das Programm Loook kommt mit einer Vielzahl von Office-Formaten zurecht, inklusive Microsoft Excel ab Version&nbsp;2007.

Abbildung 2: Das Programm Loook kommt mit einer Vielzahl von Office-Formaten zurecht, inklusive Microsoft Excel ab Version 2007.

Trifft keines der genannten Programme Ihren Geschmack, bleibt Ihnen noch ein Zwischenschritt über das Umwandeln ins CSV-Format. Je nach Situation ist das von Nutzen, etwa beim Weiterverarbeiten in einem Shell-Skript mittels Awk, Sed, Cut oder Tr. LibreOffice etwa bewegen Sie mit kleinen Schaltern sanft dazu, den Export vorzunehmen, ohne eine grafische Ausgabe zu produzieren (Listing 6).

Listing 6

$ libreoffice --headless --convert-to csv bestellungen.ods
convert bestellungen.ods -> bestellungen.csv using Text - txt - csv (StarCalc)
$ cat bestellungen.csv
Ort,Nummer,Inhalt
Hamburg,20170001,4 Wlan-APs UBNT NanoStation M5
Bremen,20170002,2 Wlan-APs UBNT NanoStation M5
Trier,20170003,1 Router MikroTik RB450

Ähnlich funktioniert das mit Ssconvert (“spreadsheet convert”) aus dem Gnumeric-Paket (Listing 7, erste Zeile). Es versteht nicht nur Gnumeric-Daten, sondern auch solche aus Open/LibreOffice, Sc, Paradox-Datenbanken und von Applixware, Quattro Pro, Lotus 1-2-3 sowie Multiplan. Das ermöglicht es, Daten aus alten Beständen und Backups auszulesen.

Listing 7

$ ssconvert bestellungen.gnumeric bestellungen.csv
$ cat bestellungen.csv
Ort,Nummer,Inhalt
Hamburg,20170001,"4 Wlan-APs UBNT NanoStation M5"
Bremen,20170002,"2 Wlan-APs UBNT NanoStation M5"
Trier,20170003,"1 Router MikroTik RB450"
$ ssconvert -O 'quoting-mode=never' bestellungen.gnumeric bestellungen.txt
$ cat bestellungen.txt
Ort,Nummer,Inhalt
Hamburg,20170001,4 Wlan-APs UBNT NanoStation M5
Bremen,20170002,2 Wlan-APs UBNT NanoStation M5
Trier,20170003,1 Router MikroTik RB450
$ ssconvert -O 'separator=;' bestellungen.gnumeric bestellungen.txt
$ cat bestellungen.txt Ort;Nummer;Inhalt
Hamburg;20170001;"4 Wlan-APs UBNT NanoStation M5"
Bremen;20170002;"2 Wlan-APs UBNT NanoStation M5"
Trier;20170003;"1 Router MikroTik RB450"

Anders als LibreOffice (Listing 6) packt die Software um Zeichenketten mit Leerzeichen noch Hochkommas. Wenn Sie das nicht mögen, schalten Sie das mit dem speziellen Parameter -O 'quoting-mode=never' beim Export ab (Listing 7, Zeile 7). Dabei wertet Ssconvert die Erweiterung der Ausgabedatei aus: Steht da .csv, grummelt es und ignoriert die Option für den Export. Nur bei einer Ausgabedatei mit der Endung .txt läuft alles glatt durch [15]. Ähnlich gehen Sie vor, wenn Sie ein alternatives Trennzeichen in der CSV-Datei verwenden möchten: Die Option für ein Semikolon lautet -O 'separator=; (Listing 7, Zeile 13).

Ähnliche Werkzeuge sind etwa Xlsx2csv [16], Csvkit [17] und Agate [18]. Alle drei setzen auf Python und stehen als DEB-Pakete für Debian und Ubuntu bereit.

Fazit

Mittels Ssgrep, Deepgrep und Loook durchforsten Sie die Rechenblätter fast jeder Tabellenkalkulation. Alle drei Werkzeuge binden Sie problemlos in ein Skript ein, was eine Suche ohne grafische Oberfläche ermöglicht, etwa auf einem Webserver. Für das Umwandeln nach CSV steht Ssconvert bereit und nimmt Ihnen die knifflige Arbeit ab. 

Danksagung

Der Autor bedankt sich bei Axel Beckert, Mechtilde Stehmann und Gerold Rupprecht für deren Kritik und Anregungen im Vorfeld des Artikels.

Infos

  1. “Grep Everything”: http://noone.org/blog/English/Computer/Shell/grep%20everything.futile

  2. Suche in Archiven: Axel Beckert, Frank Hofmann, “Nadel im Datenhaufen”, LU 04/2012, S. 78, https://www.linux-community.de/25403

  3. Suche in Datenformaten, Teil 1: Axel Beckert, Frank Hofmann, “Mit Struktur”, LU 06/2012, S. 82, https://www.linux-community.de/25404

  4. Suche in Datenformaten, Teil 2: Axel Beckert, Frank Hofmann: “Durchgekämmt”, LU 07/2012, S. 84, https://www.linux-community.de/25972

  5. LibreOffice-Dateien durchsuchen: Frank Hofmann, “Flink durchleuchtet”, LU 12/2012, S. 82, https://www.linux-community.de/27276

  6. “Find Files That Contain A Certain Content”: http://www.stackabuse.com/linux-find-files-containing-text/

  7. Gnumeric (Debian-Paket): https://packages.debian.org/stretch/gnumeric

  8. Reguläre Ausdrücke: Frank Hofmann, “Schnipseljagd”, LU 09/2011, S. 84, https://www.linux-community.de/24091

  9. Deepgrep: http://noone.org/blog/English/Computer/Debian/CoolTools/deepgrep.futile

  10. Strigi-utils (Debian-Paket): https://packages.debian.org/jessie/strigi-utils

  11. Baloo, (Debian-Paket): https://packages.debian.org/stretch/baloo

  12. https://bugs.debian.org/835236

  13. Loook: http://mechtilde.de/Loook/

  14. Loook (Debian-Paket) https://packages.debian.org/stretch/loook

  15. Excel-Dateien konvertieren: https://linuxconfig.org/converting-xlsx-excel-format-files-to-csv-on-linux

  16. Xlsx2csv (Debian-Paket): https://packages.debian.org/de/stretch/xlsx2csv

  17. Csvkit: https://github.com/wireservice/csvkit

  18. Agate: https://github.com/wireservice/agate

Der Autor

Frank Hofmann arbeitet von unterwegs aus als Entwickler, Trainer und Autor. Bevorzugte Arbeitsorte sind Berlin, Genf und Kapstadt. Er ist zudem Koautor des Debian-Paketmanagement-Buchs (http://www.dpmb.org).

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 12/2017 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben