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

String in 1x2924 char finden und nachf. Zahlenwert entnehmen

 

JaSoIstEs
Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 11.12.2018, 15:05     Titel: String in 1x2924 char finden und nachf. Zahlenwert entnehmen
  Antworten mit Zitat      
Hallo Leute,

bekomme aus einem Yokogawa-Gerät eine Datei erzeugt die ich dann mittels XViewer in eine Mat-Datei umwandle.
Hier hab ich eine Variable (char) die etliche Informationen beinhaltet die ich benötige.
Lieder ist das eine 1x2924 char variable.

Wie schaffe ich es jetzt dort Effektiv nach z.B. dem Schlüsselwort "BlockSize" zu suchen und den nachfolgenden Zahlen Wert mir zu entnehmen.

Das ganze sieht ungefähr so aus (das steht jetzt irgendwo in diesem 1x2924 char):

… "BlockSize" ,5005000 …


Die Variablennamen (z.B. "BlockSize") sind Fix nur die Länge/Größe der Zahl kann variieren.


Jetzt würde ich nach dem Schlüsselwort "BlockSize" suchen:


Code:
idx = strfind(WaveInfo,'BlockSize')


erhalte dann den Wert 428 und könnte quasi diesen Wert + Anzahl der Leerzeichen + Länge der Zahl mir den Wert irgendwie rausschneiden. Aber das müsste ja dynamischer und eleganter gehen... . =)

Ich hoffe ihr könnt mir weiterhelfen.

Danke euch im Voraus.

_____________________________________________

Edit:

mit

Code:
[startIndex,endIndex] = regexp(WaveInfo,"BlockSize")


Bekomme ich Anfang und Ende des gesuchten Schlüsselwortes..

Ausgabe_1_2942_char.png
 Beschreibung:
Ausgabe der Beschriebenen Variable (1x2924 char)

Download
 Dateiname:  Ausgabe_1_2942_char.png
 Dateigröße:  24.36 KB
 Heruntergeladen:  202 mal
Private Nachricht senden Benutzer-Profile anzeigen


JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 12.12.2018, 10:17     Titel:
  Antworten mit Zitat      
Meine Momentane Lösung für das oben beschriebene Problem:

Code:
p(1) = strfind(WaveInfo,'TraceName');
p(2) = strfind(WaveInfo,'BlockSize');
p(3) = strfind(WaveInfo,'VUnit');
p(4) = strfind(WaveInfo,'SampleRate');
p(5) = strfind(WaveInfo,'HResolution');
p(6) = strfind(WaveInfo, 'HOffset');
p(7) = strfind(WaveInfo, 'HUnit');
p(8) = strfind(WaveInfo, 'DisplayPointNo.');
c(:,1) = strsplit(WaveInfo(p(1)-1:p(2)-2),',');
c(:,2) = strsplit(WaveInfo(p(2)-1:p(3)-2),',');
c(:,3) = strsplit(WaveInfo(p(3)-1:p(4)-2),',');
c(:,4) = strsplit(WaveInfo(p(4)-1:p(5)-2),',');
c(:,5) = strsplit(WaveInfo(p(4)-1:p(5)-2),',');
c(:,6) = strsplit(WaveInfo(p(5)-1:p(6)-2),',');
c(:,7) = strsplit(WaveInfo(p(6)-1:p(7)-2),',');
c(:,8) = strsplit(WaveInfo(p(7)-1:p(8)-2),',');

BlockSize = str2double(c{2,2});
SampleRate = str2double(c{2,4});
HResoltion = str2double(c{2,6});
HOffset = str2double(c{2,7});



Das sollte aber eleganter und besser gehen.

Falls jemand einen Vorschlag hat, bitte mitteilen.

Danke
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.12.2018, 22:16     Titel:
  Antworten mit Zitat      
Hallo JaSoIstEs,

Ein kleines Beispiel als Text wäre hilfreicher als der Screenshot.

Wie wäre dies:
Code:
function S = GetVariables(Str)
% Input: C: char vector containing the string
CStr = strsplit(Str, char(10));  % split at linebreaks  % BUGFIX: "C" -> "Str"
S = struct([]);
for k = 1:numel(CStr)
  C = CStr{k};
  comma = strfind(C, ',');
  key = C(1:comma(1) - 1);
  key(key == ' ' | key == '"') = [];
  if C(comma(1) + 1) == '"'
    data = strsplit(C(comma(1) + 1:end), ',');
    data = strtrim(strrep(data, '"', ''));   % remove quotes and spaces
  else
    data = sscanf(C(comma(1) + 1:end), '%g,', Inf);
  end
  S.(key) = data;
end

Nun werden die Variablen als Felder eines Structs zurückgegeben.

Gruß, Jan

Zuletzt bearbeitet von Jan S am 17.12.2018, 14:15, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 14.12.2018, 11:00     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für deine Antwort.

Das ist mir jetzt ein wenig peinlich und ich weiß nicht ob ich noch nicht ganz Wach bin... Aber... irgendetwas läuft bei mir nicht richtig.

Wenn ich die Funktion in mein Skript einpflege und diese wie folgt aufrufe:

Code:

MyStruct = GetVariables(WaveInfo);
 

(WaveInfo ist der 1x2924 char)

erhalte ich die Fehlermeldung:

Undefined function or variable 'C'.

Error in Untitled>GetVariables (line 15)
CStr = strsplit(C, char(10)); % split at linebreaks


Habe dann deinen Code wie folgt geändert (Input ist hier C und nicht mehr Str):

