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

Txtfile in dreier Schritten einlesen

 

surfer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 12:01     Titel: Txtfile in dreier Schritten einlesen
  Antworten mit Zitat      
Hallo!

Kurz eine Frage zum Einlesen einer Textfile (ich hoffe ich werde es bald auch ohne Hilfe schaffen Wink )

Ich habe in einer Textfile Daten unterschiedlicher Jahre zusammen gemixt. Ich möchte diese gern auseinanderpuzzeln. Sieht ungefähr so aus:

ID Zeitspanne ID50
1 1985-1987 55
2 1999-2001 54
3 2005-2007 99
4 1985-1987 45
5 1999-2001 36
6 2005-2007 101
7 1985-1987 42
.... usw.

Es sind 158745 Zeilen insgesamt.
Kleines Skript hab ich auch schon geschrieben. Es funktioniert auch. Ich bekomme allerdings immer eine Fehlermeldung nachdem die Schleife durchlaufen wurde.
Code:

fid=fopen('F:\Data\allYears_Run1.txt','r');
input=textscan(fid,'%d %s %d','headerlines',1,'delimiter',',');
fclose(fid);

%aus String Zahl machen
period1=strrep(period,'"1985-1987"','1985');
period1=strrep(period1,'"1999-2001"','1999');
period1=strrep(period1,'"2005-2007"','2005');

period2=str2double(period1);

Data(:,1)=ID;
Data(:,2)=period2;
Data(:,3)=ID50;

%Aussortieren Periode 1985-1987
for i=2:158740;
   
 Data1985(1,:)=Data(1,:);  
 Data1985(i,:)=Data((Data985(i-1,1)+3),:);  

end

%Aussortieren  periode 1999-2001
for i=2:158741;
   
 Data1999(1,:)=Data(2,:);  
 Data1999(i,:)=Data((Data1999(i-1,1)+3),:);  

end

%Aussortieren Periode 2005-2007
for i=2:158742;
   
 Data2005(1,:)=Data(3,:);  
 Data2005(i,:)=Data((Data2005(i-1,1)+3),:);  

end


MAtlab sucht immer nach dem nächsten "+3"-Wert, obwohl ich doch die Schleife nur bis zur i-1 Zahl laufen lasse!? Zudem ist das alles auch ein bisschen umständlich geschrieben und frisst viel Rechenzeit. Gibts da noch einen anderen Weg?


_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 23.02.2011, 13:19     Titel:
  Antworten mit Zitat      
Hallo surfer,
was für eine Fehlermeldung? und nachdem WELCHE schleife durchlaufen wurde?

Poste doch einfach mal die vollständige Fehlermeldung.

Zitat:

obwohl ich doch die Schleife nur bis zur i-1 Zahl laufen lasse!?

wo tust du das? deine Schleifen laufen bis 158740, bzw. 158741, bzw. 158742

p.s.: was beinhaltet period/ID/ID50?
in der ersten schleife hast du Data985 stehen... meinst du da nicht eher Data1985?
Irgendwie glaub ich ja nicht so ganz, dass dieser Code so funktioniert...
_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Surfer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 13:39     Titel:
  Antworten mit Zitat      
Matlab bricht nach der ersten for-Schleife ab. Das Ergebnis ist jedoch korrekt. (mit aussortierten 52915 Zeilen)
Führt man die danachfolgenden Schleifen auch noch separat aus, werden die Dateien richtig eingelesen, was mir aber nichts bringt wenn ich zum Beispiel eine Funktion drausbasteln will.

