Verfasst am: 01.10.2011, 10:12
Titel: Textscan liest nur erste Zeile aus Tabelle aus
Hallo erstmal!
Ich darf mich seit kurzem intensiver mit Matlab auseinandersetzen und bin bei der ersten komplexeren Aufgabe auch gleich an der ersten Hürde gescheitert ^^
Mein Problem ist folgendes:
Ich möchte eine .txt-Tabelle einlesen (durch Tab getrennte Einträge), die aus einer Aneinanderreihung von Einzelmessungen bzw. Einzeltabellen besteht:
Ü1
ü1_1 ü1_2 ... ü1_7
[einheit1] ... [einheit17]
zahl leer ... zahl
.
.
.
Leerzeile
Ü200
ü200_1 ü200_2 ... ü200_17
[einheit1] ... [einheit17]
zahl zahl ... leer
.
.
.
Ü=Überschrift Messung
ü=Messkanal
Die gesamte Datei hat 1,4 Mio Zeilen. Darunter sind Leerzeilen und Leerzellen, die es zu löschen bzw mit Vorwerten zu füllen gilt. Weiterhin habe ich die Werte der ersten Spalte so zu manipulieren, daß aus den hintereinander aufgenommenen Einzelmessungen eine fortlaufende Gesamtmessung wird.
Doch jetzt erstmal zu meinem (ersten) Problem. Ich versuche diese Datei mit textscan auszulesen. Dabei gehe ich wie folgt vor:
Ich habe verschiedene Varianten probiert, doch jedesmal wird nur die erste Zeile ausgelesen. A ist dann eine 17x1-Matrix im Workspace.
Was mache ich falsch? Ich nutze Matlab-Version 2007b und 2008a.
Danke für Deine Antwort Harald!
Ich habe mir das folgendermaßen vorgestellt: Analog zu http://www.mathworks.de/help/techdoc/ref/textscan.html Example 2 Reading Different Types of Data
wollte ich spaltenweise Daten aus meiner Tabelle auslesen. Wenn ich so verfahre, wie im obigen Beispiel, dann wird allerdings bloß die erste Zeile, nicht aber jede Spalte ausgelesen.
warum mit deinem Beispiel nur die eine Zeile ausgelesen wird, habe ich ja bereits geschrieben.
Bei dieser Datei ist nun noch das Problem, dass das Format der numerischen Daten nicht konsistent ist. Benötigst du die einzelnen Zahlen auch, oder nur die vollständigen Zeilen? Falls letzteres, weißt du vorab, wo die vollständigen Zeilen stehen? (z.B. jede 5.)
Warum nur die erste Zeile ausgelesen wird, hast du geschrieben. Es wäre sehr nett, wenn du mir auch zeigen könntest (falls dies so einfach möglich ist) wie ich den Befehl grundsätzlich zu formulieren habe, damit die gesamten Spalten gelesen werden.
Ich benötige die (bis auf die erste Spalte) leeren Zeilen nicht. Diese treten wie oben periodisch auf (jede 5. Zeile ist gefüllt).
AUSNAHME:
Die erste Spalte erstreckt sich für eine Messung von -360 bis +360. Im Bereich von -30 bis +90 sieht die Tabelle allerdings folgendermaßen aus:
Deine letzte Antwort hat mir sehr geholfen, danke dafür!
Mittlerweile bin ich soweit, daß ich mit Hilfe einer for-Schleife sämtliche Messungen (insgesamt 200) aus der .txt-Datei auszulesen versuche. Die Struktur ist immer dieselbe.
Code:
clear;
Messungen=200;
fid=fopen(200Messungen.txt');
Aalt=cell(1,17); %Aalt übernimmt A (if) bzw. Aneu(else) und wird beim nächstem Schleifendurchgang
%innerhalb des Vektors wieder über A geschrieben, um alles in einem Vektor zu haben
for i=1:Messungen
if i<=1
A=textscan(fid,repmat('%f', 1, 17),'delimiter','\t', 'headerlines', 3);
Aalt=A;
else
A=textscan(fid,repmat('%f', 1, 17),'delimiter','\t', 'headerlines', 3);
Aneu={[Aalt(1,1);A(1,1)][Aalt(1,2);A(1,2)][Aalt(1,3);A(1,3)][Aalt(1,4);A(1,4)]... [Aalt(1,5);A(1,5)][Aalt(1,6);A(1,6)][Aalt(1,7);A(1,7)][Aalt(1,8);A(1,8)]... [Aalt(1,9);A(1,9)][Aalt(1,10);A(1,10)][Aalt(1,11);A(1,11)][Aalt(1,12);A(1,12)]... [Aalt(1,13);A(1,13)][Aalt(1,14);A(1,14)][Aalt(1,15);A(1,15)][Aalt(1,16);A(1,16)]... [Aalt(1,17);A(1,17)]};
Aalt=Aneu;
end
Ziel ist es, die generierten Vektoren für die Messkanäle mit allen Messwerten zu füllen. Ich stehe vor dem Problem, daß zwar sämtliche Messungen ausgelesen werden, die Spalten aber mit meiner Strukturierung nicht innerhalb eines einzigen Vektors untereinander aufgelistet werden, sondern verschachtelt in mehreren Zellen stehen.
Kannst du mir zeigen, wie man es richtig macht?
der Code sieht ja schlimm aus Aber toll, dass du dich da durchgebissen hast!
Da du nur Doubles in den Cell Arrays hast, könntest du das mit cell2mat umwandeln und die verschiedenen Teile direkt untereinanderhängen.
Wenn du A = [] initialisierst, wirst du sogar noch die Fallunterscheidung los.
Etwa so:
Code:
A = [];
for i=1:Messungen
A=[A; cell2mat(textscan(fid,repmat('%f', 1, 17), 'delimiter' , '\t', 'headerlines', 3));
end
Ja, das ist wirklich "etwas eleganter"...
Gibt es eine Möglichkeit, während der Erstellung von A gewisse Spalten aus der Textdatei zu überspringen?
Ich weiß, daß textscan das grundsätzlich kann; lässt sich das auf repmat übertragen?
Deine Geduld mit mir kennt keine Grenzen
Ich hoffe, ich kann sie nochmal strapazieren.. Bis jetzt hat alles soweit gut geklappt. Ich versuche jetzt nur noch die Zeilen aus der Matrix (A) zu löschen, deren Einträge bis auf den ersten 0 sind.
Dazu erstelle ich einen Hilfsvektor C, der A ohne erste Spalte entspricht. Mit Hilfe von ismember erstelle ich einen logischen Leerzeilenvektor. Diesen möchte ich auf die größe von A vervielfachen, um dann die Leerzeilen aus A zu entfernen:
mir ist nicht ganz klar, was du dir bei dem Code denkst. Das Replizieren ist jedenfalls nicht nötig, da ein logischer Vektor auch als Zeilenindex verwendet werden kann.
Um Zeilen mit ausschließlich Nullen (außer in Spalte 1) zu löschen, würde ich so vorgehen:
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.