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

Daten aus Textdatei auslesen, in Matrix speichern

 

Tweety560
Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 23.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2014, 20:27     Titel: Daten aus Textdatei auslesen, in Matrix speichern
  Antworten mit Zitat      
Hallo. Ich weiß, erstmal die FAQ zu dem Thema lesen. Ich verstehe dort die Antwort unter 3. so, dass in hartnäckigen Fällen persönlichen Unvermögens oder komplexerer Dateistrukturen ein Post i. O. ist... Bei beidem bin ich mir unsicher Very Happy

Hier also die Frage. Meine .txt-Datei hat 10MB und die folgende Struktur (Ausschnitt):
Code:
Ausgabedatei Z88O3.TXT : Spannungen, erzeugt mit Z88R V15.0
                         **********
 
bei isoparametrischen Elementen Berechnung der Spannungen in den Gausspunkten
4 Punkte pro Achse/Element
Berechnung der Vergleichsspannungen nach Gestaltsaenderungsenergie-Hypothese fuer Elemente 3 + 6
sowie fuer Gausspunkte der Elemente 1,7,8,10,11,12,14 bis 24
 
Element # = 1     Typ = 10-K Tetraeder
XX         YY         ZZ         SIGXX       SIGYY       SIGZZ       TAUXY       TAUYZ       TAUZX       SIGV
-9.16E-001 -1.34E+000 -1.55E+001 -2.348E+002 -6.122E+002 -8.470E+002 +2.775E+001 -7.463E+002 +4.609E+001 +1.402E+003
-9.16E-001 -1.01E+000 -1.61E+001 -2.326E+002 -8.712E+002 -6.659E+002 +6.073E+001 -9.053E+002 +5.588E+001 +1.673E+003
-1.12E+000 -9.70E-001 -1.56E+001 -2.204E+002 -5.311E+002 -7.592E+002 +5.386E+001 -7.617E+002 +6.649E+001 +1.408E+003
-1.25E+000 -1.01E+000 -1.61E+001 -1.539E+002 -7.902E+002 -6.278E+002 +1.116E+002 -9.038E+002 +7.311E+001 +1.683E+003
 
Element # = 2     Typ = 10-K Tetraeder
XX         YY         ZZ         SIGXX       SIGYY       SIGZZ       TAUXY       TAUYZ       TAUZX       SIGV
-9.55E-001 +2.81E+001 -9.37E+000 +3.136E+000 +5.592E+002 +1.237E+002 -2.405E-001 -7.487E+002 -1.729E-001 +1.392E+003
-6.28E-001 +2.92E+001 -8.75E+000 -3.654E+000 +5.149E+002 +1.287E+002 +3.891E-001 -7.360E+002 +1.297E-001 +1.357E+003
-1.28E+000 +2.89E+001 -8.10E+000 -1.710E+000 +4.733E+002 +1.164E+002 +4.568E-001 -7.400E+002 -1.415E-001 +1.351E+003
-2.02E+000 +2.89E+001 -9.18E+000 +7.540E-001 +5.450E+002 +1.326E+002 +4.156E-001 -7.418E+002 +3.872E-003 +1.376E+003
 
Element # = 3     Typ = 10-K Tetraeder
XX         YY         ZZ         SIGXX       SIGYY       SIGZZ       TAUXY       TAUYZ       TAUZX       SIGV
-2.90E+000 -2.04E-002 -1.58E+001 -9.717E+001 -5.870E+001 -9.609E+001 +2.046E+002 -9.020E+002 +8.277E+000 +1.602E+003
-2.56E+000 -2.04E-002 -1.58E+001 -2.260E+002 -2.290E+002 -1.920E+002 +3.363E+002 -7.290E+002 +8.982E+000 +1.391E+003
-2.90E+000 -2.14E-001 -1.55E+001 +4.811E+001 +5.761E+001 -2.021E+002 +7.346E+001 -1.074E+003 +8.384E+000 +1.881E+003
-2.90E+000 +1.07E-001 -1.54E+001 +1.244E+002 +2.264E+002 +3.938E+002 +9.675E+001 -1.181E+003 -8.551E+000 +2.066E+003
 
