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

Textscan liest nur erste Zeile aus Tabelle aus

 

Ferp
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 01.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2011, 10:12     Titel: Textscan liest nur erste Zeile aus Tabelle aus
  Antworten mit Zitat      
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:

Code:

clear;
fid=fopen('Test.txt');
A=textscan(fid,'%s',17,'delimiter','\t');
fclose(fid);
 


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.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.10.2011, 17:13     Titel:
  Antworten mit Zitat      
Hallo,

was erwartest du denn? Mit dem Befehl liest du eben 17 Strings aus.

Einfacher wäre es übrigens, wenn du einen kleinen Ausschnitt der Datei postest.

Wenn du mit numerischen Daten rechnen willst, solltest du zum Auslesen '%f' verwenden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Ferp
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 01.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.10.2011, 08:56     Titel:
  Antworten mit Zitat      
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.

Hier also ein Ausschnitt aus meiner Datei:

Kanal1 Kanal2 Kanal3 ...
Einheit1 Einheit2 Einheit3 ...
-359.50 1.154 1.144 -0.078 1.016 6.847 -0.032 0.070 1.227 1.065 0.105 0.020 53.935 8.356 14.111 8.055
-359.40
-359.30
-359.20
-359.10
-359.00 1.128 1.101 -0.044 1.016 1.313 6.988 -0.019 -0.007 1.201 1.142 0.105 -0.031 54.159 7.953 14.290 7.068
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.10.2011, 10:10     Titel:
  Antworten mit Zitat      
Hallo,

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.)

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Ferp
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 01.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.10.2011, 11:19     Titel:
  Antworten mit Zitat      
Danke für Deine Antwort!

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:

-30.00 11.117 11.398 -0.060 1.009 1.319 0.005 5.155 0.006 11.258 10.840 0.101 -0.005 4.079 9.118 15.902 28.335
-29.90 11.152 11.432 11.301 10.882
-29.80 11.203 11.484 11.352 10.916
-29.70 11.246 11.543 11.395 10.968
-29.60 11.297 11.603 11.454 11.010
-29.50 11.348 11.646 -0.069 1.010 0.031 5.193 0.006 11.497 11.036 0.103 -0.005 3.944 8.939 15.902 26.181
-29.40 11.391 11.689 11.540 11.087
-29.30 11.433 11.740 11.582 11.121
-29.20 11.468 11.783 11.633 11.164
-29.10 11.510 11.826 11.676 11.224
-29.00 11.561 11.886 -0.065 1.010 1.321 0.005 5.283 0.006 11.727 11.267 0.103 -0.018 3.989 8.849 15.902 24.207
-28.90 11.596 11.929 11.770 11.301
-28.80 11.638 11.980 11.812 11.352
-28.70 11.681 12.023 11.855 11.386
-28.60 11.732 12.066 11.889 11.429
-28.50 11.775 12.117 -0.047 1.010 -0.007 5.488 0.006 11.940 11.480 0.103 -0.005 3.855 8.849 16.261 22.008

Hier müsste ich die leeren Felder mit den Vorwerten füllen.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.10.2011, 12:11     Titel:
  Antworten mit Zitat      
Hallo,

schauen wir uns mal den "regulären" Teil an. Da geht, ähnlich wie vorhin von dir, etwa so:
Code:
fid=fopen('data123.txt');
A=textscan(fid,repmat('%f', 1, 16),'delimiter','\t', 'headerlines', 2);
fclose(fid);


Was mich verwundert: in der Zeile für 359 steht ein Wert mehr als in der für 359,5. Ist das so gedacht? Wie soll die Zuordnung erfolgen?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Ferp
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 01.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.10.2011, 09:40     Titel:
  Antworten mit Zitat      
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
                 
             
             end
fclose(fid);  

 


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?

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.10.2011, 20:12     Titel:
  Antworten mit Zitat      
Hallo,

der Code sieht ja schlimm aus Wink 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



Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Ferp
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 01.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.10.2011, 15:00     Titel:
  Antworten mit Zitat      
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?

Danke für deine Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.10.2011, 18:53     Titel:
  Antworten mit Zitat      
Hallo,

dazu würde ich einen Formatstring aus %f und %*f zusammensetzen.
Beispiel: mich interessieren von 17 Spalten nur die Spalten 3 und 10:
Code:
fmt = '%*f  %*f  %f %*f %*f %*f %*f %*f %*f %f  %*[^\n]'


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Ferp
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 01.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.10.2011, 10:24     Titel:
  Antworten mit Zitat      
Wo soll ich diese Zeile integrieren? fmt hab ich in meiner Matlabhilfe nicht gefunden...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.10.2011, 22:01     Titel:
  Antworten mit Zitat      
Hallo,

die Zeile vor den textscan-Befehl setzen, und dann im textscan-Befehl
statt repmat('%f', 1, 17) die Variable fmt (für Format) setzen.

Code:
A = [];
fmt = '%*f  %*f  %f %*f %*f %*f %*f %*f %*f %f  %*[^\n]'  
for i=1:Messungen                
A=[A; cell2mat(textscan(fid, fmt, 'delimiter' , '\t', 'headerlines', 3));                    
end  


Natürlich musst du das noch anpassen, da du ja nicht unbedingt genau die 3. und 10. Spalte haben willst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Ferp
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 01.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.10.2011, 16:41     Titel:
  Antworten mit Zitat      
Deine Geduld mit mir kennt keine Grenzen Smile
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:

Code:

C=A(:,2:6);
leerzeilenvektor=ismember(C,[0 0 0 0 0],'rows');
leerzeilenmatrix=repmat(leerzeilenvektor,length(A),6);
A(~leerzeilenmatrix)=[];
 


Hier tritt der Fehler "Index of element to remove exceeds matrix
dimensions" auf.
Wie kann ich es richtig machen?

Liebe Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.10.2011, 16:57     Titel:
  Antworten mit Zitat      
Hallo,

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:

Code:
A( all(A(:, 2:6) == 0,2) , : ) = [];


Um herauszufinden, warum Code scheitert, hilft oft ein Blick auf die Dimensionen und Datentypen der Variablen, z.B. im Workspace Browser.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Ferp
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 01.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.10.2011, 18:01     Titel:
  Antworten mit Zitat      
Herzlichen Dank, Du hast mir sehr geholfen!
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.