Felder aus CSV extrahieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
thorsten97
User
Beiträge: 3
Registriert: Freitag 8. Dezember 2017, 18:47

Hi,

ich habe eine cdv Datei die allerdings nur aus einer sehr langen Zeile besteht, ich würde aus dieser gerne einzelne Felder mittels regulärem Ausdruck extrahieren.

Die Datei hat folgenden Aufbau:

"Autoname":"BMW","Kosten":2000,"Farbe":"Gruen","Leistung",200,"Autoname":"VW","Kosten":1000,"Farbe":"Blau","Leistung",100

wie kann ich sämtliche Felder mit der Bezeichnung Autoname und dem Zusätzlichen Wert ausgeben lassen und zusätzlich die entsprechende Farbe mit angeben?

Vielen Dank im Voraus!!
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Das sieht nicht nach CSV, sondern eher nach einer unvollständigen/defekten JSON-Datei (mit doppelten Schlüsseln) aus. Steht am Ende zwischen Leistung und 100 wirklich ein Komma, oder doch ein Doppelpunkt? Ich würde eher versuchen, das in ein bekanntes Format zu bringen und dann einen Parser dafür zu verwenden. Das Beispiel, das du gezeigt hast, kann man mit einem ganz kurzen regulären Ausdruck verarbeiten -- Das ist für echte Daten aber i.d.R. nicht stabil genug.

Edit: Gekürzt.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

... und willkommen im Forum :-)

Wer denkt sich denn so eine "Datenstruktur" aus? Wo hast du die Daten her?

RegEx ist IMHO nicht nötig, geht mit String-Methode. Z.B. so:

Code: Alles auswählen

my_string = '"Autoname":"BMW","Kosten":2000,"Farbe":"Gruen","Leistung",200,"Autoname":"VW","Kosten":1000,"Farbe":"Blau","Leistung",100'
my_string = my_string.replace('"', '')
my_list = my_string.split(',')
for element in my_list:
    if element.startswith('Autoname'):
        _, marke = element.split(':')
        print(marke)
    elif element.startswith('Farbe'):
        _, farbe = element.split(':')
        print('    {}'.format(farbe))
Gruß, noisefloor
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@noisefloor: das geht nicht, sobald in den Werten Komma oder Doppelpunkt vorkommen. Dafür sind ja die Anführungszeichen da. Die Präfixe `my_` bei Deinen Variablennamen sind überflüssig, denn ich denke alle Variablen gehören Dir. `string` und `list` sind dann auch sehr generisch.

@thorsten97: wer schreibt die Datei? Gibt es eine Formatbeschreibung? Ohne diese zu kennen, kann man nur per Trial&Error raten, wie denn das Format genau gemeint ist. Vor allem, wie werden Anführungszeichen encodiert?
Am besten wäre es, das Programm, das die Datei schreibt, so abzuändern, dass es ein übliches Format verwendet.
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

nezzcarth hat geschrieben:Das sieht nicht nach CSV, sondern eher nach einer unvollständigen/defekten JSON-Datei (mit doppelten Schlüsseln) aus. Steht am Ende zwischen Leistung und 100 wirklich ein Komma, oder doch ein Doppelpunkt?
Für JSON fehlen ja wirklich nur die Klammern, die aus dem gezeigten Beispiel eine Liste mit zwei Dictionaries mit gleichen Schlüsseln machen würden. Und das Komma zwischen dem Schlüssel "Leistung" und dem Wert (an beiden Stellen!) ist natürlich auch verkehrt. Ich fürchte nur, dass in den echten Daten nicht so schön ordentlich immer die gleichen Schlüssel in der gleichen Reihenfolge stehen. @thorsten97: Du hast nicht etwa irgendwelche Klammern weggelassen, die in der Datei in Wirklichkeit stehen? Hast Du kopiert, abgeschrieben oder vereinfacht?
Antworten