Element # = 4     Typ = 10-K Tetraeder
XX         YY         ZZ         SIGXX       SIGYY       SIGZZ       TAUXY       TAUYZ       TAUZX       SIGV
-5.70E-001 -4.20E+000 +8.68E+000 +1.658E-001 +4.728E+001 +2.154E+002 +2.764E-001 -9.747E+002 -1.170E+000 +1.700E+003
-4.82E-001 -3.76E+000 +9.52E+000 -4.169E+000 +4.107E+001 +2.361E+002 +3.807E-001 -9.690E+002 -1.368E+000 +1.693E+003
+5.35E-001 -3.96E+000 +9.13E+000 -6.007E-001 +4.548E+001 +2.245E+002 -1.359E-001 -9.709E+002 -8.912E-001 +1.694E+003
-8.30E-002 -4.61E+000 +9.36E+000 +4.195E-001 +7.358E+001 +2.448E+002 -9.689E-001 -9.364E+002 -1.590E+000 +1.636E+003


Ich möchte jetzt eine Matrix erhalten, in der ausschließlich die Zahlen stehen, idealerweise hübsch sauber formatiert. Ist es sinnvoll, bei 10MB großen Dateien sowas zu wollen? Wie muss der Code dazu aussehen?

Ziel ist, den xx, yy und zz durch einen Konturplot Farben zuzuweisen, die sich aus einem der Spannungsvektoren ergeben.

Ich habe mal help fget, help fscanf probiert. Leider werde ich da aus den Beschreibungen nicht schlau Embarassed

Vielen Dank für Eure Hilfe...
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: 24.01.2014, 00:41     Titel:
  Antworten mit Zitat      
Zitat:
Leider werde ich da aus den Beschreibungen nicht schlau

was verstehst du denn nicht? was hast du bis jetzt versucht? welche fehlermeldungen sind aufgetreten? in wie weit weicht das erziehlte ergebniss vom gewünschtem ab?
grüße winkow
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Tweety560
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 23.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2014, 10:24     Titel:
  Antworten mit Zitat      
Hallo Winkow, vielen Dank für die schnelle Reaktion.

nach
Code:
erscheint ja eine "Vorschrift", wie der Befehl zu verwenden ist. Da stehen dann Dinge wie "FID", "Template" und "Size".

Ich verstehe, dass "FID" etwas mit meiner Textdatei zu tun hat, wie in
Code:
FID = fopen ('datei.txt', 'r')

"Template" müsste mit dem Format des Inhaltes der Datei zu tun haben. Aber genau da hängts. Wie gehe ich damit um? Wie muss der fscanf-Befehl für das Beispiel oben aussehen?

"Size" ist wohl optional. Wenn ich das weglasse, versucht die Funktion alles zu erfassen bis die Datei zu ende ist.

Code:
A = fscanf('datei.txt')
muss natürlich einen Fehler liefern, der besagt dass fscanf nicht korrekt benutzt wurde.
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: 24.01.2014, 10:33     Titel:
  Antworten mit Zitat      
hast du schon das FAQ gelesen?
http://www.gomatlab.de/faq-daten-au.....datei-einlesen-t1541.html
es gibt hier im forum sehr viele fragen zum thema daten importieren. guck am besten da nochmal nach. wenn du dann ein wenig eigenen code geschrieben hast und der nicht funktioniert. stelle am besten genaue fragen zum entsprechenden abschnitt.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDread
Forum-Century

Forum-Century


Beiträge: 212
Anmeldedatum: 11.05.11
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 24.01.2014, 10:36     Titel:
  Antworten mit Zitat      
Hallo Tweety,

FID ist der fileidentifier. diesen benötigst du für fscanf.

Code:
fid = fopen('datei.txt');
scanf(fid,format)


Das Format musst du entsprechend festlegen. Das könnte aber bei deiner Datei auch etwas komplexer werden.
Geht es nach dem Ausschnitt mit "Element # = 5" weiter?
Sind diese Blöcke immer von der gleichen Größe (4 Datenzeilen + 2Header?).
Je nachdem kann es auch sinnvoll sein das mit fgetl einzulesen.

Grüße
Chris
_________________

--> Kapieren statt Kopieren <---
____________________________________________________
FAQs sind dazu da, FAQs zu beantworten Wink
Richtig fragen!
Private Nachricht senden Benutzer-Profile anzeigen
 
Tweety560
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 23.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2014, 11:14     Titel:
  Antworten mit Zitat      
Hi Dread,

Die Datei hat insgesamt Einträge für 16.000 Elemente, daher die Dateigröße von 10MB.

Die Blöcke sind aber immer gleich, 1 Leerzeile 2 Headerzeilen, 4 Datenzeilen. Ich muss das nicht so fürchterlich oft machen, d. h. ich könnte die ersten paar Zeilen Text händisch löschen.

