Welcome, Guest. Please login or register.
Did you miss your activation email?

Author Topic: [DE] Libreoffice-Calc-Dokument mit Perl auslesen  (Read 6134 times)

Offline orinoco

  • User
  • Posts: 233
  • Bullshit artist
[DE] Libreoffice-Calc-Dokument mit Perl auslesen
« on: 2017/11/11, 05:55:11 »
Hallo,


ich hoffe, dass eine Perl-Frage hier auch reinpasst.


Ich möchte ein Calc-Dokument, das mit einer aktuellen Version von Libreoffice erstellt wurde, mit einem Perl-Skript auslesen und die Daten weiterverarbeiten. Ich verwende dazu das Debian-Paket "libopenoffice-oodoc-perl", welches das Perl-Modul "OpenOffice-OODoc-2.125" installiert. Um das Modul zu verstehen, habe ich einen einfachen Text-Dumper geschrieben. Das klappt auch soweit ganz gut. Allerdings ist mir aufgefallen, das benachbarte Zellen, die den gleichen Inhalt haben, unterschlagen werden, d.h. bei zwei identischen Zellen nebeneinander innerhalb einer Zeile, wird der Wert der rechten Zelle unterschlagen. Bei drei identischen Zellen nebeneinander, liefern die zwei rechten Zellen keinen Wert usw. Die nächste Nachbarzelle zur Rechten, die wieder einen unterschiedlichen Wert hat, nimmt die Position ein.

So sieht die Ausgabe exemplarisch aus:

Code: [Select]
table[0]: rows[28], cols[5]
Nr      Staffel Episode Titel   archiviert
1       Ganz normale Jobs       1       undef   undef
2       1       2       Spuren  1
3       1       3       Nicht über mein Sofa    1
4       1       4       Geschmackssache 1
5       2       1       Über den Wolken 1
6       2       Die Challenge   1       undef
7       2       3       Schottys Kampf  1
8       2       4       Angehörige      1
9       2       5       Auftrag aus dem Jenseits        1
10      3       1       Fleischfresser  1
11      3       2       Schweine        1
12      3       Carpe Diem      1       undef
13      3       4       Ja, ich will    1
14      4       1       Wattolümpiade   1
15      4       2       Der Putzer      1
16      4       3       Damit muss man rechnen  1
17      4       Der Fluch       1       undef
18      4       5       Tauschgeschäfte 1
19      5       1       Bestattungsvorsorge     1
20      5       2       Das freie Wochenende    1
21      5       3       Pfirsichmelba   1
22      5       4       Anbieterwechsel 1
23      5       E.M.M.A. 206    1       undef
24      5       6       Freunde 1
25      6       1       Sind Sie sicher?        1
26      6       2       Özgür   1
27      6       3       Schluss mit lustig      1
--------------------------------------------------------------------------------
table[1]: rows[21], cols[5]
Nr      Staffel Episode Titel   archiviert
1       Das Krokodil-Dilemma    1       undef   undef
2       1       2       Der Hahnenprinz 1
3       1       3       Die schmutzige Straße   1
4       1       4       Die verschluckte Schuld 1
5       1       5       Die Fünf Sinne und der Geist    0
6       1       6       Buridans Esel   1
7       1       7       Wer rasiert den Barbier?        0
8       1       8       Der Haufen      1
9       1       9       Ein Fuchs, ein Kaninchen und ein Kohlkopf       1
10      1       10      Mortons Gabel   1
11      2       1       Warten auf Dutch        0
12      2       Vor dem Gesetz  0       undef
13      2       3       Der Mythos des Sisyphos 0
14      2       4       Furcht und Zittern      0
15      2       5       Das Geschenk der Weisen 0
16      2       6       Rhinocerus      0
17      2       7       Haben Sie das gemacht? Nein, Sie!       0
18      2       8       Loplop  0
19      2       9       Das Schloss     0
20      2       10      Palindrom       0
--------------------------------------------------------------------------------
table[2]: rows[11], cols[5]
Nr      Staffel Episode Titel   archiviert
1       Test    undef   undef   undef
2       Test    undef   undef   undef
3       Test    undef   undef   undef
4       Test    undef   undef   undef
5       Test    undef   undef   undef
6       Test    undef   undef   undef
7       Test    undef   undef   undef
8       Test    undef   undef   undef
9       Test    undef   undef   undef
10      Test    undef   undef   undef
--------------------------------------------------------------------------------

Die Daten rutschen immer nach rechts, wenn vorher doppelte Werte waren. Bei der dritten Tabelle sind Spalte 1-3 (Zahlen) und 4-5 (Text) jeweils identisch. Das war ein synthetischer Test, um das Ergebnis zu provozieren.

Ich stehe jetzt vor der Frage, ob das Modul einen Bug hat, Libreoffice-Calc nicht richtig unterstützt wird (keine Änderungen im Modul seit 2010) oder ich einen Denkfehler in meinem Testskript habe.

Das Skript ist sehr simpel. Es wird ermittelt, wie viele Tabellen enthalten sind. Dann wird für jede Tabelle die Dimension ermittelt und dann entsprechend über Zeilen und Spalten iteriert.

Code: [Select]
#!/usr/bin/perl -w
use strict;
use v5.10;
use OpenOffice::OODoc;

my $doc = odfDocument(file => './data/data.ods');
my $tables = $doc->getTableList();

for (my $tableNum = 0; $tableNum < $tables; $tableNum++) {
my ($rows, $cols) = $doc->getTableSize($tableNum);
say "table[" . $tableNum . "]: rows[" . $rows . "], cols[" . $cols . "]";
for (my $rowNum = 0; $rowNum < $rows; $rowNum++) {
for (my $colNum = 0; $colNum < $cols; $colNum++) {
my $value = $doc->getCellValue($tableNum, $rowNum, $colNum);
if ($colNum > 0) {
print "\t";
}
if (defined $value) {
print $value;
} else {
print "undef";
}
}
print "\n";
}
print "--------------------------------------------------------------------------------\n";
}

Hinweise und Tipps sind willkommen.

P.S. Das Perl-Modul "Spreadsheet::Reader" hätte ich lieber genommen, aber die Version aus den Repositories unterstützt nur Excel. Die neuste Version aus Upstream kann auch Libre-/Openoffice verarbeiten.

Offline musca

  • User
  • Posts: 725
  • sid, fly high!
Re: Libreoffice-Calc-Dokument mit Perl auslesen
« Reply #1 on: 2017/11/13, 23:02:56 »
Hallo orinoco,

das Problem lässt sich leicht nachvollziehen:

user@sidbox:~$ ~/bin/oo_table
table[0]: rows[3], cols[5]
1    2        4    5
6    7        9    undef
a    b    c    d    e
-------------------------------------------------

vollständig wirr wird es, wenn man nachträglich noch ein paar Zellen in der Tabelle manipuliert.
Dann werden sehr viele "undef" ausgegeben.

Daher glaube ich, dass das Dateiformat nicht (mehr) zu dem alten Modul passt.

Grüße
musca
„Es irrt der Mensch, solang er strebt.“  (Goethe, Faust)