zur Übersicht nächste Seite

Tabelle aus PDF

Generell gilt bei den weißen Textstellen auf dieser Seite: Man fügt die Zeichenfolge aus dem weißen Feld bei dem blinkenden Cursor des Terminals ein - dann drückt man die Eingabetaste.
Wichtig ist auch daß der verwendete Texteditor die Eingaben Linux-codiert speichert. Bei gedit kann man mit dem Menupunkt 
Speichern unter
Einstellungen vornehmen und diese sollten so aussehen

Bei Windows-codierten txt-Dateien kann es zu Problemen kommen.


Manchmal möchte man eine Tabelle aus einem PDF herauskopieren, damit man diese weiterverarbeiten kann. Sofern man die Zeichen kopieren kann (und es sich nicht um ein Bild handelt) kann man das Terminal zu Hilfe nehmen. Hier ein Beispiel aus einem PDF bei dem die Zeichen markiert sind

Kopieren dieser Zeichen im PDF und einfügen in gedit:

01.02. 1
0,75 28
0,98 2
0,69 3
0,15 0
0,00 1
1,29
03.02. 2
0,75 8
0,98 3
0,69 1
0,15 1
0,50 0
0,00
04.02. 2
0,75 31
0,98 8
0,69 11
0,15 3
0,50 0
0,00
05.02. 2
0,75 18
0,98 4
0,69 3
0,15 4
0,50 0
0,00

Bei Debian 11
Man kann die PDF-Datei mit dem Dokumentenbetrachter öffnen und die markierten Tabellenzeichen in gedit einfügen. Man erhält in gedit die Zeichen wie links gezeigt.
Bei Debian 12
Das gleiche Vorgehen führt jetzt zu den Zeichen wie rechts gezeigt. Alle Leerzeichen sind verschwunden. Man kann die PDF-Datei mit firefox öffnen und die markierten Zeichen in gedit einfügen. Dann erhält man in gedit die Zeichen wieder wie links gezeigt.

Wenn die Leerzeichen nicht mehr vorhanden sind funktionieren natürlich die folgenden Schritte nicht mehr. 

01.02.1
0,7528
0,982
0,693
0,150
0,001
1,29
03.02.2
0,758
0,983
0,691
0,151
0,500
0,00
04.02.2
0,7531
0,988
0,6911
0,153
0,500
0,00
05.02.2
0,7518
0,984
0,693
0,154
0,500
0,00

Dann wird diese Datei als hG.txt abgespeichert und das Terminal in dem Ordner geöffnet in dem die hG.txt liegt. Die Datei enthält Infos zu Datum, Preis und Menge. Man möchte Gesamt-Mengenzahlen pro Tag und Mengen pro Artikel über alle Tage. 

Man kann die Datei im Terminal aufrufen durch
cat hG.txt
Die gewünschten Mengen-Zahlen stehen pro Zeile an letzter Stelle - meistens jedenfalls. Es werden die folgenden Bausteine verwendet:

es wird am Ende jeder Zeile _ angefügt

es wird das zweite Feld mit Tennzeichen LEERZEICHEN ausgeschnitten

Es werden die Zeilen in denen , vorkommt gelöscht und ersetzt durch eine Zeile mit dem Zeichen #

Es werden alle Zeilen in eine Zeile geschrieben

es wird das Zeichen # in einen Zeilenumbruch verwandelt
cat hG.txt | sed 's/$/_/g' | cut -f 2 -d ' ' | sed '/,/ c #' | tr -d '\n' | sed 's/#/\n/g'
1_28_2_3_0_1_
2_8_3_1_1_0_
2_31_8_11_3_0_
2_18_4_3_4_0_

Diese Zahlen kann man im Terminal kopieren und in eine Tabelle einfügen (Einfügen - unformatierter Text) wobei man als Trennoption _ verwendet

Dann kann man schnell Zeilensummen (Gesamt-Mengenzahlen pro Tag) und 
Spaltensummen (Mengen pro Artikel über alle Tage) bilden