Wenn ich das richtig interpretiere, tut fgetl per default nach jeder Zeile abbrechen. Wenn ich das unterbinde (was mir gerade noch nicht gelingt), dann schmeißt der Befehl mir auch den ganzen Text mit in meine Matrix. Richtig?

Ziel ist ja, in meiner Matrix nur Zahlen stehen zu haben. Idealerweise sogar nur Zahlen, für die die Einträge in der Spalte ZZ einen bestimmten Wert annehmen, z. B. 3. Momentan glaube ich aber noch, dass ich alle anderen Einträge durch eine logische Indizierung später rauswerfe.

Ach so, und genau das "Format entsprechend festlegen" ist für den Befehl gerade eins meiner Probleme Sad
Private Nachricht senden Benutzer-Profile anzeigen
 
Tweety560
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 23.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.01.2014, 21:50     Titel:
  Antworten mit Zitat      
Moin nochmal, ich hab jetzt nach längerer Suche ein Beispiel im Netz gefunden, das mir ein bisschen weiter geholfen hat. Aus dem Beispiel konnte ich ahnen, wie das Format spezifiziert werden muss. Aber auch da komme ich nicht so recht weiter, weil die Werte in der Matrix dann nicht denen der Datei entsprechen.

Wie gesagt, kann ich die Datei noch händisch anpassen, so dass dann jeder 7-Zeilen-Block mit einer Leerzeile anfängt und insges. 3 Kopfzeilen hat:
Code:

Element # = 1     Typ = 10-K Tetraeder
 XX         YY         ZZ         SIGXX       SIGYY       SIGZZ       TAUXY       TAUYZ       TAUZX       SIGV
 -9.16E-001 -1.34E+000 -1.55E+001 -2.348E+002 -6.122E+002 -8.470E+002 +2.775E+001 -7.463E+002 +4.609E+001 +1.402E+003
 -9.16E-001 -1.01E+000 -1.61E+001 -2.326E+002 -8.712E+002 -6.659E+002 +6.073E+001 -9.053E+002 +5.588E+001 +1.673E+003
 -1.12E+000 -9.70E-001 -1.56E+001 -2.204E+002 -5.311E+002 -7.592E+002 +5.386E+001 -7.617E+002 +6.649E+001 +1.408E+003
 -1.25E+000 -1.01E+000 -1.61E+001 -1.539E+002 -7.902E+002 -6.278E+002 +1.116E+002 -9.038E+002 +7.311E+001 +1.683E+003

Element # = 2     Typ = 10-K Tetraeder
 XX         YY         ZZ         SIGXX       SIGYY       SIGZZ       TAUXY       TAUYZ       TAUZX       SIGV
 -9.55E-001 +2.81E+001 -9.37E+000 +3.136E+000 +5.592E+002 +1.237E+002 -2.405E-001 -7.487E+002 -1.729E-001 +1.392E+003
 -6.28E-001 +2.92E+001 -8.75E+000 -3.654E+000 +5.149E+002 +1.287E+002 +3.891E-001 -7.360E+002 +1.297E-001 +1.357E+003
 -1.28E+000 +2.89E+001 -8.10E+000 -1.710E+000 +4.733E+002 +1.164E+002 +4.568E-001 -7.400E+002 -1.415E-001 +1.351E+003
 -2.02E+000 +2.89E+001 -9.18E+000 +7.540E-001 +5.450E+002 +1.326E+002 +4.156E-001 -7.418E+002 +3.872E-003 +1.376E+003

Element # = 3     Typ = 10-K Tetraeder
 XX         YY         ZZ         SIGXX       SIGYY       SIGZZ       TAUXY       TAUYZ       TAUZX       SIGV
 -2.90E+000 -2.04E-002 -1.58E+001 -9.717E+001 -5.870E+001 -9.609E+001 +2.046E+002 -9.020E+002 +8.277E+000 +1.602E+003
 -2.56E+000 -2.04E-002 -1.58E+001 -2.260E+002 -2.290E+002 -1.920E+002 +3.363E+002 -7.290E+002 +8.982E+000 +1.391E+003
 -2.90E+000 -2.14E-001 -1.55E+001 +4.811E+001 +5.761E+001 -2.021E+002 +7.346E+001 -1.074E+003 +8.384E+000 +1.881E+003
 -2.90E+000 +1.07E-001 -1.54E+001 +1.244E+002 +2.264E+002 +3.938E+002 +9.675E+001 -1.181E+003 -8.551E+000 +2.066E+003

