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

Datei auslesen und bestimmte Zahlenfolge in Matrix schreiben

 

Steven

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.02.2011, 17:20     Titel: Datei auslesen und bestimmte Zahlenfolge in Matrix schreiben
  Antworten mit Zitat      
Hallo,

meine Aufgabe ist es die Knoten-Koordinaten und Elemente eines FEM-Programms aus einer normalen Datei auszulesen.

Nach dem ich schon den ganzen Tag am rumprobieren bin, habe ich mir diesen Code zusammengebastelt:
Code:

fid = fopen( 'Datei.txt','r');

line = 1;
tline=1;
c = 1;
d = 1;

while tline~=-1 %alle Dateizeilen durchgehen
    tline = fgetl(fid);
   
    if  strfind(tline,'GRID')==1 % Knotendefinition
       
        data=textscan(tline,'%*s %*d %8f %8f %8f'); % zerteil den eingelesenen String in ein cell-array    
        K(:,c) = cell2mat(data); % fomatierung des cell-array in eine Matrix
        c = c+1;
       
    elseif strfind(tline, 'CTETRA')==1 % Elementdefinition
        data=textscan(tline,'%*s %*d %d %f %f %f %f %f %f');
        E(:,d) = cell2mat(data);
        d = d+1;
    end

end
fclose(fid);


Mein Problem ist, dass meine Koordinaten auch mehr als 4 Stellen hinter dem Komma haben (aber nicht mehr als 8 Zeichen lang sind) und die Elemente (CTETA) über 2 Zeilen definiert werden.

Benötigen tue ich die exaten Koordinaten (also nicht gerundet) in einer Matrix und für jedes Element die beteiligten Knotennummern in einer Matrix.
Ich habe nur keine Ahnnung wie ich es anstellen soll und wäre für jede Hilfe dankbar.

Datei.txt
 Beschreibung:

Download
 Dateiname:  Datei.txt
 Dateigröße:  4.7 KB
 Heruntergeladen:  473 mal


Steven

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.02.2011, 11:56     Titel:
  Antworten mit Zitat      
Kann wirklich keiner Helfen?

Ein großes Problem bei meinem Code ist auch, dass die letzte Zahl in der ersten Zeile der Elementdefinition nicht ausgelesen wird, da ein Plus am ende steht:

"1234+"

Dies wird nicht als Zahl erkannt. Ich habe schon probiert mit %4f die Anzahl der Ziffern einzustellen aber ohne Erfolg.

Gibt es einen Befehl mit dem ich bestimmte Stellen eines Strings ausschneiden kann?
Alle Angaben stehen nämlich immer an der exakt gleichen Stelle der Zeile.
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 19.02.2011, 12:44     Titel:
  Antworten mit Zitat      
Hallo Steven,
die Daten in der Datei sind leider sehr schlecht.
Dann man die nicht mit einem Trennungszeichen abspeichern?

Folgendes Beispiel in der GRID Zeile 3284:
GRID 3284 -4.54405 -10.86816.21494
Sind die Zahlen jetzt:
-4.54405 -10.868 16.21494
oder
-4.54405 -10.8681 6.21494

Durch die mangelnden Trennungszeichen der Zahlen, ist es sehr schwer was passendes zu finden.
_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.02.2011, 13:24     Titel:
  Antworten mit Zitat      
Ja das stimmt, aber leider kann & darf ich die Datei nicht verändern da noch andere Programme drauf zugreifen.
Ich weiß aber, das alles einträge max. 8 Stellen besitzen und kann sie so auch auschneiden - das funktioniert auch prima.

Mein Code funktioniert auch soweit ganz leidlich und mittlerweile so aus:

Code:

fid = fopen( 'ARM.bdf','r');

line = 1;
tline=1;
c = 1;
d = 1;

while tline~=-1 %alle Dateizeilen durchgehen
    tline = fgetl(fid);
   
    if  strfind(tline,'GRID')==1 % Knotendefinition
%         Knoten_nummer = str2double(tline(8:16));
%         x_Koord =  str2double( tline(25:32)) ;
        data = textscan(tline,'%*s %8f %8f %8f %8f'); % Zerteilt den eingelesenen String in ein cell-array          
        K(:,c) = cell2mat(data); % Fomatierung des cell-array in eine Matrix
        c = c+1;
       
    elseif strfind(tline, 'CTETRA')==1 % Elementdefinition
        data=textscan(tline(9:72),'%d %d %d %d %d %d %d %d');
        E(:,d) = cell2mat(data);
        d = d+1;
        tline = fgetl(fid);
       
        if strfind(tline,'+')==1
            data=textscan(tline(9:40),'%d %d %d %d %d');
           % E(:,d
           
       
        elseif strfind(tline, 'CTETRA')==1 % Elementdefinition
            data=textscan(tline(9:72),'%d %d %d %d %d %d %d %d');
            E(:,d) = cell2mat(data);
            d = d+1;
        end
       
    end

end
fclose(fid);

 


Wenn du eine Ahnung hast wie man das eleganter lösen könnte wäre ich dir sehr dankbar =).

Ein Problem ist auch, das die Zeilen die mit CTETRA anfangen 1, 2 oder 3 Zeilen lang sein können, die ich alle in die gleiche Matrix packen muss.
Momentan komme ich mit zwei Zeilen klar, ist nur nicht sehr elegant.

Mein größtes Problem liegt allerdings darin das Matlab immer auf 4 Stellen nach dem Komma rundet. Kann man das irgendwie umgehen?
 
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.