Es mag sein daß für andere Tabellen andere Terminal-Bausteine verwendet werden müssen.
Wenn man das Datum mit ausgeben möchte (z.B. für eine Tagesstatistik) kann man einen Baustein voranstellen, der bei allen Zeilen in denen ein Punkt vorkommt LEERZEICHEN durch _ ersetzt
sed '/\./ s/ /_/' 
cat hG.txt | sed '/\./ s/ /_/' | sed 's/$/_/g' | cut -f 2 -d ' ' | sed '/,/ c #' | tr -d '\n' | sed 's/#/\n/g'
01.02._1_28_2_3_0_1_
03.02._2_8_3_1_1_0_
04.02._2_31_8_11_3_0_
05.02._2_18_4_3_4_0_

Es ist etwas schwieriger wenn die Tabelle nur Zahlen enthält, ohne daß man Punkte (vom Datum) oder Komma (vom Preis) als Bearbeitungspunkte nutzen könnte:

Kopieren dieser Zeichen im PDF und einfügen in gedit:

1
28
2
3
0
1
2
8
3
1
1
0
2
31
8
11
3
0
2
18
4
3
4
0

Dann wird diese Datei als hH.txt abgespeichert und das Terminal in dem Ordner geöffnet in dem die hH.txt liegt. Es bleibt jetzt nur die Information, daß es bei der Tabelle 6 Spalten gibt. Also gruppiert man diese Zahlen in 6-er-Blocks:
cat hH.txt | sed 'N;N;N;N;N;s/\n/_/g'
1_28_2_3_0_1
2_8_3_1_1_0
2_31_8_11_3_0
2_18_4_3_4_0

Diese Zahlen kann man im Terminal kopieren und in eine Tabelle einfügen (Einfügen - unformatierter Text) wobei man als Trennoption _ verwendet

Man kann diese Block-Bildung natürlich auch bei obigem 1. Beispiel (also hG.txt) verwenden. Dazu kann man folgende Bausteine benutzen

sämtliche LEERZEICHEN werden durch einen Zeilenumbruch ersetzt
alle Zeilen die Komma oder Punkt enthalten werden gelöscht
Gruppierung der Zahlen in 6-er-Blocks

cat hG.txt | sed 's/ /\n/g' | sed '/[,.]/ d' | sed 'N;N;N;N;N;s/\n/_/g'

Ersetzt man das Trennzeichen _ durch + und verfüttert das Ergebnis an das Rechenprogramm bc so erhält man auch gleich die Gesamt-Mengenzahlen pro Tag 
cat hG.txt | sed 's/ /\n/g' | sed '/[,.]/ d' | sed 'N;N;N;N;N;s/\n/+/g' | bc
35
15
55
31

Man kann auch bei hG.txt den Gesamtbetrag (Menge mal Preis) aller Artikel berechnen. Dazu kann man zunächst das Datum entfernen. Also sucht man einen sed-Baustein der die letzte Zeichenfolge jeder Zeile heraussucht, getrennt durch das Trennzeichen PUNKT (der maskiert wird)
\.
allerdings nur in Zeilen in denen ein PUNKT (der maskiert wird) vorkommt
cat hG.txt | sed '/\./s/^.*\.//'

 1
0,75 28
0,98 2
0,69 3
0,15 0
0,00 1
1,29
 2
0,75 8
0,98 3
0,69 1
0,15 1
0,50 0
0,00
 2
0,75 31
0,98 8
0,69 11
0,15 3
0,50 0
0,00
 2
0,75 18
0,98 4
0,69 3
0,15 4
0,50 0
0,00


Nun wählt man einen sed-Baustein der am Schluß jeder Zeile ein MULTIPLIKATIONSZEICHEN anfügt, allerdings nur wenn in der Zeile ein LEERZEICHEN vorhanden ist
cat hG.txt | sed '/\./s/^.*\.//' | sed '/ /s/$/*/'
Dann ersetzt man alle LEERZEICHEN durch ein Additionszeichen und schreibt alles in eine Zeile
cat hG.txt | sed '/\./s/^.*\.//' | sed '/ /s/$/*/' | sed 's/ /+/g' | tr -d '\n'