Die Fehlermeldung für die erste Schleife lautet:
??? Attempted to access A1B(158746,Smile; index out of bounds because size(Data)=[158745,3]

Ich versteh den Fehler ja auch: Matlab sucht den nächsten +3-Wert. Was ich nicht verstehe ist, warum Matlab noch weitersucht, obwohl ich ganz klar das Ende der Schleife angegeben habe.

Und ja:da ist ein Tipfehler. Es muss 1985 heißen. Ich habe die Bezeichnungen ein bisschen vereinfacht.
 
Surfer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 14:11     Titel:
  Antworten mit Zitat      
also:
für den ersten Zeitraum 1985 lasse ich die Schleife ja bis zur 158740 laufen, da die 158743 die letzte Zahl aus diesem Zeitraum ist, die ich ausgegeben haben möchte.

die frage ist, ob das ganze auch ohne die for-Schleifen-Konstruktion geht?!
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 23.02.2011, 14:57     Titel:
  Antworten mit Zitat      
ALso um die Daten einfach zu filtern und jeweils in einem struct zu sammeln, könnte man das so angehen:

Code:

fid = fopen('allYears_Run1.txt', 'r'); % Datei zum lesen öffnen
structure1985 = {}; % Variable für struct anlegen
structure1999 = {}; % Variable für struct anlegen
structure2005 = {}; % Variable für struct anlegen

while 1 %Endlosschleife
    tline = fgetl(fid); % nächste Zeile einlesen
    if ~ischar(tline),   break,   end % Wenn Dateiende erreicht -> beende Schleife

    line_parts = regexp(tline, '\s', 'split'); %Teile den string(die Zeile) bei
%den Leerzeichen auf
    switch line_parts{2}(1:4) %Unterscheide zwischen den ersten Jahreszahlen
        case '1985'
            index = length(structure1985)+1; %index für neuen Datensatz
            structure1985(index).ID = str2double(line_parts{1}); %ID ablegen
            structure1985(index).ID50 = str2double(line_parts{3}); %ID50 ablegen
        case '1999'
            index = length(structure1999)+1;
            structure1999(index).ID = str2double(line_parts{1});
            structure1999(index).ID50 = str2double(line_parts{3});
        case '2005'
            index = length(structure2005)+1;
            structure2005(index).ID = str2double(line_parts{1});
            structure2005(index).ID50 = str2double(line_parts{3});
    end
end
fclose(fid);
 


Kannst auch alles in ein struct packen. Und Dann Beispielsweise nach dem Jahr filtern.
Oder auch alle ID's und ID50's in ein array packen und dann im struct unterbringen.

Hoffe das bringt dich wieter.
_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?

Zuletzt bearbeitet von _Peter_ am 23.02.2011, 16:49, insgesamt 2-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Surfer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 15:46     Titel:
  Antworten mit Zitat      
Oha! Vielen Dank erstmal für deine Antwort!
So bin ich das noch nie angegangen, aber man lernt ja immer weiter dazu:
also kurz nochmal fürs Verständnis:

-öffnen der Input_Datei und Erstellen von 3 Structs in die die Ergebnisse dann geschrieben werden sollen, jetzt aber noch leer sind!

- Einlesen der Daten als String (verwendest ja fgetl)

- bei den nächsten 3 Zeilen komm ich irgendwie nicht weiter, was da gemacht wird!

- und dann fallunterscheidung:
falls 1985 in array 2, spalte 1:4 (warum 4?- weil der Zeitperiodenstring auseinander genommen wurde?also spalte1= ID, spalte2=Periodestart, spalte3=periodeende, spalte4=ID50??),
dann wandle die strings des jeweiligen Parameters in double um

-analog wird dann für die beiden anderen Zeitperioden verfahren

hab ich das soweit richtig verstanden? wills eben auch richtig verstehen und nicht bloß abtippen!
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 23.02.2011, 16:57     Titel:
  Antworten mit Zitat      
Ja du hast es soweit richtig verstanden.
Ich habe jetzt nochmal den Code im oberen post ein bisschen kommentiert.

weiterhin:

fgetl zieht immer die nächste Zeile aus dem Textdokument. (IMMER NUR EINE ZEILE!)
Wenn das Ende des Dokuments erreicht ist gibt getl eine -1 zurück. Das ist dann kein string mehr deswegen die prüfung
Code:

if ~ischar(tline),   break,   end
 

um bei Dateiende die Endlosschleife wieder zu verlassen.

Code:

line_parts = regexp(tline, '\s', 'split');
 

teilt den string bei den Leerzeichen.
Sprich aus
'1 1985-1987 55'
wird
'1' '1985-1987' '55' (Achtung, die Werte werden als cell zurückgegeben!)

Code:

line_parts{2}(1:4) %Geschweifte Klammer greift bei cell auf den Inhalt zu!
 

ist folglich nur die Zahl 1985. man kann aber auch den kompletten string vergleichen. Ich habe mich einfach nur an deinem beispiel orientiert wo du nur die erste Jahreszahl in betracht ziehst.

p.s.: Es ist immer gut es auch selbst verstehen zu wollen Wink
_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Surfer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.02.2011, 15:15     Titel:
  Antworten mit Zitat      
Vielen Dank...Ich konnte es gut in mein Script einbasteln und es funktioniert auch! Super!

Toll auf wievielen verschiedenen Wegen man in Matlab ein Problem lösen kann!
 
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.