Seite 1 von 1

txt-Datei - einzelne Daten auslesen

Verfasst: Mittwoch 30. Dezember 2020, 22:15
von flyingIT
Hallo zusammen,

ich habe eine txt-Datei wo die Zeilen wie folgt aussehen:

22400357.674600 2 0DF8052Cx Rx d 8 02 2C 07 F0 21 00 E2 69

Das ganze ist nur getrennt durch Leerzeichen, ich weiß, sehr doof, habe es aber auch so bekommen.
Ich brauche aus der gesamten Länge der txt-Datei aus jeder Zeile die erste Information (hier im Beispiel: 22400357.674600 ) die dritte Information (hier: 0DF8052Cx) und die Information als letztes ohne das d und die 8, also: 02 2C 07 F0 21 00 E2 69.
Diese ganzen Informationen müsste ich jetzt auslesen aus der Datei, aber ich finde so nichts konkretes für diese Einzelfälle, ihr müsst mir auch nicht direkt den Code schreiben, ein hilfreicher Link o.ä würde schon reichen, vielleicht habe ich ja einfach nicht gut genug recherchiert.
Am besten sollen diese Informationen dann gespeichert werden, denn zum einen muss ich bei der 1. Information immer etwas berechnen, lautet z.B. in Zeile 46 die Information 1: 22400357.685200 und in der nächsten Zeile: 22400357.685700, so muss ich das zweite mit der vorherigen subtrahieren und speichern. Genauso muss ich bei der dritten Information Information an der ersten Stelle das 0 weg und an der letzten das x, sodass nur noch hier übrig bleiben würde: DF8052C, auch muss ich bei der letzten Information die Leerzeichen dazwischen wegkriegen, insofern das möglich ist. Vielleicht hat ja jemand ein paar Tipps oder so für mich.

Vielen Dank im Voraus!

P.S. die Information Nr. 2 hier mit der 2, die 4. Information hier mit Rx und dieses einzelne d und die 8 brauche ich nicht

Re: txt-Datei - einzelne Daten auslesen

Verfasst: Mittwoch 30. Dezember 2020, 23:19
von __blackjack__
@flyingIT: Die Informationen reichen nicht ganz aus. Am Ende der Daten, woher weiss man denn was/wie viel dort dazu gehört? Sind das immer 8 durch Leerzeichen getrennte Werte, oder kann die Anzahl variieren? Sind davor immer drei Werte die ignoriert werden?

Was bedeutet das denn alles?

Re: txt-Datei - einzelne Daten auslesen

Verfasst: Mittwoch 30. Dezember 2020, 23:44
von flyingIT
@__blackjack__ :
Genau, also das sind immer 8 durch Leerzeichen getrennte Werte, die Anzahl kann nicht variieren, nur die Buchstaben/Zahlen an sich, hier mal ein etwas größerer Ausschnitt mit 5 Zeilen:
22400356.658800 2 09F8032Cx Rx d 8 7E 00 58 00 00 BD FF FF
22400356.662100 2 0DF8092Cx Rx d 8 87 45 F0 4E B5 24 00 00
22400356.663100 2 0CCBFFF7x Rx d 8 FE FF FF FF 01 00 00 00
22400356.664200 2 0DF8052Cx Rx d 8 E0 2B 7F 87 45 F0 4E B5
22400356.665200 2 0CCBF7F0x Rx d 8 FF FF FF FF 01 00 00 00

Und die drei Werte davor werden einfach ignoriert, also "Rx", "d" und "8".

Also zur kurzen Erklärung, das sind ausgelesene Daten von einem CAN-Bus, ich hoffe dass dir das dies ein Begriff ist. Die erste Information ist die Zeit, deswegen muss auch diese einmal berechnet werden mit der vorherigen, damit man den Zeitunterschied hat. Ich glaub die zweite Zahl war was internes vom Bus, wie gesagt, ist auch unwichtig. Die dritte Information ist die CAN-ID und das dahinter ist der Betrieb des Can-Buses usw. die letzten 8 Stellen mit je 2 Zeichen ist meine 7. Information, eine CAN-Bus Nachricht in Hexadezimal. Und ich würde halt gerne die 1., 3. und 7. Information rauslesen (wie bereits oben beschrieben bearbeiten/etwas berechnen) und dann halt Speichern damit ich sie nochmal auf einen CAN-Bus schicken kann, dafür brauche ich halt aus jeder Zeile diese 3 Werte und muss auch Zeile für Zeile sozusagen speichern da sich diese 3 Informationen ja auch immer ändern.

Ich hoffe ich habe mich so verständlich erklärt, ich bin leider nicht besonders gut darin

Re: txt-Datei - einzelne Daten auslesen

