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

Bestimmte Werte aus Textdatei auslesen (und bündeln)

 

JensHu
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 07.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.06.2016, 14:39     Titel: Bestimmte Werte aus Textdatei auslesen (und bündeln)
  Antworten mit Zitat      
Moin,

ich habe folgendes Problem:

Ich möchte aus folgender von OpenFOAM erzeugten Textdatei nur bestimmte Werte auslesen:

Code:

/*--------------------------------*- C++ -*----------------------------------*\
| =========                 |                                                 |
| \\      /  F ield         | OpenFOAM Extend Project: Open source CFD        |
|  \\    /   O peration     | Version:  1.6-ext                               |
|   \\  /    A nd           | Web:      www.extend-project.de                 |
|    \\/     M anipulation  |                                                 |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    location    "15/uniform";
    object      barge_barge;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

mass               m [1 0 0 0 0 0 0] 8070810;
momentOfInertia    J [1 2 0 0 0 0 0] (4229230000 164230000 4229230000);

equilibriumPosition    x [0 1 0 0 0 0 0] (0 -89.9155 0);
linearSpring       k [1 0 -2 0 0 0 0] (0 0 0);
linearDamping      d [1 0 -1 0 0 0 0] (0 0 0);

Xrel               Xrel [0 1 0 0 0 0 0] (-0.1276114838 -0.04655957576 0.005312987547);
U                  U [0 1 -1 0 0 0 0] (-0.02691061706 0.004272935202 0.001034637936);
rotationVector     (0.02804016332 -0.04542265693 0.9985742494);
rotationAngle      rotAngle [0 0 0 0 0 0 0] 0.00108401585;
omega              rotUrel [0 0 -1 0 0 0 0] (-1.220060883e-05 -8.197591123e-06 9.157017286e-05);

force              f [1 1 -2 0 0 0 0] (-24479.61889 34048.24527 426.6281931);
moment             m [1 2 -2 0 0 0 0] (-8957.921067 -126.9805895 -321881.8619);
forceRelative      fRel [1 1 -2 0 0 0 0] (0 0 0);
momentRelative     mRel [1 2 -2 0 0 0 0] (0 0 0);


// ************************************************************************* //
 


Im Speziellen möchte ich nur die Vektoren neben Xrel und omega auslesen.
Bisher habe ich immer nur Textdateien ausgelesen, in denen nur Zahlen standen, nicht so wie hier "wild" durcheinander mit Text. Deshalb bin ich einigermaßen überfordert.

Da solch eine Textdatei für jeden Simulations-Zeitschritt erstellt wird, möchte ich die Vektoren zudem aus mehreren Dateien auslesen und gerne in einer Datei/Matrix bündeln.
Ggf. zusätzlich problematisch ist außerdem, dass OpenFOAM die Textdatei (unnötigerweise) auch noch in ein .gz Format verpackt.

Hoffe ihr könnt mir hierbei weiterhelfen? Würde mich sehr über Tipps und Tricks freuen!

Beste Grüße
Jens
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 07.06.2016, 16:23     Titel: Re: Bestimmte Werte aus Textdatei auslesen (und bündeln)
  Antworten mit Zitat      
Hallo JensHu,

File öffnen mit fopen
Zeile für Zeile in einer while Schleife einlesen und vergleichen mit: strncmp(Line, 'XRel ', 5) bzw. dem anderen Keyword.
Wenn es passt, den Rest der Zeile mit
Code:
umwandeln.
Schleife abbrechen, wenn beide Werte gefunden wurden.
Fehlermeldung, wenn die gesuchten Werte nicht im File enthalten waren.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
JensHu
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 07.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.06.2016, 12:12     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke dir erst einmal für deine Antwort!
Hab jetzt folgendes (unschönes) gebastelt:

Code:

clc
clear all
close all

%gunzip('barge_barge.gz');
fid = fopen('barge_barge');


count = 0;
omega = 100;

while omega > 99
    line = fgetl(fid);
    if strncmp(line,'Xrel',1)
    Xrel = sscanf(line, '%c');
    Xrel(:,1:38) = []
    elseif strncmp(line,'omega',1)
    omega = sscanf(line, '%c');
    omega(:,1:42) = []
    end
    count = count + 1;
end
count;
fclose(fid);
 


Mein Problem ist, dass ich nun Xrel und omega ausgelesen habe, das ganze aber als Text erkannt wird und ich keine 3x1 oder 1x3 Matrix erhalte. Gibt es da eine Möglichkeit die drei Dezimalzahlen jeweils in diesem Format auszulesen?

Das weitaus größere Problem ist dann, dass diese barge_barge Dateien der unterschiedlichen Zeitschritte nicht alle in einem Ordner liegen. Sie sind immer jeweils in einem Ordner mit dem Namen des Zeitschritts (z.B. 2.0) und dort noch einmal im Ordner uniform abgelegt.
Wie kann ich mit einem Skript alle barge_barge Dateien (aus den verschiedenen Ordnern) einlesen?

Hoffe das ist soweit verständlich formuliert Confused

Gruß Jens
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.06.2016, 16:13     Titel:
  Antworten mit Zitat      
Hallo JensHu,

Zunächst mal würde ich den sinnlos brutalen Clearing-Header weglassen. Während clc manchmal sinnvoll sein mag, ist close all unpraktisch, wenn man später mal mit mehreren arbeiten möchte. Das clear all halte ich sowieso für sinnfrei. Arbeite lieber mit Funktionen.

Code:
function [Xrel, omega] = GetXRelOmega(FileName);
%gunzip([FileName, '.gz']);
fid = fopen(FileName);

% omega = 100;   % No magic numbers!!!

searchXrel = true;  % Flags are better!
searchOmega = true;

while searchXrel || searchOmega
    Line = fgetl(fid);   % Not the command "line"
    if strncmp(line, 'Xrel ', 5)  % Not 1, compare 5 characters with sapce
      s = strfind(Line, '(') + 1;
      Xrel = sscanf(Line(s:end), '%g', [1, 3]);
      searchXrel = false;
    elseif strncmp(line, 'omega ', 6)
      s = strfind(Line, '(') + 1;
      omega = sscanf(Line(s:end), '%g', [1, 3]);
      searchOmega = false;
    end
end
% count;   % Sinnfrei!?
fclose(fid);

if searchOmega || searchXrel
  error('Data not found: %s', FileName);
end


Suche im FileExchange nach "recursive dir". Falls Dir das nicht sagt, frage Google. Da gibt es eine Menge Lösungen, um eine Liste von Files zu erhalten. Dann kannst du ein File name dem anderen in einer Schleife einlesen.

Gruß, Jan
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.