Element # = 4     Typ = 10-K Tetraeder
 XX         YY         ZZ         SIGXX       SIGYY       SIGZZ       TAUXY       TAUYZ       TAUZX       SIGV
 -5.70E-001 -4.20E+000 +8.68E+000 +1.658E-001 +4.728E+001 +2.154E+002 +2.764E-001 -9.747E+002 -1.170E+000 +1.700E+003
 -4.82E-001 -3.76E+000 +9.52E+000 -4.169E+000 +4.107E+001 +2.361E+002 +3.807E-001 -9.690E+002 -1.368E+000 +1.693E+003
 +5.35E-001 -3.96E+000 +9.13E+000 -6.007E-001 +4.548E+001 +2.245E+002 -1.359E-001 -9.709E+002 -8.912E-001 +1.694E+003
 -8.30E-002 -4.61E+000 +9.36E+000 +4.195E-001 +7.358E+001 +2.448E+002 -9.689E-001 -9.364E+002 -1.590E+000 +1.636E+003
 


Diese Datei heißt test.txt. Folgenden Code habe ich geschrieben, um erstmal den ersten Block Daten auszulesen:
Code:

fid = fopen('test.txt', 'r');
C = fscanf(fid, '\n %*s %s %s %s %*s %s %*s %*s \n %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s \n %*f %*f %*f %*f %*f %*f %*f %*f %*f %*f', [7 10]);
A = C';
fclose(fid);
 


Das Ergebnis:
Code:

C =

 Columns 1 through 23:

   35   54   45   43   55   50   69   50   69   46   48   57   51   48   45   48   54   45   43   51   50   46   48
   61   49   50   48   49   43   43   61   43   54   48   69   46   48   49   48   48   50   48   54   35   53   45
   49   69   46   48   50   54   48   45   48   53   43   43   56   49   46   49   69   46   48   51   61   50   52
   61   43   51   50   69   46   48   56   48   52   53   48   57   35   53   45   43   50   50   69   52   69   46
   45   48   50   45   43   48   49   46   48   69   46   48   49   61   56   50   48   57   43   43   61   43   49
   49   48   54   56   48   55   35   55   45   43   49   50   69   51   69   46   48   48   51   48   43   48   54
   46   49   69   46   48   51   61   53   51   48   52   43   45   61   43   50   50   69   46   48   57   48   57

 Columns 24 through 27:

   69   46   48   55
   43   49   49   69
   48   48   43   45
   48   55   51   48
   48   69   46   48
   43   43   56   49
   52   48   48    0
 


Jetzt ist leider die 35 an Position (1,1) aus dem Ergebnis etwas anderes als die -9.16E-001 der Datei.

Das verstehe ich nicht... wäre froh, wenn mir hier jemand helfen kann... Vielen Dank und schönen Abend noch!
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDread
Forum-Century

Forum-Century


Beiträge: 212
Anmeldedatum: 11.05.11
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 27.01.2014, 14:51     Titel:
  Antworten mit Zitat      
Hallo tweety,

vielleicht bekommt man es mit fscanf hin, ich habe das eigentlich nur bei files verwendet, wo ich nur einen Header hatte. Bei so einem "regelmäßig unregelmäßigem" file wie deinem benutze ich gerne fgetl.

Code:

fid = fopen('test.txt');
anzahlZeilen = sum(fread(fid)==char(10)) ;
frewind(fid);
out = zeros(34,10);
idx = 1;
while 1
   tline = fgetl(fid); %Zeilenweise auslesen
   if ~ischar(tline);   break,   end %Wenn letzte Zeile erreicht, abbrechen
   numLine = str2num(tline);
   if ~isempty(numLine)
      out(idx,:) = numLine;
      idx = idx+1;
   end
end
out = out(out~=0);
out = reshape(out,numel(out)/10,10);
 


Du kannst danach die Matrix wie gewünscht unterteilen/verarbeiten.
Kann natürlich sein, dass es schönere/einfachere Methoden gibt;)
Grüße
Chris
_________________

--> Kapieren statt Kopieren <---
____________________________________________________
FAQs sind dazu da, FAQs zu beantworten Wink
Richtig fragen!
Private Nachricht senden Benutzer-Profile anzeigen
 
Tweety560
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 23.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.02.2014, 14:17     Titel: Funktioniert
  Antworten mit Zitat      
Moin, vielen Dank, das funzt.
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.