ubuntuusers.de

Textdatei in CSV umwandeln

Status: Ungelöst | Ubuntu-Version: Server 16.04 (Xenial Xerus)
Antworten |

gnude

Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

Hallo, ich arbeite daran eine PDF Datei in eine CSV umzuwandeln. Im Moment klemmt es beim setzten der Trenn-Semikolon. Mittels pdftotext wandel ich die Datei um, lösche die unnötigen Leerzeilen heraus und filter dann nach einem Schlüsselwort die Zeilen die später in die CSV kommen sollen. Das klappt, ich erhalte eine Datei mit genau den Zeilen die ich haben möchte. Aber das seperieren mit Semikolon klappt nicht sauber da die Felder unterschiedlich sind.

Hier mal ein Beispiel wie die Textdatei aufgebaut ist:

Feld1 Feld2 Feld2 Hier steht Text Feld4 Feld5 Feld6 Feld7 Feld10
Feld1 Feld2 Kuschelkissen Hier steht auch Text Feld4 Feld5 Feld6 Feld7 Feld8 Feld9 Feld10
Feld1 Feld2 Feld2 Hier steht Text Feld4 Feld5 Feld6 Feld7 Feld8 Feld9 Feld10
Feld1 Feld2 Hier steht mal mehr Text Feld4 Feld5 Feld6 Feld9 Feld10

Ich habe versucht mittels diesen Python Scriptes das Problem zu lösen:

1
2
3
4
5
6
7
#!/usr/bin/env python3
import fileinput

for line in fileinput.input(openhook=fileinput.hook_encoded("utf-8")):
    *leading, rest = line.split(maxsplit=3)
    text, *ending = rest.rsplit(maxsplit=4)
    print(';'.join((*leading, text, *ending)).encode('utf-8'))

So das ich von Vorne 3 Leerzeichen in ; umwandel, und von hinten 4 Amer es gibt unterschiedliche Längen, manchmal Besteht Feld2 aus 2 Werten oder hintene gibt es mehrere Felder. Der mittlere Text soll aber stehen bleiben. Bei einer festen Anzahl von Feldern ist das Script super, aber da man nicht genau weiss wie die Quelldatei aufgebaut ist (siehe Beispiel) muss das Script flexibel reagieren und ggf. die leeren Felder auffüllen. Gibt es dafür auch eine Lösung? Ich habe im Moment nicht die geringste Idee wie ich das angehen kann....

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5582

gnude schrieb:

Amer es gibt unterschiedliche Längen, manchmal Besteht Feld2 aus 2 Werten oder hintene gibt es mehrere Felder. Der mittlere Text soll aber stehen bleiben.

Wie kann man das dann feststellen? Wenn man es nur als Mensch erkennt, brauchst du wohl eine Heuristik.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Aus Deiner Beschreibung ist mir nicht ganz klar, wie sich die einzelnen Felder der CSV zusammensetzen.

Sind die Felder um die Texte immer gleich ? - oder werden sie irgendwie aus dem Text berechnet ? - oder stammen sie aus einer Tabelle ?

Dazu müsstest Du etwas mehr verraten, denn sonst können wir Dir keine sinnvollen Tips geben.
Wenn man die einzelnen Felder hat, ist es ja nun wirklich kein Zauberwerk, die mit Semikola aneinander zu reihen.

LG,

track

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4687

Wohnort: Berlin

Ich würde ja vermuten das bei pdftotext zu viel Information verloren geht. Wenn man die Positionen der Texte hätte könnte man sicher eher die Textteile Spalten in einer Tabelle zuordnen. Wobei aber auch das nicht zwingend funktionieren muss, je nach dem wie das PDF den Text aufbaut.

schusch

Avatar von schusch

Anmeldungsdatum:
2. September 2008

Beiträge: 324

Wohnort: Berlin

Ich rate mal wild darauf los:

Du hast eine Textdatei:

Es gibt Felder, die immer gleich sind (ohne Leerzeichen) Feld1, Feld2, Feld4, ..., Feld10 und dazwischen Text der beliebig lang sein kann.

Wir nehmen awk:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<datei awk '
BEGIN {
  ok["Feld1"]=1
  ok["Feld2"]=1
  ok["Feld4"]=1
     ...
  ok["Feld10"]=1
}
{
  for(i=1;i<=NF;i++) {
    if ($i in ok) {
      printf("%s;", $i)
    } else {
      printf("%s%s", $i, $(i+1) in ok?";":" ")
    }
}
END {
  printf("\n")
}'

Funktioniert nur, wenn Feld1, Feld2, Feld4 ... Feld10 keine Leerzeichen enthalten und in im beliebigen Text nicht Feld1, Feld2 usw. steht.

pipifax

Anmeldungsdatum:
12. Juni 2013

Beiträge: 7

Leider erfahren wir nichts näheres über den Inhalt (welche Zeichen), Aufbau, ggf. Syntax oder gemeinsame Merkmale der "Felder" und wie sie sich von den "Texten" unterscheiden lassen - ausgenommen, dass sie keine Leerzeichen enthalten. Es könnte sein, dass die Verwendung von regular expressions eine einfache(re) Lösung ist. Manche Editoren können damit beim "Suchen und Ersetzen" arbeiten, ich glaube auch awk und grep (bitte selbst nachprüfen).

Einer davon ist Gnu Emacs - bei noch weitergehenden Ansprüchen lassen sich mit dem eingebauten Lisp und den darin enthaltenen regex-Funktionen Skripte verfassen (und debuggen), am einfachsten als Vorspann zur "Textdatei", der nach beendeter Arbeit wieder gelöscht wird.

Der Lernaufwand ist nicht ganz klein, aber regexe sind ein sehr vielseitiges und mächtiges Werkzeug.

Antworten |