folgendes: Ich bin gerade dabei ein Programm zur Auswertung von Messreihen aus einer Apparatur zu schreiben. Die Messdaten liegen mit *.dat-dateien vor.
In den Dateien sind die daten in verschiedene Kanäle unterteilt. Jede Spalte repräsentiert ein Kanal. Das dumme ist nun das jedes Experiment unterschiedlich viele Kanäle hat. Mal sind es 4, mal sind es 10, aber es sind nie mehr als 14.
Jede Zeile ist durch ein Zeilenumbruch beendet und die Spalten sind durch ein "tab" getrennt.
Das auslesen ist soweit gelöst, auch das zusammenstellen. Das dumme ist nun, das die Lösung extrem unelegant ist.
Wenn die Variable Pfad, der Pfad zu meiner Datei (form: C:\...\*.dat) ist, dann lautet meine Lösung:
Wobei data dann eine erzeugte Matrix aus Strings ist, mit den Inhalt der Datei. Es müssen Strings sein, da dies für den weiteren Algorithmus von bedeutung ist.
Für diese hässlichen, riesigen If-Schleifen hätte ich gerne eine elegante Lösung. Mir will partu nichts einfallen. Hat da wer eine Idee?
Den Cell String "data" könntest Du hinterher in das gewünschte Formt umwandeln. Matlab empfiehlt TEXTREAD durch das neuere TEXTSCAN zu ersetzen.
Gruß, Jan
Gast_Matlab
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.10.2011, 13:19
Titel:
Hi,
Ja, ich weis das Matlab textread durch textscan ersetzen möchte, allerdings birgt textscan andere Probleme.
Ursprünglich hab ich damit auch gearbeitet, nur erzeugen dann files die eben nicht soviele Spalten/Kanäle haben, wie im Befehl vorgegeben, ein Error bzw. werden ignoriert.
Die vorgeschlagene Lösung hab ich ausprobiert, diese funktioniert leider nicht. Die ignoriert meine Files komplett. Liest nicht ein einziges File aus.
Ich benutze textread um dies zu umgehen. Es ist in mein Fall einfach der bessere Befehl. Dieser ermöglicht mir nehmlich auch Spalten/Kanäle aus zu lesen die eigentlich gar nicht da sind.
Dies beantwortet auch hoffentlich die andere Frage. Spalten/Kanäle die leer sind, wurden nicht benutzt ... und enthalten natürlich auch kein einzigen Eintrag. Da die im File gar nicht gespeichert werden.
Das file ist im Allgemein wie folgt augebaut:
Es handelt sich um mehrere Spalten, mit um die 4000 Einträge im Schnitt. Die haben z.b. Zeitangaben (Format: HH:MM:SS dd.mm.yyyy [Zeit Datum]), Zeilen mit Überschriften, Lücken, Leerzeilen und eben Messwerte. Alles was keine Zeitangabe und MEsswerte sind werden in den folgenden Schritten entfernt, dafür hab ich schon eine Lösung.
Die Lücken und das mehrfache Auftreten der überschriften kommt dadurch zustande das die Messreihen direkt aus der Apparatur aufgenommen wurden, man sieht daher z.b. Unterbrechungen, die Systemzeit oder schlichtweg datenverluste beim Übertragen.
Ein Beispiel mag ich nicht uploaden, da ich nicht weis ob ich diese veröffentlichen darf. Und ich werd das Risiko nicht eingehen, dafür eventuel Ärger zu bekommen ...
Die vorgeschlagene Lösung hab ich ausprobiert, diese funktioniert leider nicht. Die ignoriert meine Files komplett. Liest nicht ein einziges File aus.
Dann ist darin offensichtlich ein Bug enthalten. Statt die ganze Lösung über Bord zu werfen, sollte man lieber diesen Bug beheben: TEXTSCAN nimmt als ersten Input die FID entgegen. Wenn es ein String ist, wird der nicht als File-Namen, sondern als String interpretiert.
Es wäre hilfreich, wenn Du wenigstens ein paar Zeilen aus den Files posten könntest. Dann könnten wir nämlich unsere Vorschläge testen, bevor wir sie posten. Wenn Du ein paar zahlen änderst und die Überschriften durch "A", "B" etc änderst, wird das kaum mit dem Urheberrecht kollidieren.
Hi,
ich Stelle mal die Behauptung auf, dass die *.dat Datei (eigentlich wahrscheinlich ASCII) nie leere Spalten enthält.
Dann hast du mehere Möglichkeiten:
1. lies die Datei binär character für character:
>die Anzahl der Werte 13 (==ENTER) ist Zeilenzahl, also Zahl der Messungen.
-->Du hast also Zeilen identifiziert
>die Zahl der Werte 9 in einer Zeile ist die Zahl der Tabs, somit ist die Anzahl der Neunen plus eins= Spaltenzahl
--> Jetzt musst du daraus nur noch nen array machen
Das klingt nach großem Rechenaufwand ist aber relativ schnell.
2. Lies doch einfach Zeile für Zeile ein und trenn' die Spalten an den Tabs
>hier auch wieder NUM_TABS+1 =Spalenzahl
3. In scilab gibt es eine subroutine zum einlesen (aus einer Datei) von arrays die nur aus Zahlen bestehen. Guck mal ob es das in matlab auch gibt.
4. Gibt es keine Routine die Excel-kompatible files liest? Denn so, wie du den file beschreibst, ist er Excel-kompatibel.
Wenn du aber bei deiner Lösung bleiben willst, dann ersetz' doch diese Monster-if-Schachtel lieber durch einen logischen Ausdruck. Das kostet zwar mehr Denkzeit, ist aber für nachfolgende Generationen, die dein Programm benutzen wollen einfacher nachzuvollziehen.
Gruß
Kevin
_________________
1000 Buchstaben? Warum nur 6?
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
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.