Forum: PC-Programmierung Datei parsen bzw. lesbar machen


von Eric (Gast)


Lesenswert?

Hallo,

ich habe eine Datei mit Messwerten vorliegen, die ich gerne in Excel 
weiterverarbeiten möchte. Leider liegt die Datei in einem Format vor, 
welches nicht von Excel unterstützt wird, da das Messgerät aus dem sie 
stammt schon etwas älter ist.

Im Handbuch zur Software ist das Format der Datei allerdings 
beschrieben.
Die Datei beginnt mit einem "Formular" welches vom Typ ASCII ist und 
eine Länge von 726(?) aufweist.
Dann folgen Einstellungen ebenfalls in ASCII mit einer Länge von 64. 
Dann folgen die Messwerte für X und Y vom Typ Binär, die Länge ist halt 
abhängig von den Messwerten.

Mir fehlt jetzt ein Ansatz diese Datei so zu zerlegen bzw. lesbar zu 
machen, das ich die X/Y Werte auslesen und in Excel weiterverarbeiten 
kann.

Ich wäre für einen Hinweiß sehr dankbar und bedanke mich im Voraus für 
Eure Tips.

von physiker (Gast)


Lesenswert?

Was für eine Binärdarstellung haben die Zahlen? Sind das Integer oder 
Floats (IEEE...), wie lang? Ansonsten mußt Du auch unter Excel für so 
etwas programmieren:
http://www.vbforums.com/showthread.php?430424-Reading-a-Binary-File-into-Excel-using-VBA

Du weißt ja wieviel Text kommt, abzählen, und ab dann die binary Daten 
passend umwandeln.

von Eric (Gast)


Lesenswert?

Also ich hab jetzt noch mal in der Dateibeschreibung geschaut, da steht 
das die X bzw Y Werte 2Byte lang sind, also 16Bit, das können dann 
sowohl Integer als auch Float Werte sein nehme ich an...aber das bringt 
mich jetzt wohl nicht weiter, oder?
Ich hatte schon die verschiedenen Importmöglichkeiten ausprobiert, aber 
in Excel kann ich auch nicht einstellen das die ersten 780 Zeichen ASCII 
sein sollen und der Rest was anderes, ich muß die Datei also auf jeden 
Fall zerlegen.
Eine Darstellung in ASCII bietet EXCEL bzw. WORD auch nicht an, hab alle 
Formatierungen ausprobiert, aber der Text am Anfang der Datei ist nicht 
lesbar, immer nur "wirre" Zeichen, kein Muster erkennbar.

von Amateur (Gast)


Lesenswert?

Ene, meine, muh...

Oder wie wär's mal mit den ersten 800, ins ASCII-Hex-Format 
konvertierten, Zeichen?

Noch besser, die Datei 1:1 als Anhang.

Muss aber nicht sein, wir können auch raten.

von physiker (Gast)


Lesenswert?

Die Anleitung wäre auch praktisch.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Eric schrieb:
> da steht
> das die X bzw Y Werte 2Byte lang sind, also 16Bit, das können dann
> sowohl Integer als auch Float Werte sein nehme ich an

2-Byte-Werte sind normalerweise Integer- und keine Float-Werte. Letztere
sind üblicherweise mindestens 4 Bytes lang. Prinzipiell sollte man noch
die Bytereihenfolge (also Little- oder Big-Endian) kennen. Wenn die
Datei aber auf einem PC erstellt wurde, kann man praktisch immer von
Little-Endian ausgehen.

von Eric (Gast)


Angehängte Dateien:

Lesenswert?

Das ist natürlich auch eine Möglichkeit :-)
Habe sie mal angehängt.

Aus der Ausgabe im Hexeditor werde ich noch nicht so recht schlau, aber 
seht mal selbst...meine Vorgehensweise wäre es jetzt, die ersten 780 
Zeichen zu entfernen, da spielt es ja keine Rolle was es ist. Danach 
blieben nur noch die Messwerte mit unbekanntem Datentyp übrig.
Die erste Hälfte der Werte sind die X Werte, die 2 Hälfte die Y Werte. 
Jeder Wert ist 2 Byte lang...wäre dies schon mal ein Ansatz?

von Eric (Gast)


Lesenswert?

physiker schrieb:
> Die Anleitung wäre auch praktisch.

