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

Werte aus *.txt auslesen

 

Heisenberg

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.11.2011, 13:23     Titel: Werte aus *.txt auslesen
  Antworten mit Zitat      
ich habe eine textdatei mit 2 spalten:

die werte darin sind mit einem tab getrennt. es sieht also so aus:

255 145
154 145
441 698
441 566

ich brauche jetzt den befehl der jeweils den untersten wert der jeweiligen spalte verwendet wird und als x und y definiert wird.

das heist bei meinem beispiel soll x jetzt 441 und y=566 sein. es kommen immer wieder neue werte in die spalte, deshalb muss matlab irgendwie immer den untersten wert nutzen.

ich weis das textread der auslesebefehl ist, aber mehr weis ich auch nich :\

kann mir da jemand helfen? bin auf dem gebiet matlab absoluter neuling...

danke


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.11.2011, 14:36     Titel: Re: Werte aus *.txt auslesen
  Antworten mit Zitat      
Hallo Heisenberg,

Das Einlesen von Text-Files wurde hier im Forum wiederholt besprochen. Eine Suche würde sich also lohnen. Das Lesen von "help textscan" wäre auch eine gute Idee.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Heisenberg

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.11.2011, 14:58     Titel:
  Antworten mit Zitat      
hab ich schon, aber so richtig geholfen hat es mir nicht, sonst hätte ich ja kein thread aufgemacht. was mir vor allem nich klar is, wie ich matlab sagen soll, dass er immer den letzten wert aus der spalte nehmen soll... Sad
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.11.2011, 15:24     Titel:
  Antworten mit Zitat      
Hallo Heisenberg,

Du musst sowieso alles einlesen, um die letzte Zeile zu finden. Ich würde das File mit FOPEN öffnen und mit FSCANF die Werte einlesen. Zum Schluß kann man denn die letzte Zeile der Werte herauskopieren.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Heisenberg

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.11.2011, 18:12     Titel:
  Antworten mit Zitat      
ok habe eine recht simple lösung gefunden:

M=textread('C:\windows\Desktop\xy.txt');
x = M(end,1:1)
y = M(end,2:2)

einziges problem dass ich noch habe, in der ersten zeile steht text, also sollte erst ab der 2ten zeile gelesen werden, da ich sonst eine fehlermeldung in matlab bekomme...
wie kann ich die erste zeile überspringen?

gruß
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.11.2011, 19:01     Titel:
  Antworten mit Zitat      
Hallo,

indem du die Option 'Headerlines' auf 1 setzt. Im übrigen solltest du TEXTSCAN statt TEXTREAD verwenden, siehe
Code:


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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.11.2011, 19:09     Titel:
  Antworten mit Zitat      
ja aber es funktioniert doch auch so?
was wäre denn der vorteil?

grüße
 
Heisenberg

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.11.2011, 19:50     Titel:
  Antworten mit Zitat      
habe folgendes versucht:

M=textread('C:\windows\Desktop\xy.txt','headerlines',2)
x = M(end,1:1)
y = M(end,2:2)

aber bekomme da folgende fehlermeldung:

??? Error using ==> dataread
Number of outputs must match the number of unskipped input fields.

Error in ==> textread at 176
[varargout{1:nlhs}]=dataread('file',varargin{:});
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.11.2011, 20:02     Titel:
  Antworten mit Zitat      
Hallo,

zum einen: es funktioniert ja offensichtlich nicht.
Zum anderen sagt die Doku, dass man TEXTSCAN verwenden soll. Der Grund ist in solchen Fällen meist, dass der alte Befehl früher oder später abgeschafft werden wird, weniger flexibel oder langsamer ist.

Aber die Doku scheinst du ohnehin nicht angesehen zu haben, denn sonst wüsstest du, dass man - sowohl bei TEXTREAD als auch bei TEXTSCAN - das Format der zu lesenden Daten angeben muss, hier '%f'.

Code:
fid = fopen('dat.txt');
daten = cell2mat(textscan(fid, '%f%f', 'headerlines', 1));
fclose(fid)
M = daten(end,:)


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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.11.2011, 20:18     Titel:
  Antworten mit Zitat      
