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

Augabe von Zahlenwerten

 

David79
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 31.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.12.2011, 21:30     Titel: Augabe von Zahlenwerten
  Antworten mit Zitat      
Hallo,

folgendes Programm soll Zahlenwerte aus einer .txt Datei auslesen und im Editor anzeigen:

Code:
[Dateiname, Pfad] = uigetfile('*txt','Bitte Datei auswählen!');
fid=fopen(fullfile(Pfad,Dateiname), 'r');

                            % so lange weiter bis Programmende
weiter = 1;                 % flag als Merker, ob Datei erreicht ist
while (weiter)              %nächste Zeile einlesen
    S=fgetl(fid);
   
    if (S==-1)              % Datei Ende erreicht, falls -1)
        weiter = 0;         % flag als merker setzen
    else                    % ansonsten auf dem Bildschirm ausgeben
   
      fprintf('%s \n',S)
        %if regexp(S,'B')
       % messung_t=textscan(S,'%*1s %4f %*2s %7f %*1s %8f %*2s %5f *[^\n]','delimiter','\n')
        %end
   end
end


fclose(fid);


Wenn die Zeilen mit Hilfe des fprintf-Befehls ausgelesen werden, erscheint folgende Anzeige im Editor:

B1106575134505N01231382EA002150028000109
B1110575134505N01231382EA006000028000109
L1114575134505N01231382EA012000028000109
L1118575134505N01231382EA011140028000109
B1122575134505N01231382EA012340028000109
L1126575134505N01231382EA014000028000109
B1130575134505N01231382EA013300028000109
L1134575134505N01231382EA012000028000109

Werden die Zeilen nach den Anfangsbuchstaben L oder B gefiltert, wird folgender Term genutzt:

Code:

 if regexp(S,'B')
        messung_t=textscan(S,'%*1s %4f %*2s %7f %*1s %8f %*2s %5f *[^\n]','delimiter','\n')
        end


Der Filter funktioniert. Allerdings werden die Werte folgendermaßen im Editor angezeigt (gewünscht ist die obere Variante, aufgrund einer weiteren Datenverarbeitung):

messung_t =
[1130] [5134505] [1231382] [1330]
messung_t =
[1106] [5134505] [1231382] [215]
messung_t =
[1110] [5134505] [1231382] [600]

Warum werden die Ergbnisse beim filtern einzeln angezeigt und nicht zusammenhängend wie mit dem fprintf-Befehl, wie gewollt???

test.txt
 Beschreibung:
Diese Datei soll ausgelesen werden

Download
 Dateiname:  test.txt
 Dateigröße:  334 Bytes
 Heruntergeladen:  289 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: 28.12.2011, 15:45     Titel: Re: Augabe von Zahlenwerten
  Antworten mit Zitat      
Hallo David79,

Zitat:
Warum werden die Ergbnisse beim filtern einzeln angezeigt und nicht zusammenhängend wie mit dem fprintf-Befehl, wie gewollt???

Weil Du im FPRINTF-Befehl eine String ausgibst, während TEXTSCAN diesen String in einen Cell String aufteilt.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 31.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.12.2011, 17:36     Titel:
  Antworten mit Zitat      
Hallo,
ich habe das Programm umgeschrieben und den strncmp- und sccanf-Befehl genommen. Die Ergbenisse sollten nun als string ausgegeben werden.
Meinem eigentlichen Ziel bin einen Schritt näher gekommen...

Das eigentliche Problem bleibt jedoch weiter bestehen; Die Ergebnisse werden nacheinander, separat ausgeworfen.

A1 =
1130 5134505 1231382 1330
A1 =
1130 5134505 1231382 1330
A2 =
1106 5134505 1231382 215

Ich habe bereits vermutet, dass der strncmp- und sscanf-Befehl außerhalb der Schleife laufen muss, was sich als nicht falsch erwiesen hat. Dort kommt eine Fehlermeldung.


Code:
[Dateiname, Pfad] = uigetfile('*txt','Bitte Datei auswählen!');
fid=fopen(fullfile(Pfad,Dateiname), 'r');

weiter=1;
while (weiter)
    s=fgetl(fid);
    if (s==-1);
        weiter=0;
    else
       
        if strncmp(s,'B',1);
            A1=sscanf(s,'%*1s %4f %*2s %7f %*1s %8f %*2s %5f %*[^\n]',[1,inf])
           
        end
    end
end

fclose(fid);

A1
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: 29.12.2011, 19:16     Titel:
  Antworten mit Zitat      
Hallo David79,

Die Ausgabe erfolg übrigens nicht im "Editor", sondern im Command-Window.

Das Problem läuft nun, aber die Ausgabe entsrpicht noch nicht den Erwartungen. Aber was genau möchtest Du?
Vielleicht dies:
Code:
...
A1 = sscanf(s, '%*1s %4f %*2s %7f %*1s %8f %*2s %5f');
fprintf('%d', A1);
fprintf('\n');
...

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 31.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.12.2011, 21:12     Titel:
  Antworten mit Zitat      
Hallo Jan,

mein Vorhaben ist Folgendes:
in den Zeilen der beigefühten .txt-Datei sind Koordinaten enthalten, welche ausgelesen werden sollen.

das Auslesen und Umrechnen (in Dezimalkoordinaten) habe ich folgendermaßen gelöst:

Code:
[Dateiname, Pfad] = uigetfile('*txt','Bitte Datei auswählen!');
fid=fopen(fullfile(Pfad,Dateiname), 'r');

messung_t=textscan(fid,'%*1s %4f %*2s %7f %*1s %8f %*2s %5f %*[^\n]','delimiter','\n')
fclose(fid);