Code:
function S = GetVariables(C)
% Input: C: char vector containing the string
CStr = strsplit(C, char(10));  % split at linebreaks
S = struct([]);
for k = 1:numel(CStr)
    C = CStr{k};
    comma = strfind(C, ',');
    key = C(1:comma(1) - 1);
    key(key == ' ' | key == '"') = [];
    if C(comma(1) + 1) == '"'
        data = strsplit(C(comma(1) + 1:end), ',');
        data = strtrim(strrep(data, '"', ''));   % remove quotes and spaces
    else
        data = sscanf(C(comma(1) + 1:end), '%g,', Inf);
    end
    S.(key) = data;
end
end


So erhalte ich aber dann den Fehler:

A dot name structure assignment is illegal when the structure is empty. Use a subscript on the structure.

Error in Untitled>GetVariables (line 2Cool
S.(key) = data;



Kannst du mir kurz auf die Sprünge helfen?


Kann ich gerne machen.
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 14.12.2018, 11:22     Titel:
  Antworten mit Zitat      
So hab ein wenig ausprobiert und den Code wie folgt abgeändert:

Die 4. Zeile habe ich auskommentiert. Das hat anscheinend Probleme verursacht.

Code:
function S = GetVariables(C)
% Input: C: char vector containing the string
CStr = strsplit(C, char(10));  % split at linebreaks
% S = struct([]);
for k = 1:numel(CStr)
    C = CStr{k};
    comma = strfind(C, ',');
    key = C(1:comma(1) - 1);
    key(key == ' ' | key == '"') = [];
    if C(comma(1) + 1) == '"'
        data = strsplit(C(comma(1) + 1:end), ',');
        data = strtrim(strrep(data, '"', ''));   % remove quotes and spaces
    else
        data = sscanf(C(comma(1) + 1:end), '%g,', Inf);
    end
    S.(key) = data;
end
end


Invalid field name: 'DisplayPointNo.'.

Error in Untitled>GetVariables (line 29)
S.(key) = data;


Nun läuft es bis zu dem Punkt bis ein Feld den Namen 'DisplayPointNo. ' hat. Anscheinend mag er den Punkt nicht. Kann man das umgehen?
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 14.12.2018, 11:36     Titel:
  Antworten mit Zitat      
So jetzt funktioniert es:

Hab folgende Zeile noch eingefügt:

Code:
key = strrep(key,'.',' ');


Code:
function S = GetVariables(C)
% Input: C: char vector containing the string
CStr = strsplit(C, char(10));  % split at linebreaks
%S = struct([]);
for k = 1:numel(CStr)
    C = CStr{k};
    comma = strfind(C, ',');
    key = C(1:comma(1) - 1);
    key = strrep(key,'.',' ');
    key(key == ' ' | key == '"') = [];
    if C(comma(1) + 1) == '"'
        data = strsplit(C(comma(1) + 1:end), ',');
        data = strtrim(strrep(data, '"', ''));   % remove quotes and spaces
    else
        data = sscanf(C(comma(1) + 1:end), '%g,', Inf);
    end
    S.(key) = data;
end
end


Danke dir vielmals.
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 14.12.2018, 15:26     Titel:
  Antworten mit Zitat      
Misst... . Jetzt habe ich einen Fall wo das nicht so "einfach" aufgeht.
Wie würdest du denn deinen Code umschreiben wenn ich immer alle Werte mitnehmen sprich die gesamte Zeile zu dem jeweiligen key.
In deinem jetzigen Code wird das nur bei TraceName, VUnit, HUnit, Date und Time gemacht.
Aber wo im Code muss ich das verändern das er das auch für den Rest macht wo "nur" Zaheln vorhanden sind und mir da auch ein Cell aufbaut.
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: 17.12.2018, 14:21     Titel:
  Antworten mit Zitat      
Hallo JaSoIstEs,

Zitat:
Aber wo im Code muss ich das verändern das er das auch für den Rest macht wo "nur" Zaheln vorhanden sind und mir da auch ein Cell aufbaut.

Benutze den Debugger um Zeile für Zeile durch den Code zu gehen. Dann findest Du genau heraus, wo was geschieht.
Da ich Deine Inputs nicht habe (bzw. nur als Screenshot), kann ich den Code nicht selbst laufen lassen. Deshalb kommt es dann auch vor, dass da noch Tippfehler verbleiben.

Eigentlich dachte ich, dass:
Code:
sscanf(C(comma(1) + 1:end), '%g,', Inf)

die ganze Zeile einlesen würde. Falls es das nicht macht, probiere:
Code:
sscanf(C(comma(1) + 1:end), ' %g, ', Inf)

mit Leerzeichen. Oder entferne die Leerzeichen zunächst:
Code:
C =C(comma(1) + 1:end);
C(C == ' ') = [];

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

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 07.01.2019, 10:50     Titel:
  Antworten mit Zitat      
Hallo,

ein frohes neues Jahr wünsche ich dir/euch.

Sieht jetzt bei mir so aus und macht auf dem ersten Blick das was es machen soll:

Code:
function S = GetVariables(C)
% Input: C: char vector containing the string
CStr = strsplit(C, char(10));  % split at linebreaks
%S = struct([]);
for k = 1:numel(CStr)
    C = CStr{k};
    comma = strfind(C, ',');
    key = C(1:comma(1) - 1);
    key = strrep(key,'.',' ');
    key(key == ' ' | key == '"') = [];
    if C(comma(1) + 1) == '"'
        data = strsplit(C(comma(1) + 1:end), ',');
        data = strtrim(strrep(data, '"', ''));   % remove quotes and spaces
    else
        %data = sscanf(C(comma(1) + 1:end), '%g,', Inf);
        data = strsplit(C(comma(1) + 1:end), ',');
    end
    S.(key) = data;
end
end
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 - 2024 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.