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

Nur bestimmte Zeilen aus Text auslesen

 

mathphys
Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 12.07.2011, 23:21     Titel: Nur bestimmte Zeilen aus Text auslesen
  Antworten mit Zitat      
Hallo

ich will eine Funktion schreiben, welche bestimmte Zeilen aus einer Textdatei auslesen soll. Das Kriterium welche Zeilen ausgelesen werden soll der erste Buchstabe der Zeile sein.

Alle Zeilen die mit N oder C anfangen sollen ausgelesen werden und alle anderen Zeilen der Datei sollen nicht eingespeichert werden.

Sie sollen nur nicht eingelesen werden. Ich will nicht, dass in der originalen Textdatei solche Zeilen gelöscht würden, das wäre fatal.

Ich überlege schon lange wie das geht, bekomme es aber nicht hin. Ich bin für Ratschläge dankbar Smile

Grüße
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.07.2011, 07:38     Titel:
  Antworten mit Zitat      
Hallo,

z.B. so:
Code:
fid = fopen('test.txt');
data = {};
while ~feof(fid)
    l = fgetl(fid);
    if strcmpi(l(1), 'N') || strcmpi(l(1), 'C')
        data = [data; textscan(l, '%s %f %f %f')];
    end
end

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

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 13.07.2011, 09:10     Titel:
  Antworten mit Zitat      
Hi

Danke für deine Hilfe Smile

Den Code werde ich gleich heute untersuchen und sehen ob ich es verstehe.

Gruß
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 13.07.2011, 14:50     Titel:
  Antworten mit Zitat      
Hi

könntest du bitte Kommentare hinter den Zeilen deines Beispieles schreiben? Ich verstehe es nicht.

meint der Doppelstrich || ein logisches und?

Was genau ist denn data und was meint data = {}

Danke dir
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Code:
fid = fopen('test.txt'); % öffne Datei
data = {}; % intialisiere zu lesende Daten als leeres Cell Array
while ~feof(fid) % weiter bis zum Ende der Datei
    l = fgetl(fid); % Zeile auslesen
    if strcmpi(l(1), 'N') || strcmpi(l(1), 'C')
        data = [data; textscan(l, '%s %f %f %f')];  % wenn das erste Zeichen N oder (!!) C ist, dann Daten auslesen und anhängen.
    end
end  


Hier übrigens die von mir verwendete Testdatei:
Code:
Numbers 1 5 10
some crap
choices 4 8 12
more crap


Den Formatierungsstring bei textscan wirst du natürlich auf deine Datei anpassen müssen.

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

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 13.07.2011, 15:36     Titel:
  Antworten mit Zitat      
Das funktioniert super. Vielen, vielen Dank. Obwohl das klappt möchte ich gerne weiter über deinen Code reden, da ich das ja verstehen will. Schließich will ich in Zukunft auch alleine Programmieren können, irgendwann zumindest... Confused

Die Datei data sind meine gewünschten Daten. Bei der Variable fid bekomme ich als Inhalt eine 3
Was bedeutet diese 3?

Ferner bekomme ich als Varianble l die Daten aus der letzten Zeile des Textes. Wieso?

Noch eine Frage zur Syntax der while Schleife:

was bedeutet denn

Code:


Du schriebst in deinem Kommentar

Zitat:
weiter bis zum Ende der Datei


Aber wieso dieser Syntax? das muss doch was bedeuten oder?

Danke für deine Hilfe
Grüsse
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

fid ist ein File Identifier, ein Verweis auf die Datei. Im Workspace erscheint das als Zahl, die MATLAB dann im entsprechenden Zusammenhang interpretiert (stelle es dir als eine Flugnummer vor - bei LH1234 gibt die 1234 für sich auch keinen Sinn, erst wenn du das als Flugnummer interpretierst).