auslesen = [messung_t{1:4}] % hier wir jede Zeile einzel dargestellt und weiterverarbeitet


data_x=(messung_t{2}); % Umrechnen der Koordinaten in Dezimalkoordinaten
data_dez_x=(rem(data_x,1e3)/600+ floor(rem(data_x,1e5)/1e3))/60+ floor(data_x/1e5)

data_y=(messung_t{3}); % Umrechnen der Koordinaten in Dezimalkoordinaten
data_dez_y=(rem(data_y,1e3)/600+ floor(rem(data_y,1e5)/1e3))/60+ floor(data_y/1e5)

% grafische Darstellung der x- und y-Koordinaten...


Ausgabe:

auslesen =

1106 5134505 1231382 215
1110 5134505 1231382 600
1114 5134505 1231382 1200
1118 5134505 1231382 1114
1122 5134505 1231382 1234
1126 5134505 1231382 1400
1130 5134505 1231382 1330
1134 5134505 1231382 1200


data_dez_x =

51.5807
51.5807
51.5807
51.5807
51.5807
51.5807
51.5807
51.5807


data_dez_y =

12.5273
12.5273
12.5273
12.5273
12.5273
12.5273
12.5273
12.5273

Dies hat bestens funktioniert, allerdings wurden alle Zeilen ausgelesen...
Für die Auswertung dürfen aber nur die Zeilen (Daten) mit dem Anfangsbuchstaben 'B' benutzt werden.

Die Funktion fprintf(...) gibt keinen String aus der anschließend weiterverarbeitet werden kann, laut Dokumentation. Daraufhin wurde die .txt-Datei mit fgetl(fid) ausgelesen mit strncmp(xyz) gefiltert und mit A=sscanf(xyz) entsprechend formatiert.
mit dieser Funktion wurde die Ergebnisse einzeln ausgegeben und können nicht mit folgenden Funktionen weiterverarbeitet werden:

Code:
data_x=(messung_t{2}); % Umrechnen der Koordinaten in Dezimalkoordinaten
data_dez_x=(rem(data_x,1e3)/600+ floor(rem(data_x,1e5)/1e3))/60+ floor(data_x/1e5)

data_y=(messung_t{3}); % Umrechnen der Koordinaten in Dezimalkoordinaten
data_dez_y=(rem(data_y,1e3)/600+ floor(rem(data_y,1e5)/1e3))/60+ floor(data_y/1e5)


fprintf(xyz) schreibt in ein text file und kann nicht wie gewünscht weiterverarbeitet werden.

Meine Ziele zusammengefasst:
1. Auslesen bestimmter Zeilen
2. Formatieren der Zeilen
3. Konvertieren der Koordinaten
4. Ausgabe
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: 29.12.2011, 22:56     Titel:
  Antworten mit Zitat      
Hallo David79,

Ich formuliere die Frage nochmal anders: Welches Problem ist nun noch ungelöst? Welche Daten (Typ und Dimension) möchtest Du wohin und in welchem Format ausgeben?

FPRINTF schreib einen String in ein File oder ins Command-Window. SPRINTF schreibt in einen String.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 31.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.12.2011, 01:07     Titel:
  Antworten mit Zitat      
Das Format soll folgendermaßen aussehen:

.txt-Datei (Ausgangsdaten)

B1106575134505N01231382EA002150028000109
B1110575134505N01231382EA006000028000109
L1114575134505N01231382EA012000028000109
L1118575134505N01231382EA011140028000109
B1122575134505N01231382EA012340028000109
L1126575134505N01231382EA014000028000109
B1130575134505N01231382EA013300028000109
L1134575134505N01231382EA012000028000109

ausgabe = (Ausgabe nach der Bearbeitung)

B 1106 5134505 1231382 215
B 1110 5134505 1231382 600
B 1122 5134505 1231382 1234
B 1130 5134505 1231382 1330

Die Werte sollen in einem String [nrows] geschrieben werden (sprintf)
Hierbei sollen die Daten nach B gefiltert werden (Die Buchstaben müssen nicht angezeigt werden). Ich gehe davon aus, dass der Befehl strncmp und sscanf genutzt werden muss.




Nach meiner Programmierung habe ich immer diese Ausgaben (nicht gewollt):

ans =
B 1106 5134505 1231382 215
ans =
B 1110 5134505 1231382 600
ans =
.....
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: 30.12.2011, 01:32     Titel:
  Antworten mit Zitat      
Hallo David79,

Mir wird es immer noch nicht klar: Was bedeutet "Ausgabe" - in eine Variable, ins Command Window oder in ein File?
Ich füge mal eine Ausgabe ins Command-Window und in ein Cell-String in Deinen Code ein:
Code:

[Dateiname, Pfad] = uigetfile('*.txt', 'Bitte Datei auswählen!');
fid = fopen(fullfile(Pfad,Dateiname), 'r');
C = cell(1, 1000);
iC = 0;

weiter = true;
while (weiter)
    s = fgetl(fid);
    if ischar(s)
      if strncmp(s, 'B', 1);
         A = sscanf(s, 'B%4f %*2c %7f %*c %8f %*2c %5f', 4);
         S = sprintf('B %g %g %g %g', A);
         iC = iC + 1;
         C{iC} = S;
         fprintf('%s\n', S);
      end
    else
        weiter = false;
    end
end

fclose(fid);
C = C(1:iC);

Bemerkung: "if s==-1" funktioniert zwar, ist aber nicht effizient oder klar, falls s ein String ist.

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.