Die Anleitung hab ich leider nicht hier, aber mehr als die im Startpost 
beschriebenen Dinge stehen da nicht drin :-(

von Salewski, S. (Gast)


Lesenswert?

Du kannst Dir die Daten z.B. mit Hexdump ansehen, etwa

hexdump -C ../Downloads/Kopie.dat |less

Man erkennt schon eine gewisse Struktur.

Ich würde eher vermuten, dass es ein Header ist, und dann fortlaufend 
die "Y-Werte" als 16 Bit. Bei äquidistanten Werten macht es ja Sinn, die 
"X-Werte" nicht abzuspeichern. Ich könnte Raten, dass der Header 792 
Byte hat, dann könnte man

hexdump --skip 792 -v -e '1/2 "%d\n"' ../Downloads/Kopie.dat

probieren um die nachfolgenden Werte jeweils als zwei Byte nach ASCII zu 
konvertieren. Das sollte dann dein Exel einlesen können. Ich hoffe mal 
dein Rechner hat hexdump, sonst musst Du dich nach einem Linux Rechner 
umsehen.

Und "man hexdump" sagt dir mehr über die Möglichkeiten.

von Blümchenausrupfer (Gast)


Lesenswert?

726 Bytes 0x20

64 Bytes, die nach Hex-als-ASCII aussehen:
20020600000A004004048840404040808000000013A837C7790000FF0F1487D2

8188 Bytes, die offenbar die Messwerte repräsentieren (je 2 Bytes).

Eric schrieb:
> meine Vorgehensweise wäre es jetzt, die ersten 780
> Zeichen zu entfernen, da spielt es ja keine Rolle was es ist.

Würde ich so probieren. Wobei in der Beispieldatei die Headerlänge 
anscheinend 790 Bytes beträgt? In solchen Fällen ist ein Hex-Editor 
recht nützlich.

von physiker (Gast)


Lesenswert?

Wobei nach dem "Konfigurationscode" erstmal von 0 bis 255 hochgezählt 
wird und jede Zahl achtmal vertreten ist. Es wäre gut zu wissen, was bei 
dieser spezifischen Messung so gemessen wurde, falls es auch eine 
Bildschirmanzeige gab.

von physiker (Gast)


Lesenswert?

Korrektur: Wahrscheinlich von 1 an, nicht 0, da die 0 nur dreimal 
vorkommt.

von physiker (Gast)


Angehängte Dateien:

Lesenswert?

Habe es mal mit hexdump printf in acht Spalten formatiert. Würde sagen, 
daß erst ab Offset 130C überhaupt Nutzdaten kommen. Vorher siehst zu 
regelmäßig aus.

von Eric (Gast)


Lesenswert?

Ufff...das sind ja jede Menge Antworten die ich erst mal sortieren muß, 
heute schaffe ich das aber nicht mehr.

Die Messdaten stammen von einem Wirbelstrommessgerät (Bj.93) was als 
Anzeige selbst nur eine Art Oszilloskopbildschirm hat auf dem dann die 
Werte angezeit werden. In sofern ist es schon richtig, das wenn sich die 
Messsonde über die Probe bewegt nur Ausschläge in y Richtung zu sehen 
sind, da die X Richtung ja die Zeit repräsentiert.
In einem Diagramm müßte man sich das so vorstellen, wie Nadelimpulse 
über die Zeit aufgetragen, das ist zumindest das Bild was auf dem 
Bildschirm zu sehen war.

Ich bedanke mich jedenfalls schon mal recht herzlich im Voraus für eure 
tolle Hilfe und werde mal sehen ob ich morgen durch die Antworten 
durchsteige, ansonsten melde ich mich einfach wieder ;-)

von physiker (Gast)


Angehängte Dateien:

Lesenswert?

Dann sieht das schon richtig aus.

von Eric (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
bin erst jetzt dazu gekommen hier wieder reinzuschauen. Ja, das Ergebnis 
vom Physiker sieht sehr gut aus, vielen Dank :-)

Aber mir ist nicht klar, wie ich jetzt aus den 2Byte langen Int-Werten 
etwas verwertbares machen kann, das ich in Excel weiterverarbeiten kann.
Ich benutze als Hex Editor den XVI32, dort habe ich jetzt (durch 
manuelles abzählen) die ersten 780 Byte entfernt und die Datei 
abgespeichert. Jetzt sollten dort ja nur noch die 2 Byte langen Int 
Werte stehen. Wie kann ich diese Daten jetzt weiterverarbeiten, könntest 
du (physiker) oder jemand anders mir das evt. noch mal erklären.

Ich kann mir die Zahlenwerte, wenn ich 2 Bytes markiere als Int Werte 
anzeigen lassen, aber ob die richtig sind, das weiß ich nicht.

Ich habe die Datei um die ASCII Daten erleichterte Datei mal als Anhang 
angefügt, könntet ihr mal schauen ob das bis dahin richtig ist und sie 
nur noch die 2Byte langen INT Werte enthält?