feof überprüft, ob das Ende der Datei erreicht wurde. Wenn es erreicht ist, sollten wir zu Lesen aufhören, sonst wirds eine Endlosschleife.
Daher
while ~feof(fid) --> solange das Ende der Datei nicht erreicht ist...

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

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 13.07.2011, 15:48     Titel:
  Antworten mit Zitat      
Ich denke das habe ich verstanden. Danke! Smile
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 22.07.2011, 11:16     Titel:
  Antworten mit Zitat      
Hallo

ich habe folgenden Code:

Code:
[filename, filepath] = uigetfile;
fid = fopen(fullfile(filepath, filename));
data = {};
while ~feof(fid)
    l = fgetl(fid);
    if strcmpi(l(1), 'N') || strcmpi(l(1), 'C')
        data = [data; textscan(l, '%s %f %f %f')];
    end
end
fclose(fid);


Es soll aus einer Textdatei, welche nur solche Zeilen auslesen, welche mit N oder C beginnen. Dies hat bis jetzt auch super geklappt.

Nun habe ich eine neue Textdatei, welche aber die gleiche Struktur hat wie die frühere. Nun erhalte ich aber den Fehler:


Zitat:
??? Attempted to access l(1); index out of bounds because
numel(l)=0.

Error in ==> date_input at 10
if strcmpi(l(1), 'N') || strcmpi(l(1), 'C')


Was bedeutet dieser Fehler und wie kann ich ihn beheben?

Danke euch für die Hilfe Smile
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 22.07.2011, 11:23     Titel:
  Antworten mit Zitat      
Hallo

obwohl die Struktur der Dateien die Selbe ist, stand in der 1. Zeile eine einzelne Zahl. Ich vermute, dass es daran gelegen ist.

Ist es möglich dieses Problem zu umgehen, ohne das jedesmal die Textdatei die eingelesen werden soll so anzupassen, dass auch ja wirklich alle Zeilen mit einem Buchstaben anfangen?

Gruß
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

vorangestelltes isempty
Code:
if ~isempty(l) && ( strcmpi(l(1), 'N') || strcmpi(l(1), 'C') )
 

Grüße,
Harald
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: 24.07.2011, 01:10     Titel:
  Antworten mit Zitat      
Hallo mathphys,

Oder:
Code:
if strncmpi(l, 'N', 1) || strcnmpi(l, 'C', 1)

STNCMPI akzeotiert auch leere Inputs.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 02.08.2011, 08:52     Titel:
  Antworten mit Zitat      
Liebe Leute,

mein txt-File sieht so aus:

Code:

esv_p1 = 45.0
esv_p2 = 40.3
ec_p1 = 0.8
 


Hieraus möchte ich gern ein Cell-Array erstellen, worin die Bezeichnungen in der 1. und die Werte in der 2. Spalte gespeichert werden. Folgendes habe ich versucht:

Code:

fid = fopen('C:\Windows\Temp\text.txt', 'r');
data = {}
while ~feof(fid)
l = fgetl(fid)
data = [fid; textscan(l, '%s %s %f');
end
 


Allerdings wird mir die Fehlermeldung

Zitat:

??? Error using ==> textscan
Badly formed format string.

Error in [...] data_read = [data_read; ...


Wo liegt mein Fehler?

Für eure Hilfe danke ich euch.

Viele Grüße

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 16.08.2011, 08:01     Titel:
  Antworten mit Zitat      
Hat jemand eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDread
Forum-Century

Forum-Century


Beiträge: 212
Anmeldedatum: 11.05.11
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 16.08.2011, 08:53     Titel:
  Antworten mit Zitat      
Hallo pfeili,
1. hat dir ein ] gefehlt
2. wieso "data = [fid,textscan(l, '%s %s %f')]; "?

dein File funktioniert mit dem unteren Code

Code:


fid = fopen('C:\Windows\Temp\text.txt', 'r');
data = {}
    while ~feof(fid)
        l = fgetl(fid)
        data = [data,textscan(l, '%s %s %f')];
   end


Gruß chris
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  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.