WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Formatiertes einlesen einer Datei

 

AkkiAkk
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 11.04.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2016, 19:36     Titel: Formatiertes einlesen einer Datei
  Antworten mit Zitat      
Hallo,
ich habe folgendes Problem, für das ich in der Suche noch keine zufriedenstellend Antwort gefunden habe.

Ich habe eine .txt-Datei mit (hex-) Daten in folgender Form:

01 8C 00 80 BB BB 0F FF 0F FF [...]

Ich möchte daraus zwei Vektoren generieren und die Zeichenfolge BB BB ignorieren bzw. als Trennzeichen benutzen. Am Ende sollen zwei Vektoren A und B rauskommen, sodass:

A = [018C 0080]
B = [0FFF 0FFF]

Es gehören also immer vier Zeichen zusammen, nur jedes zweite Leerzeiche ist sozusagen eine wirkliche Trennung.
Mit textscan und fscanf habe ich das noch nicht hinbekommen. Hat jemand eine konstruktive Idee wie man das Problem bewältigen könnte?
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 11.04.2016, 20:31     Titel:
  Antworten mit Zitat      
Zitat:
Mit textscan und fscanf habe ich das noch nicht hinbekommen.

was hast du denn versucht und was hat dabei nicht geklappt ?
sihe dazu auch den thread aus meiner signatur
grüße winkow
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.04.2016, 21:19     Titel: Re: Formatiertes einlesen einer Datei
  Antworten mit Zitat      
Hallo AkkiAkk,

Zitat:
Ich habe eine .txt-Datei mit (hex-) Daten in folgender Form:
01 8C 00 80 BB BB 0F FF 0F FF [...]

Wenn ich Dich richtig verstehe, sind die keine hex-Daten, sondern CHARs, also ganz normaler Text. Richtig? Für die Einlese-Routine ist es erstmal vollkommen egal, ob da "01 8C" oder "TZ Uv" steht, oder?

Was soll nun genau "A = [018C 0080]" sein? Ein String in der Form '018C 0080' mit einem Leerzeichen in der Mitte? Oder eine CHAR-Matrix:
Code:
A = ['018C'; '0080']

Oder ein Cell-String
Code:
A = {'018C', '0080'}


Was genau verbirgt sich hinter "[...]"? Spielt der folgende Inhalt eine Rolle oder nicht?

Am besten wäre es, Du postet ein Beispiel File und den gewünschten Output in valider Matlab-Syntax.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
AkkiAkk
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 11.04.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2016, 22:40     Titel:
  Antworten mit Zitat      
Vielen Dank für die schnellen Antworten und entschuldigung wenn ich mich vielleicht etwas unklar ausgedrückt habe.

Ein exemplarisches File könnte folgenderweise aussehen (in der Realität mit viel mehr Elementen):

01 8C 00 80 BB BB 00 BF 0F 56 BB BB 05 7B 0C 30 BB BB 09 28 F0 14 BB BB 2A 65 01 8C BB BB 09 7C 0A B3

Nun ist es so, dass dies hex-Zahlen sind (wichtig, da ich die Daten noch plotten möchte). Von den Daten gehören immer zwei byte zusammen, also vier "Ziffern" (Bsp.: 018C ist eine Zahl. Oder 0080).

Die vier aufeinanderfolgenden Bs dienen dabei als Trennzeichen für zwei verschiedene Kanäle.
Es kommen erst Daten von Kanal 1, dann Trennzeichen BB BB, dann Daten von Kanal 2, dann BB BB, dann Daten von Kanal 1, dann BB BB, dann Kanal 2 usw.

Im Prinzip will ich am Ende zwei Vektoren (ob Spalte oder Zeile ist egal), einen für die Daten von Kanal 1 und einen für Kanal 2:

Kanal1 = [ 018C, 0080, 057B, 0C30, 2A65, 018C ]
Kanal2 = [ 00BF, 0F56, 0928, F014, 097C, 0AB3 ]

Bei textscan weiß ich nicht, wie ich die zusammenhängenden bytes aneinanderreihen kann. Also wie ich z.B. aus 01 8C ein 018C mache und dann das nächste Leerzeichen als Trennstelle nehme. Irgendwie muss ich ja jedes zweite Leerzeichen übergehen um aus 01 8C 00 80 zum machen
018C 0080.

Wenn ich schreibe
Code:
data = textscan(fileID,'%s %s');


dann würde ja jedes byte abwechselnd in den einen und den anderen Vektor geschrieben werden, ich mächste ja aber die erst beiden byte in einen, die beiden danach in einen anderen, dann Trennzeichen BB BB ignorieren und so weiter.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.04.2016, 09:03     Titel:
  Antworten mit Zitat      
Hallo AkkiAkk,

Ich stelle meine Frage nochmal:
Verstehe ich es richtig, dass das die Ausgabe des Files in einem Text-Editor ist:
Code:
01 8C 00 80 BB BB 00 BF 0F 56 BB BB 05 7B 0C 30 BB BB 09 28 F0 14 BB BB 2A 65 01 8C BB BB 09 7C 0A B3

?

Zitat:
Kanal1 = [ 018C, 0080, 057B, 0C30, 2A65, 018C ]
Kanal2 = [ 00BF, 0F56, 0928, F014, 097C, 0AB3 ]

Dies ist nach wie vor nicht klar. Bitte gebe diese Zeilen doch mal im Command-Window ein. Dies wird Dir eine Fehlermeldung geben, weil es keine valide Matlab-Syntax ist.
Wenn es Strings sein sollen, müssen sie in Quotes eingeschlossen werden. Dann ist A = ['018C', '0080'] aber das gleiche wie A = '018C0080' . Plotten kannst Du aber nur Zahlen. Wozu dient dann überhaupt die HEX-Darstellung, die ja aus CHAR-Strings besteht?

Wahrscheinlich lässt sich das schnell lösen, aber es ist zunächst notwendig zu klären, welche Outputs Du überhaupt brauchst.
Ich rate mal:
Code:
Data = fileread(FileName);
Data(Data < char(32)) = [];  % Remove line breaks
if strncmp(Data(end-5:end), 'BB BB') == 0
  Data = [Data, ' BB BB'];  % Care for final separator
end
Value = sscanf(Data, '%.2x %.2x %.2x %.2x BB BB');

Jetzt hast Du einen Vektor mit den einzelnen Bytes. Wie Du daraus die gewünschten Zahlen machst, hängt von der Definition des File-Formats ab.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.