Das sieht schon recht gut aus: alle Mengen mal Preis werden aufaddiert. Aber man kann diese Ausgabe noch nicht an bc verfüttern. Denn bc kann nur rechnen wenn anstelle von , ein PUNKT (der maskiert wird) steht. Also nimmt man einen sed-Baustein der jedes , in \. verwandelt. Außerdem stolpert bc über das allererste + das man mit einem weiteren sed-Baustein entfernt. Und noch ein Stolperstein muß beseitigt werden, denn bc kapituliert wenn nicht am Ende der Zeile ein Zeilenumbruch-Zeichen vorhanden ist. Also:

cat hG.txt | sed '/\./s/^.*\.//' | sed '/ /s/$/*/' | sed 's/ /+/g' | tr -d '\n' | sed 's/,/\./g' | sed 's/^+//' | sed 's/$/\n/' | bc
108.27

Damit hat man den Gesamtbetrag (Menge mal Preis) aller Artikel berechnet.

Noch eine Bemerkung zum Rechenprogramm bc:
Wenn eine Rechenoperation mit MINUSZEICHEN beginnt, rechnet bc
echo -3.1*2 | bc
-6.2

Wenn eine Rechenoperation mit PLUSZEICHEN beginnt, rechnet bc allerdings nicht
echo +3.1*2 | bc
(standard_in) 1: syntax error

Mit KOMMAZAHLEN rechnet bc schon gar nicht. Und oben hat sich gezeigt daß bc auch nicht rechnet wenn am Ende der Zeile ein Zeilenumbruch fehlt.
Man kann versucht sein bc etwas zu verändern um solche Fälle zu umgehen.
Man kann mit alias eine Abkürzung festlegen (vielleicht bC) und damit diese Abkürzung im System bekannt bleibt schreibt man diese in die Datei
~/.bashrc
Man vergleiche die Seite mit fbpanel
alias bC='pr -t | sed "s/,/\./g" | sed "s/^+//" | bc'
Wenn man also zurückspringt an die Stelle:
Das sieht schon recht gut aus: alle Mengen mal Preis werden aufaddiert. 
Dann kann man diese Ausgabe an bC verfüttern.
cat hG.txt | sed '/\./s/^.*\.//' | sed '/ /s/$/*/' | sed 's/ /+/g' | tr -d '\n' | bC
108.27

Damit hat man den Gesamtbetrag (Menge mal Preis) aller Artikel berechnet.

Und natürlich kann man auch sonst mit KOMMAZAHLEN rechnen
echo +3,1*2 | bC
6.2

auch
echo +28/0,98 | bC -l
28.57142857142857142857

Wenn man nochmals zurückspringt an die Stelle: Das sieht schon recht gut aus:
alle Mengen mal Preis werden in EINER ZEILE aufaddiert.
Nicht so wie das Foto nahelegt:
mit 6 Multiplikationen in 4 ZEILEN mit jeweils einem Zeilenumbruch am Ende. Aber man kann eine solche Anordnung bekommen, bevor man alles in eine Zeile schreibt, durch Gruppierung in 7-er-Blocks wobei der Zeilenumbruch durch NICHTS ersetzt wird (also Zeilenumbruch gelöscht wird). Anschließend an bC verfüttern: 
cat hG.txt | sed '/\./s/^.*\.//' | sed '/ /s/$/*/' | sed 's/ /+/g' | sed 'N;N;N;N;N;N;s/\n//g' | bC
31.31
12.06
40.55
24.35

Damit hat man die Tagesumsätze aller Artikel berechnet.

