Seite 4 von 4
Re: xml und asc Files miteinander abgleichen
Verfasst: Dienstag 20. August 2019, 11:20
von __blackjack__
@JohannX: Die letzte Frage kannst Du ganz einfach selbst beantworten in dem Du es ausprobierst. Ich vermute da ist ein Fehler drin, aber mir ist das zu lang und verworren um das jetzt wirklich durch anschauen nachprüfen zu wollen. Das sollte man vielleicht nicht als *einen* Ausdruck schreiben, denn Du hast da auch nicht wirklich einen Schritt draus gemacht, sondern nur zwei Schritte in eine zu lange Zeile gequetscht.
Re: xml und asc Files miteinander abgleichen
Verfasst: Dienstag 20. August 2019, 11:49
von JohannX
Ich hab´s dann hinbekommen
Code: Alles auswählen
df_Error1 = self.df_all[self.df_all["ID"] == self.ui.error_Base_1.text()]
df_Error1_1 = df_Error1[df_Error1["DATA H"] == self.ui.error_flt_1.text()]
time_Error1 = df_Error1_1["Offset[s]"]
values_Error1 = df_Error1_1["DATA L"]
name_Error1 = self.ui.error_Name_1.text() + " - " + self.ui.error_Base_1.text() + ":" + self.ui.error_flt_1.text()
self.fig.add_trace(go.Scatter(x = time_Error1, y = values_Error1, mode = "markers", name = name_Error1), secondary_y = True)
Re: xml und asc Files miteinander abgleichen
Verfasst: Dienstag 20. August 2019, 14:15
von Sirius3
Jetzt noch die nichtssagenden Einsen an der Variablennamen durch was sinnstiftendes ersetzen und statt +-Gestückel Stringformatierung benutzen.
Re: xml und asc Files miteinander abgleichen
Verfasst: Dienstag 20. August 2019, 15:38
von JohannX
Sirius3 hat geschrieben: Dienstag 20. August 2019, 14:15
Jetzt noch die nichtssagenden Einsen an der Variablennamen durch was sinnstiftendes ersetzen und statt +-Gestückel Stringformatierung benutzen.
Das werde ich alles noch machen, auch muss ich noch Kommentare schreiben damit sich die nach mir auskennen was da gemacht wird, bin nur mehr diese Woche hier als Praktikant.
2 Wünsche hat der Kollege noch geäußert, er möchte die Error´s als hex Wert haben.
Laut Internet Recherche geht das mit hex()
Aber hier kommt die Fehlermeldung
Code: Alles auswählen
Traceback (most recent call last):
File "ascFileReader.py", line 268, in export
values_Error1 = hex(df_Error1_1["DATA L"])
TypeError: 'Series' object cannot be interpreted as an integer
Alternativ könnte man auch vorher eine extra Variable erstellen wo der hex Wert nicht in dec umgewandelt wird
Code: Alles auswählen
with open(self.file_asc) as file: # Filtert alle ErrorFrames heraus, welche in der asc File befinden
buffer = StringIO('\n'.join(line.rstrip(';\n') for line in file if not line.startswith('ErrorFrames')))
self.df_all = pd.read_csv(buffer, sep = ";", skiprows = 5, skipinitialspace = True, converters = {'DATA L': partial(int, base = 16)})
self.df_all_hex = pd.read_csv(buffer, sep = ";", skiprows = 5, skipinitialspace = True)
df_Error1 = self.df_all_hex[self.df_all_hex["ID"] == self.ui.error_Base_1.text()]
df_Error1_1 = df_Error1[df_Error1["DATA H"] == self.ui.error_flt_1.text()]
time_Error1 = df_Error1_1["Offset[s]"]
values_Error1 = df_Error1_1["DATA L"]
name_Error1 = self.ui.error_Name_1.text() + " - " + self.ui.error_Base_1.text() + ":" + self.ui.error_flt_1.text()
self.fig.add_trace(go.Scatter(x = time_Error1, y = values_Error1, mode = "markers", name = name_Error1), secondary_y = True)
Jedoch mag das auch nicht so recht
Code: Alles auswählen
Traceback (most recent call last):
File "ascFileReader.py", line 122, in export
self.df_all_hex = pd.read_csv(buffer, sep = ";", skiprows = 5, skipinitialspace = True)
File "C:\Python3\lib\site-packages\pandas\io\parsers.py", line 685, in parser_f
return _read(filepath_or_buffer, kwds)
File "C:\Python3\lib\site-packages\pandas\io\parsers.py", line 457, in _read
parser = TextFileReader(fp_or_buf, **kwds)
File "C:\Python3\lib\site-packages\pandas\io\parsers.py", line 895, in __init__
self._make_engine(self.engine)
File "C:\Python3\lib\site-packages\pandas\io\parsers.py", line 1135, in _make_engine
self._engine = CParserWrapper(self.f, **self.options)
File "C:\Python3\lib\site-packages\pandas\io\parsers.py", line 1906, in __init__
self._reader = parsers.TextReader(src, **kwds)
File "pandas\_libs\parsers.pyx", line 543, in pandas._libs.parsers.TextReader.__cinit__
pandas.errors.EmptyDataError: No columns to parse from file
Re: xml und asc Files miteinander abgleichen
Verfasst: Dienstag 20. August 2019, 16:19
von __blackjack__
Man könnte die auch gar nicht erst in Zahlen umwandeln dann braucht man sie später nicht zurückwandeln.
Re: xml und asc Files miteinander abgleichen
Verfasst: Mittwoch 21. August 2019, 10:27
von JohannX
Anscheinend funktioniert das so nicht ganz mit plotly, auch wenn ich einen hex wert erhalte, zeigt mir Plotly dies immer als dec an
Aber dies ist eher ein nice-to-have
Re: xml und asc Files miteinander abgleichen
Verfasst: Mittwoch 21. August 2019, 11:35
von JohannX
Eines habe ich noch und dann wars das.
Es werden die ErrorFrames herausgefiltert, jetzt ist es noch erwünscht, diese seperat mit plotly auszugeben.
Code: Alles auswählen
with open(self.file_asc) as file: # Filtert alle ErrorFrames heraus, welche in der asc File befinden
buffer = StringIO('\n'.join(line.rstrip(';\n') for line in file if not line.startswith('ErrorFrames')))
Das problem ist nur die Zeit
Code: Alles auswählen
27.03.2019;17:18:26;000000470.243600;1100001x;800A6AD0;00000010;
ErrorFrames: 0 4702439 1 0 0 1
27.03.2019;17:18:26;000000470.243900;10008x;00000000;00000000;
27.03.2019;17:18:26;000000470.246200;DD00011x;8002019E;00000088;
ErrorFrames: 0 4702644 1 0 0 2
27.03.2019;17:18:26;000000470.264400;20008x;00000000;00000000;
Bei den Errorframes ist die Zeit quasi nach dem nuller, "4702439" dies sind jedoch ms und keine sekunden.
Re: xml und asc Files miteinander abgleichen
Verfasst: Mittwoch 21. August 2019, 14:47
von JohannX
Hab´s soweit getestet
Code: Alles auswählen
with open(self.file_asc) as file_errorframes:
buffer_errorframes = StringIO('\n'.join(line.rstrip(';\n') for line in file_errorframes if line.startswith('ErrorFrames')))
df_all_errorframes = pd.read_csv(buffer_errorframes)
print(df_all_errorframes.head())
Was hierbei rauskommt ist
Code: Alles auswählen
ErrorFrames: 0 4702439 1 0 0 1
0 ErrorFrames: 0 4702644 1 0 0 2
1 ErrorFrames: 0 4733128 1 0 0 3
2 ErrorFrames: 0 4749315 1 0 0 4
3 ErrorFrames: 0 4803094 1 0 0 5
4 ErrorFrames: 0 4831065 1 0 0 6
Wobei anscheinend die erste Zeile als Überschrift dient, jedoch benötige ich auch diese Zeile.
Hat jemand eine Idee?
Re: xml und asc Files miteinander abgleichen
Verfasst: Mittwoch 21. August 2019, 15:15
von Sirius3
@JohannX: hast Du schon die Dokumentation zu pd.read_csv gelesen?
Re: xml und asc Files miteinander abgleichen
Verfasst: Mittwoch 21. August 2019, 15:48
von snafu
Eigentlich braucht man die ganze Vorarbeit nicht, wenn man pandas richtig benutzt:
Code: Alles auswählen
from io import StringIO
import pandas as pd
TEST_STREAM = StringIO("""\
27.03.2019;17:18:26;000000470.243600;1100001x;800A6AD0;00000010;
ErrorFrames: 0 4702439 1 0 0 1
27.03.2019;17:18:26;000000470.243900;10008x;00000000;00000000;
27.03.2019;17:18:26;000000470.246200;DD00011x;8002019E;00000088;
ErrorFrames: 0 4702644 1 0 0 2
27.03.2019;17:18:26;000000470.264400;20008x;00000000;00000000;""")
def parse_data(stream):
df = pd.read_csv(stream, sep=';', usecols=range(6), header=None)
errors = df[0].str.startswith('ErrorFrames')
return (df[~errors], df[errors])
def main():
ok, errors = parse_data(TEST_STREAM)
print(ok)
print(errors)
if __name__ == '__main__':
main()
Re: xml und asc Files miteinander abgleichen
Verfasst: Mittwoch 21. August 2019, 17:10
von snafu
Und hier werden die Fehler als eigener DataFrame geliefert:
Code: Alles auswählen
from io import StringIO
import pandas as pd
TEST_STREAM = StringIO("""\
27.03.2019;17:18:26;000000470.243600;1100001x;800A6AD0;00000010;
ErrorFrames: 0 4702439 1 0 0 1
27.03.2019;17:18:26;000000470.243900;10008x;00000000;00000000;
27.03.2019;17:18:26;000000470.246200;DD00011x;8002019E;00000088;
ErrorFrames: 0 4702644 1 0 0 2
27.03.2019;17:18:26;000000470.264400;20008x;00000000;00000000;""")
def parse_data(stream):
df = pd.read_csv(stream, sep=';', usecols=range(6), header=None)
is_error = df[0].str.startswith('ErrorFrames')
errors = df[0][is_error].str.split()
return df[~is_error], pd.DataFrame(list(errors))
def main():
df, errors = parse_data(TEST_STREAM)
print(df, errors, sep='\n')
if __name__ == '__main__':
main()
Unschön daran ist, dass man den DataFrame für die Fehler neu bauen muss und dass dabei die Original-Indexwerte futsch sind. Das geht bestimmt noch besser...
Re: xml und asc Files miteinander abgleichen
Verfasst: Mittwoch 21. August 2019, 18:44
von snafu
Nochmal überarbeitet mit Spaltennamen (soweit ich diese herleiten konnte) und ein paar Verbesserungen für die Fehler-Frames. Sie haben jetzt den Original-Index. Zu beachten ist allerdings, dass sich die Spalten unterschieden.
Code: Alles auswählen
from io import StringIO
import pandas as pd
HEADINGS = ['Datum', 'Zeit', 'Dauer', 'A', 'B', 'C', 'D']
TEST_STREAM = StringIO("""\
27.03.2019;17:18:26;000000470.243600;1100001x;800A6AD0;00000010;
ErrorFrames: 0 4702439 1 0 0 1
27.03.2019;17:18:26;000000470.243900;10008x;00000000;00000000;
27.03.2019;17:18:26;000000470.246200;DD00011x;8002019E;00000088;
ErrorFrames: 0 4702644 1 0 0 2
27.03.2019;17:18:26;000000470.264400;20008x;00000000;00000000;""")
def parse_data(stream):
df = pd.read_csv(stream, sep=';', usecols=range(6), names=HEADINGS[:-1])
is_error = df.Datum.str.startswith('Error')
errors = df.Datum[is_error].str.split(expand=True)
errors.columns = HEADINGS
errors = errors.drop(columns=['Datum']).astype(int)
errors.Dauer = errors.Dauer.astype(float) / 1000
return (df[~is_error], errors)
def main():
df, errors = parse_data(TEST_STREAM)
print(df, errors, sep='\n')
if __name__ == '__main__':
main()
Re: xml und asc Files miteinander abgleichen
Verfasst: Donnerstag 22. August 2019, 10:12
von JohannX
Super Danke dir snafu!
Habs gestern eh auch selber hinbekommen, aber mit deinem Code sieht es besser aus
Das Projekt funktioniert jetzt soweit, Variablennamen wurden noch korrigiert usw...
Wurde als .exe via pyinstaller exportiert und läuft Fehlerfrei.
Ich danke für die Großartige Unterstützung hier
Mache mich nun auf das letzte Projekt, ob ich Fertig werde oder nicht ist egal. Was ich alles schaffen konnte werde ich morgen weitergeben