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

Einlesen ganz bestimmter Zeilen von txt-Dateien

 

Roland83
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 19.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.05.2017, 16:50     Titel: Einlesen ganz bestimmter Zeilen von txt-Dateien
  Antworten mit Zitat      
Hallo liebe Community!

Ich möchte Matlab dazu bewegen, aus einer txt-Datei bestimmte Zeilen (und nur diese, und diese auch nur teilweise) auszulesen.

So möchte ich zum Beispiel die Fließkommazahl in Zeile 19 (START_Z=4.000000000) der angehängten Beispiel.txt auslesen, also alle Zeichen hinter der "="-Zeichen.

Damit aber nicht genug, soll Matlab dann noch zwei oder drei weitere Zeilen einlesen. Dafür kann ich den Codeblock dann aber ja auch einfach duplizieren.

Ich hab hier schon was aus dem Forum gesucht und etwas angepasst, aber das hat bisher keinen Erfolg gezeigt.
Code:

[dname, Pfad]=uigetfile('*.txt','txt-Rohdaten-Datei auswählen');

fid = fopen(dname); % ö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), 'START_Z=')
        data{1} = [data; textscan(l, '%s', '%[^START_Z=]')];
    end
end

celldisp(data{1});
 

Die Antwort von Matlab lautet dann: Index exceeds matrix dimensions.

Kann mir hier jemand weiterhelfen?

Vielen Dank!

Beispiel.txt
 Beschreibung:

Download
 Dateiname:  Beispiel.txt
 Dateigröße:  613.79 KB
 Heruntergeladen:  277 mal
Private Nachricht senden Benutzer-Profile anzeigen


Roland83
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 19.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.05.2017, 20:18     Titel:
  Antworten mit Zitat      
Hallo zusammen!

Also ich habe mir jetzt folgenden Codeblock gebastelt:
Code:

clc;
clearvars;

[dname, Pfad]=uigetfile('*.txt','txt-Rohdaten-Datei auswählen');

fid = fopen(dname); % öffne Datei
data = {}; % intialisiere zu lesende Daten als leeres Cell Array

key_word = 'START_Z';

while ~feof(fid) % weiter bis zum Ende der Datei
    line = fgetl(fid); % Zeile auslesen
    k = strfind(line, key_word);
    if k == 1
        data = textscan(line, '%s');
        fclose(fid);
        break
    end
     
end

celldisp(data);
 


Damit wird die txt-Datei zeilenweise nach dem key_word durchsucht. Wird die Zeichenkette gefunden, wird die Zeile in ein (verdammtes) cell array geschaufelt.

Ich hasse cell arrays, weil ich mit denen nicht umgehen kann... Embarassed

das Ergebnis ist jedenfalls

data{1}{1} =

START_Z=4.000000000

Soweit, so gut...

Was ich aber eigentlich möchte, ist die Fließkommazahl "4.000000000". Die Zeichenkette davor will ich nicht haben, da ich mit ihr nicht weiter rechnen kann.

Wie bekomme ich also nun die Fließkommazahl als double aus dem cell array??? Question

Ich habe es mit regexp versucht. Ich wollte das cell array so am "="-Zeichen aufteilen. Der erste Teil wäre mir ja egal, denn er würde (jedenfalls theoretisch) "START_Z" lauten. Den zweiten Teil würde ich mir dann in ein double schaufeln und ich hätte was ich wollte... Theoretisch...

Ich habe das regexp wie folgt eingebaut:
Code:
clc;
clearvars;

[dname, Pfad]=uigetfile('*.txt','txt-Rohdaten-Datei auswählen');

fid = fopen(dname); % öffne Datei
data = {}; % intialisiere zu lesende Daten als leeres Cell Array

key_word = 'START_Z';

while ~feof(fid) % weiter bis zum Ende der Datei
    line = fgetl(fid); % Zeile auslesen
    k = strfind(line, key_word);
    if k == 1
        data = textscan(line, '%s');

        expression = '=';
        n = regexp(data, expression, 'spilt');

        fclose(fid);
        break
    end
     
end

celldisp(data);


Die Antowrt von Matlab lautet jedoch leider:
Error using regexp
All cells must be char row vectors.

Error in lineread (line 17)
n = regexp(data, expression, 'spilt');


Das versteh ich nicht bzw. ich finde den Fehler nicht...!? Question Ist das Problem etwa, dass der so abgespaltete Teil tatsächlich die von benötigte Fließkommazahl ist und keine Zeichenvektor, oder was ist hier los?
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: 23.05.2017, 13:23     Titel:
  Antworten mit Zitat      
Hallo Roland83,

Code:

[dname, Pfad]=uigetfile('*.txt','txt-Rohdaten-Datei auswählen');
fid = fopen(fullfile(Pfad, dname)); % Pfad berücksichtigen
key_word = 'START_Z';
data = [];
while ~feof(fid)
    line = fgetl(fid);
    k = strfind(line, key_word);
    if strncmpi(line, 'START_Z', 7)
        data = sscanf(line, 'Start_Z=%g', 1);
        fclose(fid);
        break
    end
end

Du brauchst textscan hier gar nicht. sscanf kann das leichter lösen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 19.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.05.2017, 17:28     Titel:
  Antworten mit Zitat      
Hallo Jan!

Vielen Dank für den Tipp!

Da ich bei Maltlab noch nicht wirklich "sattelfest" bin, wäre ich sehr dankbar, wenn du mir ein Detail kurz erklären würdest:
Was bedeutet das ...%g im Parametersatz von sscanf , und was die "1" am Ende?

Vielen Dank!

Nachtrag:
Ich habe den Code gerade mal getestet. Leider klappt das nicht so wirklich. Wenn den Code step-by-step kompiliere und an der entsprechenden Stelle in der txt-Datei angekommen bin, läuft das Programm, wie vorgesehen, in die if-Bedingung. Dort wird die Zeile korrekt gelesen, jedoch ist die Variable data danach immer noch leer (empty 0x0 double). Lediglich in der Variable line steht der eingelesene String...
Private Nachricht senden Benutzer-Profile anzeigen
 
Roland83
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 19.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.05.2017, 18:01     Titel: Ich hab die bzw. eine Lösung...
  Antworten mit Zitat      
Code:
clc;        %optional
clearvars;  %optional

[dname, Pfad]=uigetfile('*.txt','txt-Rohdaten-Datei auswählen');
fid = fopen(fullfile(Pfad, dname));
key_word = 'START_Z';
data = [];
while ~feof(fid)
    line = fgetl(fid);
    k = strfind(line, key_word);
    if strncmpi(line, key_word, 7)
        data = str2double(extractAfter(line, "="));
        fclose(fid);
        break
    end
end

disp(data); %optional


Es läuft, Problem gelöst! Vielen Dank Jan! Laughing

Jetzt muss ich das alles nur noch in eine case-Anweisung verbasteln, mit der ich mehrere bzw. verschiedene key_word's abfrühsücken kann... Rolling Eyes
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.05.2017, 14:27     Titel: Re: Ich hab die bzw. eine Lösung...
  Antworten mit Zitat      
Hallo Roland83,

Mein Fehler:
Code:
data = sscanf(line, 'Start_Z=%g', 1);
==>
data = sscanf(line, 'START_Z=%g', 1);

Es werden Großbuchstaben benötigt.

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 - 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.