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

Text einlesen mit textscan

 

lukel
Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 27.08.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 09.02.2016, 14:32     Titel: Text einlesen mit textscan
  Antworten mit Zitat      
Hallo,

ich habe eine Textdatei, die aus einem Header und danach einer nicht festgelegten Zahl an Spalten mit Messwerten besteht.

Nachdem ich den Header eingelesen habe, entspricht die Länge der Variable E genau der Spaltenanzahl der Messwerte.

Dann lese ich die Daten Wert für Wert wie folgt in die Matrix Zeitreihe ein

Code:

 for j=1:100000000
     for i=1:length(Kanal)
         data=textscan(fid,'%s',1);
         da=cell2mat(data{1,1});
         if isempty(da)
             break;
         end
       
         Zeitreihe(j,i)=str2double(cell2mat(data{1,1}));
     end
     
     if isempty(da)
         break;
     end
   
 end
 


Das dauert bei 40.000 Zeilen und 24 Spalten allerding 777 Sekunden.

Wenn ich die Werte jetzt Zeile für Zeile einlese:

Code:

for j=1:100000000
   
         data=textscan(fid,'%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s',1);
         da=cell2mat(data{1,1});
         if isempty(da)
             break;
         end
    for i=1:length(E)
         Zeitreihe(j,i)=str2double(cell2mat(data{1,i}));
    end

 end
 


Dann dauert das ganze nur noch 100 Sekunden, was ja schonmal deutlich besser ist!!

Problem dabei ist nur, dass die Spaltenanzahl variieren kann und ich damit nicht von vorneherein weiß wie viele " %s " ich brauche.

Hat da jemand eine Idee wie ich die Anzahl an %s variabel in den textscan schreiben kann?

Liebe Grüße

lukel
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 09.02.2016, 16:47     Titel:
  Antworten mit Zitat      
Code:

grüße
_________________

richtig Fragen
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: 10.02.2016, 11:41     Titel: Re: Text einlesen mit textscan
  Antworten mit Zitat      
Hallo lukel,

Eine Pre-allocation ist viel effizienter als ein Array iterativ wachsen zu lassen.
Wie wäre es, die Daten gleich als Zahlen einzulesen?

Code:
FirstLine = fgetl(fid);
% Get first
Value = sscanf(FirstLine, '%g ', [1, inf]);
n      = numel(Value);
Data = fscanf(fid, '%g', [n, inf]).';
Data = cat(1, Value, Data);


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 27.08.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 11.02.2016, 09:11     Titel:
  Antworten mit Zitat      
also den Hinweis von Winkow versteh ich nicht. Weiß nicht wie mir das bei meinem Problem helfen soll Very Happy

Und auch Jan's Lösung konnt ich noch nicht nachvollziehen. Da werde ich aber erst noch das Wochenende drüber nachdenken, bevor ich dazu Fragen stelle
Private Nachricht senden Benutzer-Profile anzeigen
 
lukel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 27.08.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 25.02.2016, 11:09     Titel:
  Antworten mit Zitat      
Hey Jan,

erstmal großes Dankeschön!!!

ich hatte jetzt ne Datei mit 108 Spalten und da hat das Werte einzeln einlesen 3355 Sekunden gedauert.

Dein Vorschlag hat erst immer nicht funktioniert, weil ich noch ein Header über den Daten habe.
Jetzt rufe ich zuerst 13 mal hintereinander FirstLine = fgetl(fid); auf um in der richtigen Zeile zu sein (Das geht doch bestimmt auch noch anders?) und lasse dann den Rest durchlaufen und dann sind die Daten in 6 Sekunden eingelesen Very Happy

Da ich aber auch genau verstehen möchte was da passiert erzähl ich jetzt zu jedem Funktionsschritt etwas und es wäre nett wenn du falsche Sachen berichtigst Smile

also fgetl liest immer Zeile ein in der wir uns grade befinden und beim nächsten Aufruf liest er die nächste Zeile ein... da wäre noch die Frage ob man ihn gleich in Zeile 13 starten lassen kann?

sscanf liest den String FistLine ein vom ersten bis zum letzten Element in eine Zeile ein. Nimmt der automatisch als Trennzeichen das Leerzeichen ?

numel gibt die Spaltenanzahl von Value an. Hätte ich da auch length(Value) verwenden können oder kann es da probleme geben?

fscanf liest jetzt fid weiter Zeile für Zeile ein. Dazu hab ich jetzt ne Frage zu der eckigen Klammer: der erste Wert ist die Anzahl an Werten die er pro Zeile lesen soll und der Zweite, dass bis zum Ende der Datei gelesen werden soll?

und cat fügt Value (die erste Zeile) vor Data an.

Gruß

Lukel
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: 25.02.2016, 12:50     Titel:
  Antworten mit Zitat      
