Nobuddy
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Hallo zusammen, möchte aus einer Produktbeschreibung, die Inhaltsangabe herausfiltern. Ich poste hier mal die Spalte mit ein paar Datensätzen 3M POST-IT INDEX MUSTERKARTE, INHALT: 25 STÜCK ÜBERZEUGEN SIE IHRE KUNDEN !
3M POST-IT RECYCLING NOTES MUSTERKARTE, INHALT: 25 STÜCK ÜBERZEUGEN SIE IHRE KUNDEN !
ORIGINAL TINTENPATRONEN+DRUCKKOPF OLIVETTI ANYWAY IN502, SCHWARZ ; INHALT: 20 ML (B0495) SIMPLE_WAY
ORIGINAL TINTENPATRONEN+DRUCKKOPF OLIVETTI ANYWAY IN501, SCHWARZ ; INHALT 11 ML ANYWAY A4/ANYWAY A4 PHOTO/ANYWAY A4 BLUETOOTH/ANYWAY A4 SIMPLE/ANYWAY SIMPLE/ANYWAY BLUETOOTH/ANYWAY PHOTO/ANYWAY PHOTO WIRELESS/ANYWAY WIFI/ANYWAY A4 PHOTO WIRELESS/ANYWAY A4 WIFI/ANYWAY PHOTO PLUS/ANYWAY PHOTO WIRELESS PLUS/ANYWAY
HAMA BILDAUFHÄNGER MIT KLAPPÖSEN, 11 MM, FARBE: GOLD MIT DREIECKÖSEN UND JE ZWEI NÄGELN (8 MM), IDEAL ZUR BILDERRAHMENAUFHÄNGUNG BIS CA. 300 X 450 MM, BEFESTIGUNG MIT NAGEL INHALT: 10 STÜCK (7084)
HAMA BILDAUFHÄNGER MIT KLAPPÖSEN, 15 MM, FARBE: GOLD MIT DREIECKÖSEN UND JE ZWEI NÄGELN (8 MM), IDEAL ZUR BILDERRAHMENAUFHÄNGUNG BIS CA. 700 X 1000 MM, BEFESTIGUNG MIT NAGEL INHALT: 10 STÜCK (7085)
HERLITZ LÖSCHPAPIERBLOCK DIN A4, 80 G/QM, WEIß HOLZFREI INHALT: 10 BLATT (00382408-002)
HERLITZ LÖSCHPAPIERBLOCK DIN A5, 80 G/QM, WEIß HOLZFREI INHALT: 10 BLATT (003282507-002)
VIKTOR RICHTER KARTEIKARTEN A7, BLAU, LINIERT, INHALT: 100 (KK 7100 LINIERT)
VIKTOR RICHTER KARTEIKARTEN A7, GRÜN, LINIERT, INHALT: 100 (KK 7100 LINIERT)
PAPYRUS UNIVERSAL-PAPIER RAINBOW, A4, MITTELGELB 80 G/QM, BLANKO, HOLZFREI, PASTELL-FARBE, ALTERUNGSBESTÄNDIG, FSC ZERTIFIZIERT, IN TRANSPARENTER, WIEDERVERSCHLIEßBARER VERPACKUNG, FÜR INKJET-, LASERDRUCKER, KOPIERER, FAX INHALT: 2.500 BLATT (88042319)
PAPYRUS UNIVERSAL-PAPIER RAINBOW, A4, LACHS 80 G/QM, BLANKO, HOLZFREI, PASTELL-FARBE, ALTERUNGSBESTÄNDIG, FSC ZERTIFIZIERT, IN TRANSPARENTER, WIEDERVERSCHLIEßBARER VERPACKUNG, FÜR INKJET-, LASERDRUCKER, KOPIERER, FAX INHALT: 1.500 BLATT (88042497)
Ich habe dazu auch ein Konstrukt erstellt 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | if wert27 == '':
satz = wert4
index = string.find(satz, 'INHALT:') # Suchen nach 'INHALT' in String
if index >= 0:
start = index + 7 # Stringlänge nach 'INHALT:'
a = wert4[start:] # Neuer String nach 'INHALT:'
index = string.find(a, '1' or '2' or '3' or '4' or '5' or '6' or '7' or '8' or '9') # Zahlen 1-9 finden
if index == 0 or index == 1:
start = start + index # Neue Stringlänge, Anfang Zahl
a = wert4[start:] # Neuer String ab Zahl
index = string.find(a, ' ') # Gehe bis zum nächsten Leerzeichen
end = start + index # Länge des Zahlenstrings
b = wert4[start:end] # Ausgabe zahlenwert
print(b)
|
'wert27' ist die Spalte, wo die Inhaltsangaben drin stehen sollen. 'wert4' ist die Spalte mit der Produktbeschreibung. Zeile 7 funktioniert nicht so, nimmt immer den ersten Wert, hier '1'. Die anderen Werte werden ignoriert. Ist das was ich hier gemacht habe, umständlich bzw. der falsche Ansatz? Wenn ja, welche Vorschläge hättet Ihr dazu? Wenn nein, gibt es etwas zu optimieren? Das ist erst der Anfang, später muß ich noch 1000-Trennzeichen und Dezimaltrenner berücksichtigen, sowie die Inhaltsangabe wie Stück, Blatt usw. in eine gesonderte Spalte bringen. Ich hoffe, Ihr könnt mich dabei unterstützen. Grüße Nobuddy
|
Barabbas
Anmeldungsdatum: 31. März 2007
Beiträge: 1651
Wohnort: Münster
|
Hallo, ich finde dein Ansatz schon recht umständlich. Ich würde das erstmal mit regulären Ausdrücken versuchen: >>> x="""3M POST-IT INDEX MUSTERKARTE, INHALT: 25 STÜCK ÜBERZEUGEN SIE IHRE KUNDEN !
... 3M POST-IT RECYCLING NOTES MUSTERKARTE, INHALT: 25 STÜCK ÜBERZEUGEN SIE IHRE KUNDEN !
... ORIGINAL TINTENPATRONEN+DRUCKKOPF OLIVETTI ANYWAY IN502, SCHWARZ ; INHALT: 20 ML (B0495) SIMPLE_WAY
... ORIGINAL TINTENPATRONEN+DRUCKKOPF OLIVETTI ANYWAY IN501, SCHWARZ ; INHALT 11 ML ANYWAY A4/ANYWAY A4 PHOTO/ANYWAY A4 BLUETOOTH/ANYWAY A4 SIMPLE/ANYWAY SIMPLE/ANYWAY BLUETOOTH/ANYWAY PHOTO/ANYWAY PHOTO WIRELESS/ANYWAY WIFI/ANYWAY A4 PHOTO WIRELESS/ANYWAY A4 WIFI/ANYWAY PHOTO PLUS/ANYWAY PHOTO WIRELESS PLUS/ANYWAY
... HAMA BILDAUFHÄNGER MIT KLAPPÖSEN, 11 MM, FARBE: GOLD MIT DREIECKÖSEN UND JE ZWEI NÄGELN (8 MM), IDEAL ZUR BILDERRAHMENAUFHÄNGUNG BIS CA. 300 X 450 MM, BEFESTIGUNG MIT NAGEL INHALT: 10 STÜCK (7084)
... HAMA BILDAUFHÄNGER MIT KLAPPÖSEN, 15 MM, FARBE: GOLD MIT DREIECKÖSEN UND JE ZWEI NÄGELN (8 MM), IDEAL ZUR BILDERRAHMENAUFHÄNGUNG BIS CA. 700 X 1000 MM, BEFESTIGUNG MIT NAGEL INHALT: 10 STÜCK (7085)
... HERLITZ LÖSCHPAPIERBLOCK DIN A4, 80 G/QM, WEIß HOLZFREI INHALT: 10 BLATT (00382408-002)
... HERLITZ LÖSCHPAPIERBLOCK DIN A5, 80 G/QM, WEIß HOLZFREI INHALT: 10 BLATT (003282507-002)
... VIKTOR RICHTER KARTEIKARTEN A7, BLAU, LINIERT, INHALT: 100 (KK 7100 LINIERT)
... VIKTOR RICHTER KARTEIKARTEN A7, GRÜN, LINIERT, INHALT: 100 (KK 7100 LINIERT)
... PAPYRUS UNIVERSAL-PAPIER RAINBOW, A4, MITTELGELB 80 G/QM, BLANKO, HOLZFREI, PASTELL-FARBE, ALTERUNGSBESTÄNDIG, FSC ZERTIFIZIERT, IN TRANSPARENTER, WIEDERVERSCHLIEßBARER VERPACKUNG, FÜR INKJET-, LASERDRUCKER, KOPIERER, FAX INHALT: 2.500 BLATT (88042319)
... PAPYRUS UNIVERSAL-PAPIER RAINBOW, A4, LACHS 80 G/QM, BLANKO, HOLZFREI, PASTELL-FARBE, ALTERUNGSBESTÄNDIG, FSC ZERTIFIZIERT, IN TRANSPARENTER, WIEDERVERSCHLIEßBARER VERPACKUNG, FÜR INKJET-, LASERDRUCKER, KOPIERER, FAX INHALT: 1.500 BLATT (88042497)"""
>>> rg = re.compile(r"INHALT:? ([0-9.]*) (Blatt|Stück|ML)?", re.I)
>>> rg.findall(x) Ergebnis wäre in diesem Fall: [('25', 'STÜCK'), ('25', 'STÜCK'), ('20', 'ML'), ('11', 'ML'), ('10', 'STÜCK'), ('10', 'STÜCK'), ('10', 'BLATT'), ('10', 'BLATT'), ('100', ''), ('100', ''), ('2.500', 'BLATT'), ('1.500', 'BLATT')] Man muss in diesem Beispiel aber spezifizieren, welche Einheiten es überhaupt gibt (Blatt, ML, etc). Es wäre weitaus besser, wenn das Ausgabeformat bereits CSV oder so wäre. Ich möchte auch dezent darauf hinweisen, dass ich von regulären Ausdrücken keine große Ahnung habe, vll. kann man da noch was optimieren. lG brb
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Hallo Barabbas, interessanter Ansatz! 👍 Das mit dem csv-Format lässt sich machen. Bei den Einheiten wird es etwas komplizierter. Stück und Blatt gehören dazu. Es gibt aber auch Mengenangaben ohne Einheiten und bestimmte Einheiten, wie ML sollen nicht verwendet werden. Grüße Nobuddy
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Hallo, erste Voraussetzung für das erfolgreiche Parsen solcher Dinge ist es, eine exakte Spezifikation zu erhalten. Es wäre schon mal toll zu wissen, wie eine Zeile aufgebaut sien kann? Gibt es eine feste Anzahl an Spalten? Wie sind diese getrennt? Danach kann man sich an die "Mikro"-Formate einzelner Spalten machen und gucken, wie man die angehen kann. Also: Versuche mal so eaxkt wie möglich aufzuschreiben, welche Möglichkeiten es wo geben kann. Generell ist hier ein Ansatz mit RegExps vermutlich am sinnvollsten.
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Lysander schrieb: Hallo, erste Voraussetzung für das erfolgreiche Parsen solcher Dinge ist es, eine exakte Spezifikation zu erhalten. Es wäre schon mal toll zu wissen, wie eine Zeile aufgebaut sien kann? Gibt es eine feste Anzahl an Spalten? Wie sind diese getrennt?
Dachte, ich poste erstmal die wesentliche Dinge. Eine Zeile ist in 26 Spalten aufgeteilt, die durch TAB '\t' getrennt sind.
Danach kann man sich an die "Mikro"-Formate einzelner Spalten machen und gucken, wie man die angehen kann.
Ok, die Spalte um die es geht, habe ich ja schon einen Auszug gepostet.
Also: Versuche mal so eaxkt wie möglich aufzuschreiben, welche Möglichkeiten es wo geben kann.
Inhaltsangaben beginnen mit 'INHALT:' innerhalb des Strings, der oben geposteten Spalte (Auszug). Beispiele von Inhaltsangaben: INHALT: 10 BLATT
INHALT: 100
INHALT: 1 X 50 ML < Nein
INHALT: 5 STÜCK
INHALT: 1.650
INHALT: 190 G
INHALT: 8 X GOLD < Nein
INHALT: 18 X WEIß < Nein
INHALT: 1.000 G
INHALT: 10 + 2 GRATIS Generell ist hier ein Ansatz mit RegExps vermutlich am sinnvollsten.
Wichtig wäre zuerst mal die einfachen Inhaltsangaben, wie INHALT: 10 BLATT
INHALT: 100
INHALT: 5 STÜCK
INHALT: 1.650 sauber gefiltert zu bekommen. Bei den anderen Inhaltsangaben, wird es haariger werden ...
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Nobuddy schrieb: Bei den anderen Inhaltsangaben, wird es haariger werden ...
Was soll denn mit den Spalten passieren, wo Du "Nein" angemarkert hast? Und welche "anderen" Angaben gibt es ggf. noch? Ich würde doch jetzt so viel wie möglich wissen wollen, damit man keinen optimierten RegExp bastelt, den man später wegwerfen kann. Sollte da noch Kontext wichtig sein, muss man das Problem eh noch mal gesondert angehen.
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Lysander schrieb: Nobuddy schrieb: Bei den anderen Inhaltsangaben, wird es haariger werden ...
Was soll denn mit den Spalten passieren, wo Du "Nein" angemarkert hast? Und welche "anderen" Angaben gibt es ggf. noch? Ich würde doch jetzt so viel wie möglich wissen wollen, damit man keinen optimierten RegExp bastelt, den man später wegwerfen kann. Sollte da noch Kontext wichtig sein, muss man das Problem eh noch mal gesondert angehen.
Die mit 'Nein' sollen nicht als Inhaltsangabe verwendet werden. Also alles was dem entspricht 'ZAHL X IRGENDWAS ODER AUCH NICHTS', soll nicht berücksichtigt werden. Mir wäre es wichtig und ich wäre schon zufrieden, wenn ich diese Inhaltsangaben (Beispiele) INHALT: 10 BLATT
INHALT: 100
INHALT: 5 STÜCK
INHALT: 1.650 sauber verarbeiten könnte. Ich glaube auch, daß bei allem anderen, das Gefrickel und die Vielzahl an Variationen, eine saubere Lösung erheblich erschwert und das muß wirklich nicht sein.
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Das sollte dann so gehen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | In [31]: regexp = re.compile(r"INHALT: ?(?P<VALUE>\d*\.?\d*)\s*(?P<UNIT>\w*)", re.U|re.I)
In [33]: re.search(regexp, data[2]).groupdict()
Out[33]: {'UNIT': u'ST\xdcCK', 'VALUE': u'5'}
In [34]: data
Out[34]: [u'INHALT: 10 BLATT', u'INHALT: 100', u'INHALT: 5 ST\xdcCK', u'INHALT: 1.650']
In [35]: for item in data:
....: re.search(regexp, item).groupdict()
....:
....:
Out[35]: {'UNIT': u'BLATT', 'VALUE': u'10'}
Out[35]: {'UNIT': u'', 'VALUE': u'100'}
Out[35]: {'UNIT': u'ST\xdcCK', 'VALUE': u'5'}
Out[35]: {'UNIT': u'', 'VALUE': u'1.650'}
|
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Hallo Lysander, Du schüttelst das gerade so aus Deinem Ärmel ..., wow! Da brauche ich ein wenig, um das auch zu verstehen. 'VALUE' ist die Variable für die Spalte Produktbeschreibung, ja? Was ist 'UNIT'? Könntest Du mir evtl. die erste Zeile für mein Verständnis erklären? Grüße Nobuddy
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Das ist alles gar nicht so schwierig. RegExps lassen sich leider besser schreiben als später lesen 😉
| r"""
INHALT: ? # Fester String, gefolgt von einem oder keinem Leerzeichen (`?`)
(\d*\.?\d*) # Gruppe von beliebig vielen (`*`) Digits `\d` gefolgt von einem / keinem Punkt `.` (escapen, da "." sonst für ein beliebiges Zeichen steht) und von wieder beliebig vielen Digits.
\s* # beliebig viele Whitespaces
(\w*) # Gruppe von beliebig vielen Alphanumerischen Zeichen
"""
|
Die ?P<name> definieren mir nur Namen für gefundene Gruppen (...) . Damit kann ich mir ein Dictionary pro gefundenem RegExp in einem String aufbauen lassen. Praktisch für den Zugriff, da Du sonst ein Tupel bekommst und dort über den Index gehen musst (wirkt oftmals kryptisch). Mehr steckt da nicht dahinter.
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Lysander, danke für die Erklärung, jetzt kann ich das besser nachvollziehen. Jedoch ist mir noch unklar, wie ich das einbinden kann. Hier mal das Python-Script mit Deinem Konstrukt. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 | #!/usr/bin/python3.1
# -*- coding: utf-8
### Import Module
from datetime import date
now = date.today()
heute = now.strftime('%Y.%m.%d-')
import re
import os
import string
import csv
### Basis-Infos
# Quellliste für Lieferanten-Produktdaten
quellliste_subdir = 'daten' # Ordner für Datei
quellliste_filename = '{}liste.txt'.format(heute) # Namen der Datei
quellliste_path = os.path.join(os.path.dirname(__file__), quellliste_subdir, quellliste_filename) # Pfad zur Datei inklusive Dateinamen
### Programm
# Quelldatei Lieferanten-Produktdaten öffnen
# Kontrolle, ob Quelldatei vorhanden
with open(quellliste_path, "r") as in_file:
reader = csv.reader(in_file, delimiter="\t")
# Zeilenweise aus CSV-Liste auslesen
for row in reader:
beschreibung = row[3]
# Suche in Spalte beschreibung, nach String 'INHALT:'
# und gebe die Inhaltsangabe aus
regexp = re.compile(r"INHALT: ?(?P<VALUE>\d*\.?\d*)\s*(?P<UNIT>\w*)", re.U|re.I)
re.search(regexp, data[2]).groupdict()
data
for item in data:
re.search(regexp, item).groupdict()
|
Hoffe, daß dies so richtig umgesetzt ist. Bei diesem Konstrukt, erhalte ich folgende Fehlermeldung: Traceback (most recent call last):
File "__inhalt__.py", line 36, in <module>
re.search(regexp, data[2].groupdict()
NameError: name 'data' ist not defined Bestimmt ein Gedankenfehler von mir ...
|
busfahrer
Anmeldungsdatum: 9. April 2007
Beiträge: 3052
|
Hallo wie die Fehlermeldung schon sagt, der Name data ist nicht definiert. Habe auch nicht die große Ahnung, vermute aber das du die Variable data durch die Variable inhalt ersetzen musst. Blicke aber auch nicht so ganz durch 😳 Gruß....busfahrer
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Hallo Busfahrer, das habe ich auch schon versucht 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | with open(quellliste_path, "r") as in_file:
reader = csv.reader(in_file, delimiter="\t")
# Zeilenweise aus CSV-Liste auslesen
for row in reader:
beschreibung = row[3]
data = beschreibung
# Suche in Spalte beschreibung, nach String 'INHALT:'
# und gebe die Inhaltsangabe aus
regexp = re.compile(r"INHALT: ?(?P<VALUE>\d*\.?\d*)\s*(?P<UNIT>\w*)", re.U|re.I)
re.search(regexp, data[2]).groupdict()
data
for item in data:
re.search(regexp, item).groupdict()
|
Siehe zeile 7. Die Fehlermeldung hier Traceback (most recent call last):
File "__inhalt__.py", line 37, in <module>
re.search(regexp, data[2].groupdict()
IndexError: string index out of range Danach habe ich dies versucht 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | with open(quellliste_path, "r") as in_file:
reader = csv.reader(in_file, delimiter="\t")
# Zeilenweise aus CSV-Liste auslesen
for row in reader:
beschreibung = row[3]
data = beschreibung
# Suche in Spalte beschreibung, nach String 'INHALT:'
# und gebe die Inhaltsangabe aus
regexp = re.compile(r"INHALT: ?(?P<VALUE>\d*\.?\d*)\s*(?P<UNIT>\w*)", re.U|re.I)
re.search(regexp, data[2]).groupdict()
data
for item in data:
re.search(regexp, item).groupdict()
|
Hier dann die Fehlermeldung Traceback (most recent call last):
File "__inhalt__.py", line 37, in <module>
re.search(regexp, data[2].groupdict()
AttributeError: 'NoneType' object has no attribute 'groupdict'
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Oh weia... Du versuchst zu viel, ohne die Grundlagen gründlich durchgearbeitet zu haben.
| # Am besten Außerhalb der Funktion, ruhig global
# dann besserer Name;
PRODUCT_VALUE = re.compile(r"INHALT: ?(?P<VALUE>\d*\.?\d*)\s*(?P<UNIT>\w*)", re.U|re.I)
beschreibung = row[3]
result = re.search(regexp, beschreibung).groupdict()
|
Du musst doch mal in der Doku nachlesen, wie die Signatur der Methode search aussieht. Als erster Parameter muss dort ein RegExp stehen (den wir zur Effizienz oben bereits kompilieren, muss man nur einmal machen!) und als zweiter der String, der durchsucht werden soll. Bei Dir ist der String an den Namen beschreibung gebunden - wieso murkst Du da noch mit meinem data rum? Und meine Schleife war doch nur eine Demo für die vier verschiedenen Datensätze des Beispiels. Die musst Du doch nicht übernehmen. Sorry, aber ich glaube Du musst Dich noch viel mehr mit den Grundlagen befassen! Datentypen, Funktionen und Rückgabewerte, den Scope von Namen, das Binden von Objekten an Namen, usw. Wenn der RegExp nicht gefunden wird, dann gibt search eben None zurück - das hat dann auch keine Methode groupdict . Für die Praxis musst Du den Fehler abfangen oder das Ergebnis von search an einen Namen binden und erst bei Erfolg das Dict dort rausholen.
|
Nobuddy
(Themenstarter)
Anmeldungsdatum: 2. September 2005
Beiträge: 6990
Wohnort: 29614 Soltau
|
Ich gebe zu, hier mit einem großen Fragezeichen zu stehen! Bis dahin sollte es ja noch in Ordnung sein 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | #!/usr/bin/python3.1
# -*- coding: utf-8
### Import Module
from datetime import date
now = date.today()
heute = now.strftime('%Y.%m.%d-')
import re
import os
import string
import csv
### Basis-Infos
# Quellliste für Lieferanten-Produktdaten
quellliste_subdir = 'daten' # Ordner für Datei
quellliste_filename = '{}liste.txt'.format(heute) # Namen der Datei
quellliste_path = os.path.join(os.path.dirname(__file__), quellliste_subdir, quellliste_filename) # Pfad zur Datei inklusive Dateinamen
### Programm
# Quelldatei Lieferanten-Produktdaten öffnen
# Kontrolle, ob Quelldatei vorhanden
with open(quellliste_path, "r") as in_file:
reader = csv.reader(in_file, delimiter="\t")
|
Als nächstes kommt dann dies dazu 1
2
3
4
5
6
7
8
9
10
11
12
13 | # Zeilenweise aus CSV-Liste auslesen
for row in reader:
beschreibung = row[3]
inhaltsangabe = row[25]
inhalt = row[26]
# RegExp
regexp = re.compile(r"INHALT: ?(?P<VALUE>\d*\.?\d*)\s*(?P<UNIT>\w*)", re.U|re.I)
# Wenn Spalte inhalt keinen Wert hat
# Überprüfe, ob in Spalte beschreibung eine Inhaltsangabe enthalten ist
if inhalt == '':
result = re.search(regexp, beschreibung).groupdict()
|
Liege ich bis dahin richtig?
|