Um die Verkaufszahlen einzelner Artikel über alle Tage zu bestimmen muß man die Spalten betrachten. Man könnte durch das Zeichen + die in Spalten notierten Artikel trennen. Aber das + wird noch bei der Addition gebraucht. Daher wird ein Trennzeichen # eingefügt, vor jedem + allerdings nicht bei dem ersten vorkommenden +. Dies wird gleich in eine Variable geschrieben.
sPA=$(cat hG.txt | sed '/\./s/^.*\.//' | sed '/ /s/$/*/' | sed 's/ /+/g' | sed 'N;N;N;N;N;N;s/\n//g' | sed 's/+/#+/g;s/^#//')

echo "$sPA"
+1*0,75#+28*0,98#+2*0,69#+3*0,15#+0*0,00#+1*1,29
+2*0,75#+8*0,98#+3*0,69#+1*0,15#+1*0,50#+0*0,00
+2*0,75#+31*0,98#+8*0,69#+11*0,15#+3*0,50#+0*0,00
+2*0,75#+18*0,98#+4*0,69#+3*0,15#+4*0,50#+0*0,00

Damit lassen sich mit cut über das Trennzeichen # die einzelnen Artikel trennen. Z.B. für den 2.Artikel. Anschließend alles in eine Zeile schreiben und an bC verfüttern
echo "$sPA" | cut -f 2 -d '#' | tr -d '\n' | bC
83.30

Dies ist der Gesamtverkauf des 2. Artikels über alle Tage. 
Um dies gleich für alle Artikel zu machen kann man eine for-Schleife nutzen, die allerdings die Anzahl der Artikel benötigt.

Man kann die Spalten-ANZahl (SpANZ) bestimmen (Anzahl der Artikel)

SpANZ=$(echo "$sPA" | head -n 1 | sed 's/#/\n/g' | wc -l)
Dann kann man die Schliefe laufen lassen
for ((i=1; i<="$SpANZ"; i++)); do echo "$sPA" | cut -d "#" -f "$i" | tr -d "\n" | bC ; done
5.25
83.30
11.73
2.70
4.00
1.29

Damit hat man den Gesamtverkauf aller 6 Artikel über alle Tage.


Man kann "$sPA" als "Tabelle" verstehen deren "Tabellenzellen" durch das Zeichen # und den Zeilenumbruch getrennt sind. Eine andere Möglichkeit ist es daher bei der "Tabelle" "$sPA" die Zeilen und Spalten zu vertauschen, die "Tabelle" zu transponieren. Dazu werden zunächst alle "Tabellen-Elemente" untereinandergeschrieben mit

# wird in Zeilenumbruch verwandelt

dann wird eine neue Sortierung in $(echo "$sPA" | wc -l) Spalten erzeugt. 
$(echo "$sPA" | wc -l) ist die Anzahl der Zeilen, hier 4. 
Man hätte in diesem Fall schreiben können
pr -t -s" " -4

anschließend wird alles an bC verfüttert
echo "$sPA" | sed 's/#/\n/g' | pr -t -s" " -"$(echo "$sPA" | wc -l)" | bC
5.25
83.30
11.73
2.70
4.00
1.29

Damit hat man wiederum den Gesamtverkauf aller 6 Artikel über alle Tage.


Man kann die Gruppierung von Zahlen in Blocks auch sehr komfortabel mit pr durchführen. 
Z.B. die Zeilengruppierung in 6-er-Blocks mit dem Trennzeichen + bei hH.txt
cat hH.txt | pr -at -s"+" -6
1+28+2+3+0+1
2+8+3+1+1+0
2+31+8+11+3+0
2+18+4+3+4+0

Oder die Spaltengruppierung in 4-er-Blocks mit dem Trennzeichen + bei hH.txt was die darüberstehende "Tabelle" transponiert
cat hH.txt | pr -t -s"+" -4
1+2+2+2
28+8+31+18
2+3+8+4
3+1+11+3
0+1+3+4
1+0+0+0

Verfüttern an bc 
cat hH.txt | pr -t -s"+" -4 | bc
7
85
17
18
8
1

Damit hat man die Mengen pro Artikel über alle Tage.

zur Übersicht nächste Seite

Datenschutzerklärung
Impressum