Hallo lukel,

Gerne!

Zitat:
Jetzt rufe ich zuerst 13 mal hintereinander FirstLine = fgetl(fid); auf um in der richtigen Zeile zu sein (Das geht doch bestimmt auch noch anders?)

Nein, das geht nicht anders. In textscan kann man zwar die Anzahl der Header-Zeilen definieren, intern wird dann aber auch 13 Mal fgetl aufgerufen.
Zitat:
da wäre noch die Frage ob man ihn gleich in Zeile 13 starten lassen kann?

Es gibt keine Möglicheit heraus zu finden, wo die 13.te Zeile ist, wenn man nicht Zeile für Zeile einliest.

Zitat:
sscanf liest den String FistLine ein vom ersten bis zum letzten Element in eine Zeile ein. Nimmt der automatisch als Trennzeichen das Leerzeichen ?

sscanf liest aus einem String, fscanf aus einem File. Die Trennzeichen richten sich nach dem verwendeten Format-String. Lies mal in der Dokumentation nach, denn das Thema ist umfangreich.

Zitat:
numel gibt die Spaltenanzahl von Value an. Hätte ich da auch length(Value) verwenden können oder kann es da probleme geben?

Bei Vektoren ist numel und length identisch. Bei Arrays ist length tückisch und man sollte size(X, Dim) verwenden, um immer genau fest zu legen, welche Dimension man meint. Um generell Problemen mit length zu entgehen, benutze ich den Befehl nicht, sondern schreibe lieber explizit size oder numel .

Zitat:
fscanf liest jetzt fid weiter Zeile für Zeile ein. Dazu hab ich jetzt ne Frage zu der eckigen Klammer: der erste Wert ist die Anzahl an Werten die er pro Zeile lesen soll und der Zweite, dass bis zum Ende der Datei gelesen werden soll?

Genau.

Zitat:
und cat fügt Value (die erste Zeile) vor Data an.

Exakt.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 27.08.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 25.02.2016, 16:55     Titel:
  Antworten mit Zitat      
Danke Smile

was ist der Unterschied zwischen string und file?
ich weiß das String textdatein sind.

Noch eine andere Frage: In einem anderen Profjekt lese ich die Daten auch mit textscan ein, aber vllt. kann ich das auch hiermit beschleunigen.

Code:

fid=fopen('Beispiel.txt');

FirstLine = fgetl(fid);

Value = sscanf(FirstLine, '%g ', [1, inf]);
n      = numel(Value);

Data = fscanf(fid, '%g', [n, inf]).';
Data = cat(1, Value, Data);
 


Ich verwende den gleichen Code wie eben, nur sind in Beispiel.dat die Spalten nicht durch Leerzeichen sondern (ich denke) durch einen Tabulator getrennt.
Dann stehen in "FirstLine" alle Zahlen hintereinander ohne Leerzeichen dazwischen und dann kommt sscanf nicht mehr klar und macht Mist.

Wenn du dir die Datei mal anschauen möchtest, ich habe sie angehängt.

MfG
lukel

Beispiel.txt
 Beschreibung:

Download
 Dateiname:  Beispiel.txt
 Dateigröße:  14.79 KB
 Heruntergeladen:  436 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: 26.02.2016, 12:09     Titel:
  Antworten mit Zitat      
Hallo lukel,

Zitat:
was ist der Unterschied zwischen string und file?
ich weiß das String textdatein sind.

Ein String ist ein Vektor vom Typ char . Ein File ist ein File auf der Festplatte. Filenamen sind Strings. Man kann ein File per fileread in einenString importieren. Man kann ein String in ein File schreiben, s.B. per fprintf oder fwrite .

Zitat:
Dann stehen in "FirstLine" alle Zahlen hintereinander ohne Leerzeichen dazwischen und dann kommt sscanf nicht mehr klar und macht Mist.

Bitte beschreibe, was Du mit "Mist" meinst. Wenn man nur den Code sieht, wird Matlab bestimmt das tun, was der Code vorschreibt. Warum das dann nicht Deinen Erwartungen entspricht, muss man explizit dazu sagen. Denn der Code an sich ist ja nicht "falsch".

Das Problem an Deinem File dürften die Dezimal-Kommas sein, denn Matlab erwartet Dezimal-Punkte. Das lässt sich leicht lösen, suche dazu mal in diesem Forum oder im Netz.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 27.08.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 26.02.2016, 14:42     Titel:
  Antworten mit Zitat      
Jap es war das Problem, dass die Kommas durch Punkte ersetzt werden müssen.

Ich habe hier im Forum eine Funktion gefunden, die mir hilft. Allerdings krieg ich bei großen Dateien ein OUT OF MEMORY. Aber zu dem Problem mach ich lieber mal nen neuen Thread auf.
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.