Verfasst: Donnerstag 31. Dezember 2020, 00:16
von __blackjack__
Das sind eigentlich alles Grundoperationen.

Code: Alles auswählen

#!/usr/bin/env python3
from collections import namedtuple

from prettyprinter import cpprint

LINES = """\
22400356.658800 2 09F8032Cx Rx d 8 7E 00 58 00 00 BD FF FF
22400356.662100 2 0DF8092Cx Rx d 8 87 45 F0 4E B5 24 00 00
22400356.663100 2 0CCBFFF7x Rx d 8 FE FF FF FF 01 00 00 00
22400356.664200 2 0DF8052Cx Rx d 8 E0 2B 7F 87 45 F0 4E B5
22400356.665200 2 0CCBF7F0x Rx d 8 FF FF FF FF 01 00 00 00
""".splitlines()


LogEntry = namedtuple("LogEntry", "timestamp can_id message")


def parse_line(line):
    parts = line.split()
    return LogEntry(
        float(parts[0]), parts[2][:-1], bytes.fromhex("".join(parts[-8:]))
    )


def main():
    cpprint(list(map(parse_line, LINES)))


if __name__ == "__main__":
    main()
Ausgabe:

Code: Alles auswählen

[
    LogEntry(
        timestamp=22400356.6588,
        can_id='09F8032C',
        message=b'~\x00X\x00\x00\xbd\xff\xff'
    ),
    LogEntry(
        timestamp=22400356.6621,
        can_id='0DF8092C',
        message=b'\x87E\xf0N\xb5$\x00\x00'
    ),
    LogEntry(
        timestamp=22400356.6631,
        can_id='0CCBFFF7',
        message=b'\xfe\xff\xff\xff\x01\x00\x00\x00'
    ),
    LogEntry(
        timestamp=22400356.6642,
        can_id='0DF8052C',
        message=b'\xe0+\x7f\x87E\xf0N\xb5'
    ),
    LogEntry(
        timestamp=22400356.6652,
        can_id='0CCBF7F0',
        message=b'\xff\xff\xff\xff\x01\x00\x00\x00'
    )
]

Re: txt-Datei - einzelne Daten auslesen

Verfasst: Donnerstag 31. Dezember 2020, 16:34
von flyingIT
@__blackjack__
Ein riesen Dank auf jeden Fall schon Mal, das hilft mir mega weiter.
Eine Frage hätte ich speziell zu deinem Programm, z.B. schreibst du einmal message=b'\xe0+\x7f\x87E\xf0N\xb5'
obwohl die Nachricht ja lautet E0 2B 7F 87 45 F0 4E B5, hast du dich da einfach mal vertippt und was ausgelassen? Weil das ist des Öfteren, da stehen dann extra Buchstaben, ein Teil der Nachricht fehlt o.ä

Ich hätte nun noch ein paar generelle Fragen, zum einen du hast ja nur diese 5 Beispielzeilen genommen und gesplittet, wie schaffe ich das mit der ganzen Textdatei (diese hat mehr als 60000 Zeilen, die kann ich wohl schlecht alle einzeln einlesen) mache ich das mit open und dem Namen der Textdatei? Dann müsste ich das ja unten mit dem LogEntry auch verallgemeinern, kann ich ja auch nicht für jede Zeile machen. Ich müsste es dann so verallgemeinern dass halt das x bei der CAN-ID weggelassen wird, die Message wie halt schon gemacht die Leerzeichen dazwischen wegkommen und müsste dann den timestamp berechnen..huihuihui, ich weiß was ich zu tun habe im neuen Jahr, ich hoffe ich schaffe das alles, denn ich finde nie einen guten Ansatz

Danke dir auf jeden Fall!

Re: txt-Datei - einzelne Daten auslesen

Verfasst: Donnerstag 31. Dezember 2020, 16:46
von __blackjack__
@flyingIT: Das habe nicht ich geschrieben, das ist die Darstellung eines `bytes`-Objekts. Ich habe die Nachricht halt in das umgewandelt was sie eigentlich ist: eine Sequenz von Bytes. Da stehen auch keine extra Buchstaben und da fehlt auch nichts. 0x2B ist der ASCII-Wert für "+", 0x45 für "E", und 0x4E für "N". Die `repr()`-Darstellung von `bytes`-Objekten stellt Werte für druckbare ASCII-Zeichen als solche dar.

Ich wende die Funktion mit `map()` auf jede Zeile an. Das zweite Argument von `map()` muss ein iterierbares Objekt sein das Zeilen liefert. Ob das nun eine Liste ist, oder eine offene Textdatei, ist `map()` egal. Solange halt Zeichenketten geliefert werden.