ich habe wirklich viel in der doku gelesen! aber da ich kein programmierer bin ist das alles wie japanische für mich...

danke dir ich habs jetzt wie ichs brauche!

Code:
fid = fopen('C:\windows\Desktop\xy.txt');
daten = cell2mat(textscan(fid, '%f%f', 'headerlines', 1));
fclose(fid);
x = daten(end,1:1)
y = daten(end,2:2)
 

danke nochmals harald!
 
Heisenberg

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2011, 17:20     Titel:
  Antworten mit Zitat      
ersteinmal 1000 dank, du hast mir sehr geholfen.

eine frage hab ich noch:

die x und y werte benutze ich für eine berechnung, wobei die ergebnisse in eine excel datei geschrieben werden.
gibt es nun die möglichkeit das matlab die berechnung ausführt sobald die x und y werte in meiner txt-datei geändert werden? also dass ich praktisch den "run" button nur einmal ausgeführen muss und dann alles "von alleine" automatisiert abläuft?

vielen dank schonmal.
 
Heisenberg

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2011, 12:45     Titel:
  Antworten mit Zitat      
ich versuche grade einen timer in mein programm einzubauen:

ich möchte dass mein programm erst abläuft, sobald eine bestimmte datei aktualisiert wurde.

mit folgendem befehl kann ich die uhrzeit der letzten aktualisierung auslesen:

d=dir('C:\windows\desktop\xy.txt');
datum=d.date

Ergebniss:

datum =
30-Nov-2011 10:14:27

wie kann ich jetzt mit einem timer eine abfrage starten, dass er z.b. alle 2s prüft ob die Datei aktualisiert wurde? und sobald es dann geschehen ist das programm ablaufen lässt?

danke schonmal
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.11.2011, 15:02     Titel:
  Antworten mit Zitat      
Hallo,

rufe die angehängte Datei auf, z.B. mit
Code:
t = updateCheck('data.txt')


Wenn du die Überwachung der Datei abbrechen willst, kannst du das mit
Code:

machen.

Wenn die Datei innerhalb einer Sekunde mehrmals aktualisiert wird, kann es Probleme mit der Erkennung der Aktualisierung geben. Falls das relevant ist, bitte nochmal melden.

Grüße,
Harald

updateCheck.m
 Beschreibung:

Download
 Dateiname:  updateCheck.m
 Dateigröße:  482 Bytes
 Heruntergeladen:  545 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Heisenberg

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2011, 15:34     Titel:
  Antworten mit Zitat      
hi harald,

ich habe deine angehängte datei mal geöffnet, wenn ich allerdings überall wo filename steht die datei angebe kommt nur die fehlermeldung:


??? Error: File: updateCheck.m Line: 1 Column: 26
Unexpected MATLAB expression.

die datei is im selben ordner wie die matlab datei.

so sieht das file ja dann aus:
Code:

function t = updateCheck('xy.txt')
d = dir('xy.txt');
lastdate = d.date;
dt = 2;

t = timer('TimerFcn',{@checkFile, 'xy.txt', lastdate}, 'Period', dt, ...
    'ExecutionMode', 'FixedDelay');
start(t)

function checkFile(t, foo2, 'xy.txt', lastdate) %#ok<INUSL>
d = dir('xy.txt');
if ~strcmp(d.date, lastdate)
    disp('File was updated')
    % Process for processing new file goes here
end
set(t, 'TimerFcn',{@checkFile, 'xy.txt', d.date}) % set new modification date


Bitte Code-Umgebung verwenden - Danke! Jan S
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.11.2011, 15:37     Titel:
  Antworten mit Zitat      
Hallo,

setze dich doch bitte mal mit der grundlegenden Idee von Funktionen auseinander. Der Sinn daran ist, dass du eben nicht im Code der Funktion Änderungen vornimmst, sondern nur im Aufruf.

In deinem Fall also:
Code:
t = updateCheck('xy.txt')  


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3  Weiter

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.