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

Parser Problem

 

nero1186
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 01.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2015, 11:34     Titel: Parser Problem
  Antworten mit Zitat      
Hallo Forum,

ich bin Neuling und brauche eure Hilfe. Ich habe das Form schon nach Lösungen durchsucht, aber keine passende Lösung auf meine Frage gefunden. Ich hoffe ihr verzeiht mir, dass ich daher ein neues Topic öffne.

Folgendes Problem habe ich. Ich habe einen Parser geschrieben und suche mit MATLAB einen bestimmten Datenabschnitt. Es gibt mehre von diesen.

[31182] CaimControllerImpl: Received new caim response: CaimResponse of type: DATA. Data: 0601062715b6
[30769] CaimControllerImpl: Received new caim response: CaimResponse of type: DATA. Data: 060183281100a6010215000001000100010001000100010001000004c10161000be4c7821c1ce4052921a6f1f00002200002000641020900c03004020201e40030002f002d002e000005605ff0e1f1e0f0f0fcf1b70ac0f0c0188991e41c0d03b5ffffd56fe48b54f00014001300150015008893a0a00079047d8b46286982e24823f2

Aber ich möchte nur, dass er die untere Zeile sucht, also das Datenpaket, mit einer größe von z.B. mind. 40 Zeichen. Die kleineren Datenpakete soll er gar nicht beachten. Dabei soll er nur den Zahlencode kopieren. Was davor steht ist nicht interessant.

Code:
while ischar(inLine)
            inLine = fgets(file);
            k = strfind(inLine, ' DATA. Data: ');
       
                   
            if length(k)~= 0                                        % string
                subStr = inLine(k:end);                            
                k = strfind(subStr, ': ');
                subStr = subStr((k+2):end);
                k = strfind(subStr, ' ');
                subStr = subStr(1:(k-1));
                disp(inLine);
                disp(subStr);


Ich habe es mit einer If- Befehl fnktioniert, aber das funktioniert nicht. Ich stehe gerade echt auf den Schlauch und komme nicht weiter.

Vielen Dank für eure Tips.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.02.2015, 12:14     Titel:
  Antworten mit Zitat      
Hallo,

bei dem Code fehlen die end Statements.
Zudem ist die Frage: inwiefern funktioniert es denn nicht, wie es soll?

Bitte auch die Code-Umgebung nutzen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
nero1186
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 01.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2015, 12:29     Titel:
  Antworten mit Zitat      
oh, sorry.

Code:

for i = 1:length(allFiles)
    fileName = fullfile(currentFolder, allFiles(i).name);
    if ~isdir(fileName)
        file = fopen(fileName, 'r');
        disp(fileName);
       
        inLine = fgets(file);
        disp(inLine);
       
        while ischar(inLine)
            inLine = fgets(file);
            k = strfind(inLine, ' DATA. Data: ');
                   
            if length(k)~= 0                                        % string
             
                subStr = inLine(k:end);
           
                k = strfind(subStr, ': ');
                subStr = subStr((k+2):end);
                k = strfind(subStr, ' ');
                subStr = subStr(1:(k-1));
                       
                disp(inLine);
                disp(subStr);
               
                 
             HWString = subStr;

ValueHex(count,1)=hex2dec(HWString(1:1));            
ValueHex(count,3)=hex2dec(HWString(2:2));              
ValueHex(count,3)=hex2dec(HWString(3:6));            
 ValueHex(count,4)=hex2dec(HWString(7:8));      
         
        end;
       
        fclose('all');

    end;
   
end;

 


Zum Teil habe ich den Code von meinem Vorgänger übernommen. Er meldet mir folgenden Fehler

Error in ==> Untitled2 at 52
ValueHex(count,1)=hex2dec(HWString(1:1));

Der Parser soll eiegntlich das gesuchte Datenpaket (das eine Länge von 262 Zeichen hat) aus einer riesigen Liste mit anderen Datenpakete suche. Die haben eine unterschiedliche Länge. Relevant sind nur der Datenauszug mit 262 Zeichen. Momentan übernehme ich einfach jeden Wert.

Anschliessend nimmt der Paser den code und splittet diesen auf und schreibt die Werte dann in eine seperate Spalte in einer Excel File.

Wie kann ich jetzt den Parser sagen, dass er nur Werte mit einer Länge von 262 Zeichen verarbeitet?

Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.02.2015, 12:34     Titel:
  Antworten mit Zitat      
Hallo,

ich vermute sehr, dass das nicht die komplette Fehlermeldung ist?
Jetzt wissen wir zwar, wo der Fehler auftritt, aber nicht welcher.

Zitat:
Wie kann ich jetzt den Parser sagen, dass er nur Werte mit einer Länge von 262 Zeichen verarbeitet?

Du kannst z.B.
Code:
überprüfen.

Um zu sehen, ob der Code das gewünschte macht, kann auch der Debugger hilfreich sein.

Kannst du eine Beispieldatei zur Verfügung stellen und welche Ergebnisse von dieser Datei erwartet werden?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
nero1186
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 01.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2015, 12:56     Titel:
  Antworten mit Zitat      
Der ganze Fehlercode lautet:

Code:


??? Index exceeds matrix dimensions.