Irgendwie stehe ich gerade auf dem Schlauch und das obwohl ich schon 3 
Kaffee drin habe :-/

von Eric (Gast)


Lesenswert?

Ich hab jetzt noch ein wenig rumprobiert. Das Programm hexdump scheint 
es für Win in dieser Form nicht geben, schade.
Das wäre aber doch alles was ich benötige, oder?
Die Schritte wären dann wie folgt:

Datei im Hex Editor öffnen
Konfigurationsdaten entfernen (780 oder 792 Byte?)
Datei abspeichern
Datei mit einem "Konverter" dem ich sage das es sich um 2Byte Int Werte 
handelt in Text konvertieren.
Text in Excel einlesen und fertig.

Das müßte doch so funktionieren...fehlt mir nur noch ein Programm was 
unter  Windows die Konvertierung einer ganzen Datei von Bin zu txt 
erlaubt.

von Bernd K. (prof7bit)


Lesenswert?

Eric schrieb:
> Aber mir ist nicht klar, wie ich jetzt aus den 2Byte langen Int-Werten
> etwas verwertbares machen kann, das ich in Excel weiterverarbeiten kann.

Du schreibst ein kleines Script das die Originaldatei liest, parst und 
die Werte in eine csv-Datei schreibt. Diese kann man dann mit Excel 
importieren (falls Excel dann überhaupt noch nötig ist).

Vielleicht ist genau jetzt die richtige Zeit für Dich gekommen zu 
erkennen daß Excel zwar oft aber doch bei Weitem nicht immer das 
optimale Werkzeug für eine gegebene Aufgabe ist, daß es 
Aufgabenstellungen wie diese gibt die man mit anderen Werkzeugen viel 
einfacher bewältigen kann.

von physiker (Gast)


Lesenswert?

Das mit dem richtigen Werkzeug für die richtige Aufgabe ist natürlich 
richtig. Die Frage ist was willst Du mit den Daten anstellen? Und wie 
oft willst Du das machen?

Wenn Du das Ding nur graphisch darstellen möchtest, kannst Du es z.B. 
komplett mit Gnuplot erledigen und hast zusätzlich den Vorteil, daß es 
nur ein Einzeiler in einem Skript ist (das zu dem Thema wie oft möchtest 
Du das machen: Du hast einen universell programmierbaren Rechner, willst 
Du tatsächlich ständig irgendwelche Dateien öffnen, bearbeiten, als 
temporäre Dateien anlegen, in Excel öffnen und per Hand immer wieder ein 
Diagramm anlegen, Achsenbeschriftungen machen, skalieren und dann 
speichern? Das kann der Computer viel besser.) Falls Du auf Excel 
bestehst, wäre ein kleines VBA-Skript, wie in dem Link, den ich weiter 
oben gepostet habe, angebracht. Da klickst Du dann drauf, wählst die 
Datei aus, die Datei wird automatisch als binary eingelesen, die ersten 
paar Bytes verworfen und der Rest passend in ein Diagramm gefüttert oder 
in eine Spalte geschrieben.

von physiker (Gast)


Lesenswert?

Ein Beispielkommando für gnuplot:
set title "type of measurement";set xlabel 
"x-physical-quantity[x-unit]";set ylabel 
"y-physical-quantity[y-unit]";plot './Kopie.dat' binary format="%uint16" 
skip=792 using 1 notitle

von physiker (Gast)


Lesenswert?

ohne die Zeilenumbrüche natürlich...

von Eric (Gast)


Lesenswert?

Ich habe jetzt mal das VBA Script ausprobiert, es funktioniert auch 
soweit, daß ich die Daten alle in eine Spalte geschrieben bekomme, die 
Anzahl der Zeilen stimmt auch exakt mit der Dateigröße in Byte 
übereinander. Die ASCII Daten kann ich entfernen indem ich die Zeilen 
lösche so das nur die Messwerte übrig bleiben.

Allerdings sind die Messwerte ja 2 Byte lang und die Funktion "Binary 
Access Read" bietet keinen Parameter an wo ich den Datentyp deklarieren 
kann, sprich wenn ich die Daten in den Zeilen stehen habe, sind sie 
immer Byteweise getrennt.

von physiker (Gast)


Lesenswert?

Hast Du mal probiert
bytTemp As Integer
statt
bytTemp As Byte
zu deklarieren?
Das Abschneiden des ersten Teils schaffst Du auch noch in dem Skript 
unterzubringen, Tipp: Zaehlvariable, jeweils um eins hochzaehlen und 
dann if zaehlvariable<=792 Then Continue While

von physiker (Gast)


Lesenswert?

Bzw. 396 statt 792 als Bedingung, da dann ja 2 Byte weise gelesen wird.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.