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

Fehlerhafte Daten bei fgetl auslassen

 

liver87
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 13.07.15
Wohnort: Dortmund
Version: R2015a
     Beitrag Verfasst am: 14.07.2015, 08:30     Titel: Fehlerhafte Daten bei fgetl auslassen
  Antworten mit Zitat      
Guten morgen.

Leute, ich brauch eure Unterstützung. Ich hab eine log Datei (rssi.txt). Da sind normalerweise 4 Zahlen pro Zeile. All diese Daten möchte ich in dataall ablegen.
Das Problem ist, dass die log Datei auch mit Fehlern erstellt werden kann, was dann Fehler in matlab verursacht. Ich hab die Problemstellen in rssi.txt und im Code mit rot markiert.

Ich hab versucht die Zeile so zu ändern: strcat(tlien,';0'), Fehler an der Stelle %d%d%d%d kommt leider trotzdem.

Ich wäre sehr dankbar für eure Hilfe.

Die rssi.txt sieht so aus:

    0

    2;234987;62;62

    2;234992;62;62

    0;234996;68;68

    1;234R;1

    999;66;65

    2;235004;62;62


Code:

function rssiplot()

pathread='D:\Docs\schroeder\matlab\';
filename='rssi.txt';
path = strrep(pathread, '\', '\\');% \ durch \\ ersetzen


file=sprintf('%s%s',path,filename);
fid = fopen(file);
dataall=[];
dataallheight=[];

tline=fgetl(fid);
data = cell2mat(textscan(tline,'%d'));

%%ganze Datei einlesen
while 1
    tline=fgetl(fid); %Zeile zwischenspeichern und anschließend einsortieren
   
    if ~ischar(tline), break, end
    if (isempty(tline))
        tline=fgetl(fid);
    end
   
    if ((cell2mat(textscan(tline,'%d')) > 2) || (cell2mat(textscan(tline,'%d')) < 0))
    else
            %FEHLER UNTEN
        if (~isempty((cell2mat(textscan(tline,'%d;%d;%d;%d')))))
            data = cell2mat(textscan(tline,'%d;%d;%d;%d'))
            dataall=[dataall;data]
        end
    end
end %while

fclose(fid);

dataall
end
 
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: 14.07.2015, 15:38     Titel: Re: Fehlerhafte Daten bei fgetl auslassen
  Antworten mit Zitat      
Hallo liver87,

Die Erzeugung des File-Names ist schräg. Das geht einfacher und zuverlässiger:
Code:
pathread = 'D:\Docs\schroeder\matlab\';
filename = 'rssi.txt';
file = fullfile(pathread, filename);
fid = fopen(file);
if fid == -1
  error('Cannot open file: %s', file);
end

Den sehr wichtigen Befehl path mit einer Variablen zu überschreiben, ist sehr tückisch. Auf Anhieb erzegut das zwar keine Fehler, aber beim Debuggen kann man arg auf die Nase fallen.

Code:
function rssiplot()
...

dataall=[];
dataallheight=[];

% Wozu dient dies? Eine Header-Zeile?
% Wieso nicht TEXTSCAN(fid)?
tline=fgetl(fid);
data = cell2mat(textscan(tline,'%d'));

%%ganze Datei einlesen
while 1
    tline = fgetl(fid); %Zeile zwischenspeichern und anschließend einsortieren
   
    if ~ischar(tline), break, end
    if ~isempty(tline)
      [data, count] = sscanf('%d;', tline, [1, 4]);
      if count == 4
        dataall = cat(1, dataall, data);
      end
    end
end
fclose(fid);

Wenn die Datei "größer" ist, ist das iterative Anwachsen von dataall extrem ineffizient. Dann wäre es viel besser zunächst eine Maximal-Größe zu allocieren und dann hinterher abzuschneiden. Z.B. die Filegröße/4.

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 13.07.15
Wohnort: Dortmund
Version: R2015a
     Beitrag Verfasst am: 14.07.2015, 16:23     Titel:
  Antworten mit Zitat      
Hi Jan,
danke erstmal für die Hilfe! Ich hab gecheckt wie du gemeint hast, aber der count ist leider immer Null. Also auf dataall = cat(1, dataall, data) komme ich nie.
Woran kanns denn liegen?

Hab noch rssi.txt angehängt.

Code:

function rssiplot2()
clear all;
close all;
clc;

pathread = 'D:\Docs\schroeder\matlab\';
filename = 'rssi.txt';
file = fullfile(pathread, filename);
fid = fopen(file);
if fid == -1
  error('Cannot open file: %s', file);
end

dataall=[];
dataallheight=[];
 
% fgetl, weil newline gelöscht werden soll.
tline=fgetl(fid);
data = cell2mat(textscan(tline,'%d'));

%%ganze Datei einlesen
while 1
    tline = fgetl(fid); %Zeile zwischenspeichern und anschließend einsortieren
   
    if ~ischar(tline), break, end
    if ~isempty(tline)
      [data, count] = sscanf('%d;', tline, [1, 4]);
      if count == 4
        dataall = cat(1, dataall, data)
      end
    end
end
fclose(fid);
end
 


rssi.txt
 Beschreibung:

Download
 Dateiname:  rssi.txt
 Dateigröße:  2.96 KB
 Heruntergeladen:  273 mal
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: 15.07.2015, 10:29     Titel:
  Antworten mit Zitat      
Hallo liver87,

Da hatte ich einen Tippfehler.
Code:
% Statt:
      [data, count] = sscanf('%d;', tline, [1, 4]);
% Besser:
      [data, count] = sscanf(tline, '%d;', [1, 4]);


Noch ein Kommentar:
Code:

function rssiplot2()
clear all;   % NEIN!!!
close all;   % Nicht hilfreich
clc;  % Ist das sinnvoll?!

clear all löscht alle lokalen Variablen, alle Breakpoints des Debuggers, alle funktionen, die schon von der Festplatte ins RAM geladen wurden, alle persistent Variablen, alle MEX-Files und Java-Classes. Vor allem das Löschen der Breakpoints ist schlimm, weil der Debugger ja ein wichtiges Hilfsmittel beim Programmieren ist.
Am Anfang einer Funktion gibt es auch keine lokalen Variablen, so dass das leidige clearr all hier einfach nur unnötig Resourcen verschleudert.
Das Schließen aller Fenster ist auch eine unpraktische Idee. Das ist am Anfang einer File-Auslese-Funktion überflüssig. Stell Dir vor, Du hast ein GUI offen und darin viele Einstellungen vorgenommen. Dann wird von irgendwoher die File-Einlese-Routine gestartet und das GUI geschlossen. Wozu?!
Es finden auch keine Ausgaben ins CommandWindow statt, dann macht clc auch nicht außer den User zu verunsichern.

Der brutale Clearing Header clear all, close all, clc ist deshalb meiner Ansicht nach ausgesprochen unpraktisch und macht dem Programmierer das Leben schwerer ohne irgendeinen Vorteil zu bieten. Trotzdem findet man das immer wieder im Code von Programmier-Anfängern. Wo wird das nur empfohlen?!

Dieses "data" wird später überschrieben:
Code:
data = cell2mat(textscan(tline,'%d'));

Dann kann man sich die Zeile auch sparen.

Viele Grüße, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
liver87
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 13.07.15
Wohnort: Dortmund
Version: R2015a
     Beitrag Verfasst am: 15.07.2015, 12:22     Titel:
  Antworten mit Zitat      
Jan, riesen Dank dir, ich werd deine Empfehlungen merken.
Alles hat sehr gut funktioniert.
Vielen Dank noch mal)

Viele Grüße
Igor
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.