Error in ==> Untitled2 at 55
             ValueHex(count,1)=hex2dec(HWString(1:1));          
 


Als Beispieldatei kann ich leider nur einen Auszug bereitstellen:

Code:


01-23 21:21:32.470 : [14060] DataResponse of type: DATA. Data: 060106bc0234
01-23 21:21:32.490 : [14060] DataResponse of type: DATA. Data: 060106bd0233
01-23 21:21:32.670 : [14060] DataResponse of type: DATA. Data: 030115c119f4189a3bcba2f4d752e3ca6334d39af0
01-23 21:21:32.920 : [31408] DataResponse of type: DATA. Data: 060106c41519
01-23 21:21:33.300 : [14096] DataResponse of type: DATA. Data: 030109c60110020019
01-23 21:21:33.360 : [31399] DataResponse of type: DATA. Data: 060183c7100000010015000001000101010001000100010001000004c10160000000007e9b00000000000060fe000e30000e000000000800c033030101014900fefffefffefffeffffffffffffe3f0e0f0f0fcf00200c0f0c0d2277d00000f11a5ffffff7fff7fffff00fefffefffefffeff87440000004f777e000000000000000037
01-23 21:21:34.630 : [31399] DataResponse of type: DATA. Data: 060183c8100000010015000001000101010001000100010001000004c10160000000007ea400000000000060fe000e30000e000000000800c033030101014900fefffefffefffeffffffffffffe9f0e0f0f0fcf00500c0f0c0d2277d00000f13a5ffffff7fff7fffff00fefffefffefffeff87440000004f787e000000000000000021
01-23 21:21:35.900 : [31399] DataResponse of type: DATA. Data: 060183c9100000010015000001000101010001000100010001000004c10160000000007e9d000000000000eef9000e30000e000000000800c033030101014900fefffefffefffeffffffffffffe0f0e0f0f0fcf00900c0f0c0d2277d00000f13a5ffffff7fff7fffff00fefffefffefffeff87440000004f7a7e0000000000000000a1
01-23 21:21:37.160 : [31399]DataResponse of type: DATA. Data: 060183ca100000010015000001000101010001000100010001000004c10160000000007e9c00000000000008f4000e30000e000000000800c033030101014900fefffefffefffeffffffffffffe7f0e0f0f0fcf00c00c0f0c0d2277d00000f13a5ffffff7fff7fffff00fefffefffefffeff87440000004f877e000000000000000075
 


Wie gesagt, es gibt mehrere Datenpakete des Typs DATA. Data. Relevant sind nur die Datenpakete mit 262 Zeichen. Der Rest ist fehlehrhaft und soll nicht berücksichtigt werden.

Die Datenpaekte kommen aus einem Protokoll einer Maschine und übermittelt als hexadezimaler Code einen Statusbericht der Maschine. So sind die ersten beiden Zeichen z.B. der aktuelle Stromverbrauch der Anlage, das nächste Zeichen wiederum ob z.B. die Maschine an ist oder nicht.

Der Parser soll daher als ersten schritt das Datenpaket mit 262 Zeichen aus der großen Datei mit tausenden Einträgen herausnehmen und im nächsten Schritt in eine Exceldatei schreiben und das Paket schon entsprechend aufschlüsseln.

Den zweiten Teil mit dem aufschlüsseln macht er schon. Jedoch hat er Probleme mit dem ersten Schritt. Daher kommt auch, denke ich mal, die Fehlermeldung.

Baue ich
Code:

einfach ein oder brauche ich dafür eine if-Bedingung?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.02.2015, 14:45     Titel:
  Antworten mit Zitat      
Hallo,

ich bekomme die Fehlermeldung, dass count nicht existiert - gibt es ja auch nicht. Wenn ich Count auf 1 initialisiere und in der Schleife inkrementiere und dann noch das fclose nach die Schleife ziehe (sonst kann man nicht mehr in der Datei lesen), bekomme ich für deinen Datenausschnitt keine Fehler und

ValueHex =
0 6 262 189
0 3 277 193
0 6 262 196
0 3 265 198
0 6 387 199
0 6 387 200
0 6 387 201
0 6 387 202

Grüße,
Harald


Der von mir verwendete Code:
Code:
count = 1;
fileName = 'testfile.txt';
if ~isdir(fileName)
    file = fopen(fileName, 'r');
    disp(fileName);
   
    inLine = fgetl(file);
    disp(inLine);
   
    while ischar(inLine)
        inLine = fgetl(file);
        k = strfind(inLine, ' DATA. Data: ');
       
        if length(k)~= 0                                        % string
           
            subStr = inLine(k:end);
           
            k = strfind(subStr, ': ');
            subStr = subStr((k+2):end);
            k = strfind(subStr, ' ');
            subStr = subStr(1:(k-1));
           
            disp(inLine);
            disp(subStr);
           
           
            HWString = subStr;
           
            ValueHex(count,1)=hex2dec(HWString(1:1));
            ValueHex(count,2)=hex2dec(HWString(2:2));
            ValueHex(count,3)=hex2dec(HWString(3:6));
            ValueHex(count,4)=hex2dec(HWString(7:8));
            count = count+1;
           
        end;
       
       
       
    end;
    fclose('all');
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 - 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.