|
|
Text einlesen mit textscan |
|
lukel |

Forum-Anfänger
|
 |
Beiträge: 39
|
 |
|
 |
Anmeldedatum: 27.08.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2015b
|
 |
|
|
 |
|
Verfasst am: 09.02.2016, 14:32
Titel: Text einlesen mit textscan
|
 |
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
Das dauert bei 40.000 Zeilen und 24 Spalten allerding 777 Sekunden.
Wenn ich die Werte jetzt Zeile für Zeile einlese:
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
|
|
|
|
|
Winkow |

Moderator
|
 |
Beiträge: 3.842
|
 |
|
 |
Anmeldedatum: 04.11.11
|
 |
|
 |
Wohnort: Dresden
|
 |
|
 |
Version: R2014a 2015a
|
 |
|
|
 |
|
Verfasst am: 09.02.2016, 16:47
Titel:
|
 |
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 10.02.2016, 11:41
Titel: Re: Text einlesen mit textscan
|
 |
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?
Gruß, Jan
|
|
|
lukel |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 39
|
 |
|
 |
Anmeldedatum: 27.08.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2015b
|
 |
|
|
 |
|
Verfasst am: 11.02.2016, 09:11
Titel:
|
 |
also den Hinweis von Winkow versteh ich nicht. Weiß nicht wie mir das bei meinem Problem helfen soll
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
|
|
|
lukel |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 39
|
 |
|
 |
Anmeldedatum: 27.08.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2015b
|
 |
|
|
 |
|
Verfasst am: 25.02.2016, 11:09
Titel:
|
 |
|
 |
|
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
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
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
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 25.02.2016, 12:50
Titel:
|
 |
|
 |
|
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
|
|
|
lukel |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 39
|
 |
|
 |
Anmeldedatum: 27.08.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2015b
|
 |
|
|
 |
|
Verfasst am: 25.02.2016, 16:55
Titel:
|
 |
Danke
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.
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
Beschreibung: |
|
 Download |
Dateiname: |
Beispiel.txt |
Dateigröße: |
14.79 KB |
Heruntergeladen: |
436 mal |
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 26.02.2016, 12:09
Titel:
|
 |
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
|
|
|
lukel |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 39
|
 |
|
 |
Anmeldedatum: 27.08.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2015b
|
 |
|
|
 |
|
Verfasst am: 26.02.2016, 14:42
Titel:
|
 |
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.
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|