Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Modellbildung und Simulation Mechatronischer Systeme

Fachkräfte:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Zahlen aus einem Text extrahieren

 

Kopi
Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 28.09.08
Wohnort: weit weg von der Heimat
Version: R2020b
     Beitrag Verfasst am: 11.12.2020, 00:09     Titel: Zahlen aus einem Text extrahieren
  Antworten mit Zitat      
Guten Abend,

ich habe ein paar Probleme mit einer Textdatei die bei einer Simulation erstellt und dann kontinuierlich nach dem selben Prinzip fortgeschrieben wird.

Über den folgenden CODE kann ich schon mal einen Teil der Statistik des Modells auslesen.

Code:
PATH ='C:\TEST\';
FILE = 'RUNDAT.txt';
fid = fopen([PATH FILE], 'r');

for ii=1:16
    fgetl(fid);
end
% Statistik auslesen
scannedtext = textscan(fid, '%s');

TABELLE = {'Modellgröße','durchschnittliche Maschengröße', 'kleinste Masche','sehr kleine Maschen','Maschen mit spitzen Winkeln'}';
TABELLE(1,2) = cellstr(scannedtext{1,1}{5,1});
TABELLE(2,2) = cellstr(scannedtext{1,1}{10,1});
TABELLE(3,2) = cellstr(scannedtext{1,1}{15,1});


Wie im Code zu sehen, ist
Zitat:
scannedtext
eine 1x1 große Zelle. Klickt man sich durch, ist in dieser der gesamte Dateiinhalt in einer Spalte geschrieben und jeder Wert der zwischen zwei Trennzeichen (Leerzeichen) liegt, bekommt eine eigene Zeile.

Für das Auslesen der Statistik ist dies recht hilfreich. Leider gibt es mehrere Ergebnisse für
Zitat:
kleine Maschen
und
Zitat:
Maschen mit spitzen Winkeln
. Wie kann ich diese am besten zählen. Ich habe erst an eine while - Schleife gedacht, die so lange läuft solange eine Zahl vorliegt. Doch wie kann ich die Zeilen innerhalb der while-Schleife zählen und aus
Zitat:
scannedtext
auslesen. Mit einer for - Schleife ist es sehr einfach. Ist ein n = n+1; hilfreich?

Im zweiten Teil muss ich die Rechenschritte analysieren. Diese beginnen immer mit XXXXXXX. Hier weiß ich noch nicht ob es am besten ist auch
Zitat:
scannedtext
auszuwerten oder jede Zeile separat zu lesen und die Zahl zu ermitteln.

Viele Grüße
Kopi

RUNDAT.txt
 Beschreibung:

Download
 Dateiname:  RUNDAT.txt
 Dateigröße:  23.63 KB
 Heruntergeladen:  16 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

wenn ich das richtig verstehe, geht es in der ersten Frage darum, die Anzahl der Zahlen in Zeilen wie diesen zu zählen.
473348, 475384, 544317, 546396, 2362757
Dazu würde ich die Anzahl der Kommas zählen und 1 addieren:
Code:
sum(content==',')+1


Für die zweite Frage ist mir nicht klar, wonach du eigentlich suchst und was du mit den gefundenen Informationen machen möchtest. Du hast ja netterweise eine Beispieldatei zur Verfügung gestellt. Vielleicht kannst du anhand der Datei genauer beschreiben, was du brauchst?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Kopi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 28.09.08
Wohnort: weit weg von der Heimat
Version: R2020b
     Beitrag Verfasst am: 11.12.2020, 11:29     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für die Rückmeldung und deinen Hinweis. Den werde ich heute Abend gleich ausprobieren. "content" ist in deinem Fall eine Variable mit Charaktern, oder?

Zum Beispiel möchte ich über die Zeit den gefallenen und tatsächlich zum Abfluss gelangten Niederschlag darstellen oder den Volumenaustausch zwischen Kanalnetz- und Oberflächenmodell.

Die "Control sections" automatisch auszulesen, ist auch sehr interessant (Abfluss und Volumen). Dann habe ich den Oberflächenabfluss automatisch gleich mit im Blick. Bisher mache ich diese händisch über ArcGIS.
Control section 2DCS_1: Total runoff volume: 0.0000 Runoff during print interval: 0.0000
Control section 2DCS_10: Total runoff volume: 0.0000 Runoff during print interval: 0.0000

Im Grunde muss ich die gesamte Datei analysieren und die Werte so ordnen, dass ich daraus Grafiken erstellen kann.

Am Beispiel der "Control section" "2DCS_1" wären dies für den Zeitschritt 5.0005 min das Volumen mit 0.0000 m^3 und der Abfluss mit 0.0000 m^3/s. Die einzelen "Control section" möchte ich dabei nicht von außen über einer Tabelle vorgeben. Wenn ich weitere im Modell hinzufüge oder entferne, müsste ich jedes mal die Tabelle ergänzen.

Im Grunde muss es ganz einfach sein:

1: In einer Schleife nach nach einem neuen Rechenschritt über ############ suchen
2. auslesen der nächsten 13 Zeilen und speichern aller Werte
3. Auslesen der Werte für jede einzelne "Control section" und in eine Tabelle schreiben. Dafür nach "Control section" suchen und dann den 1. (Name), den 5. (Volumen) und den 10. Wert auslesen. Beim 10. Wert ist leider kein Trennzeichen zwischen Zahl und der neuen "Control section". Dies wird wahrscheinlich nicht so einfach werden. Hier muss zufor die Position der neuen "Control section" gesucht werden. Oder ich suche ebenfalls nach "Total runoff volume:" und "Runoff during print interval:."

Würdest du find benutzen oder sind logische Analysen wie von dir oben vorgeschlagen besser?

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

Forum-Meister


Beiträge: 22.649
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.12.2020, 15:32     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
"content" ist in deinem Fall eine Variable mit Charaktern, oder?

Ja.

Zitat:
Im Grunde muss ich die gesamte Datei analysieren und die Werte so ordnen, dass ich daraus Grafiken erstellen kann.

Das ist recht vage. Wenn du Unterstützung dabei brauchst, müsstest du sagen, welche Werte wie geordnet werden sollen? Die mit extract beginnenden Funktionen, z.B. extractBetween , können hilfreich sein.

Auch Patterns können helfen, allerdings erst ab R2020b.
https://www.mathworks.com/help/matlab/ref/pattern.html

Zitat:
Würdest du find benutzen oder sind logische Analysen wie von dir oben vorgeschlagen besser?

Macht wenig Unterschied. Wenn find nicht nötig ist, ist es hinsichtlich Performance besser, es wegzulassen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Kopi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 28.09.08
Wohnort: weit weg von der Heimat
Version: R2020b
     Beitrag Verfasst am: 11.12.2020, 15:41     Titel:
  Antworten mit Zitat      
Hallo Harald,

die Version R2020b habe ich. Hatte es nur noch nicht aktualisiert.

Vielen Dank für den Tipp mit den Befehlen. Ich werde es ausprobieren und mich melden wenn ich Hilfe brauche.

Viele Grüße
Kopi
Private Nachricht senden Benutzer-Profile anzeigen
 
Kopi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 28.09.08
Wohnort: weit weg von der Heimat
Version: R2020b
     Beitrag Verfasst am: 12.12.2020, 18:41     Titel:
  Antworten mit Zitat      
Hallo Harald,

mit dem folgenden Code habe ich den größten Teil der Datei erfasst.

Kann ich diesen noch optimieren? Er funktioniert sieht aber nicht sexy aus. Im Grunde habe ich jetzt jede Zeile ausgelesen als char gelesen und dann ausgewertet.

Code:
PATH ='C:\TEST\';
FILE = 'RUNDAT.txt';
fid = fopen([PATH FILE], 'r');

for ii=1:15
    fgetl(fid);
end
% Statistik auslesen
scannedtext = fgets(fid);
II= strfind(scannedtext,': ');
MASCHEN = str2num(scannedtext(II+1:end));
scannedtext = fgets(fid);
II= strfind(scannedtext,': ');
MODELLFLAECHE = str2num(scannedtext(II+1:end));
scannedtext = fgets(fid);
II= strfind(scannedtext,': ');
AVARAGE_MASCHE = str2num(scannedtext(II+1:end));
scannedtext = fgets(fid);
II= strfind(scannedtext,': ');
MIN_MASCHE = str2num(scannedtext(II+1:end));
fgetl(fid);
scannedtext = fgets(fid);
KLEINE_MASCHEN = sum(scannedtext==',')+1;
fgetl(fid);
scannedtext = fgets(fid);
SPITZE_MASCHEN = sum(scannedtext==',')+1;
KONTROLLQUERSCHNITT=[];
VOLUMEN = [];
ABFLUSS = [];
%% RECHENSCHRITTE AUSLESEN
while ~isnan(sum(scannedtext))
    scannedtext=fgets(fid);
    TEXT = strfind(scannedtext,'############');
    if TEXT==1
       
        scannedtext=fgets(fid);
        II= strfind(scannedtext,': ');
        TIME = datenum(scannedtext(II+1:end));%Zeit ermitteln
        scannedtext=fgets(fid);
        II= strfind(scannedtext,'[min.] ');
        RUNTIME = str2num(scannedtext(II+6:end));
        scannedtext=fgets(fid);
        II= strfind(scannedtext,'to: ');
        TT= strfind(scannedtext,', from: ');
        JJ= strfind(scannedtext,'[m^3]');
        EXCHANGE_SEWER = str2num(scannedtext(II+3:TT-1));
        FROM = str2num(scannedtext(TT+8:JJ-1));
        scannedtext=fgets(fid);
        II= strfind(scannedtext,'difference ');
        JJ= strfind(scannedtext,'[m^3]');
        DIFFERENCE = str2num(scannedtext(II+10:JJ-1));
        scannedtext=fgets(fid);
        II= strfind(scannedtext,'fallen:');
        TT= strfind(scannedtext,', effective:');
        JJ= strfind(scannedtext,'[m^3]');
        TOTAL_RAIN = str2num(scannedtext(II+7:TT-1));
        EFFECTIV_RAIN = str2num(scannedtext(TT+12:JJ-1));
        scannedtext=fgets(fid);
        II= strfind(scannedtext,'percolation:');
        JJ= strfind(scannedtext,'[m^3/s]');
        PERCOLATION = str2num(scannedtext(II+12:JJ-1));
        scannedtext=fgets(fid);
        II= strfind(scannedtext,'hydrographs:');
        JJ= strfind(scannedtext,'[m^3]');
        V_HYDROGRAPHS = str2num(scannedtext(II+13:JJ-1));
        scannedtext=fgets(fid);
        II= strfind(scannedtext,'area:');
        JJ= strfind(scannedtext,'[m^3]');
        V_LEFT_AEREA = str2num(scannedtext(II+5:JJ-1));
        scannedtext=fgets(fid);
        II= strfind(scannedtext,'level:');
        JJ= strfind(scannedtext,'[m]');
        WSP_MIN = str2num(scannedtext(II+6:JJ-1));
        scannedtext=fgets(fid);
        II= strfind(scannedtext,'level:');
        JJ= strfind(scannedtext,'[m]');
        WSP_MAX = str2num(scannedtext(II+6:JJ-1));
        scannedtext=fgets(fid);
        II= strfind(scannedtext,'loss:');
        JJ= strfind(scannedtext,'[m^3]');
        DEPRESSION_LOSS1 = str2num(scannedtext(II+5:JJ-1)); %MULDENVERLUST
        scannedtext=fgets(fid);
        JJ= strfind(scannedtext,'[m^3]');
        DEPRESSION_LOSS2 = str2num(scannedtext(1:JJ-1));
        scannedtext=fgets(fid);
        II= strfind(scannedtext,'computed:');
        V_INSIDE_AREA = str2num(scannedtext(II+9:JJ-1));
        scannedtext=fgets(fid);
        II= strfind(scannedtext,'solver)');
        V_ERROR_NEG_WSP = str2num(scannedtext(II+7:JJ-1));        
       
        TABELLE_Junk =table(TIME, RUNTIME, EXCHANGE_SEWER, DIFFERENCE,...
        TOTAL_RAIN, EFFECTIV_RAIN, PERCOLATION, V_HYDROGRAPHS,...
        V_LEFT_AEREA, WSP_MIN, WSP_MAX, DEPRESSION_LOSS1,...
        DEPRESSION_LOSS2  , V_INSIDE_AREA , V_ERROR_NEG_WSP);
        TABELLE = [TABELLE; TABELLE_Junk];
   
        %%CONTROL SECTION
        scannedtext=fgets(fid);
        II= strfind(scannedtext,'Control section');
        TT= strfind(scannedtext,'Total runoff volume:');
        JJ= strfind(scannedtext,'Runoff during print interval:');
        KQ_JUNK=[];
        VOLUMEN_JUNK = [];
        ABFLUSS_JUNK = [];
        for ii=1:numel(II)
            CS = scannedtext(II(ii)+15:TT(ii)-3);
            R_V = str2num(scannedtext(TT(ii)+20:JJ(ii)-1));
            if ii == numel(II)
                R_Q = str2num(scannedtext(JJ(ii)+29:end));
            else  
                R_Q = str2num(scannedtext(JJ(ii)+30-1:II(ii+1)-1));
            end
            KQ_JUNK= [KQ_JUNK CS];
            VOLUMEN_JUNK = [VOLUMEN_JUNK R_V];
            ABFLUSS_JUNK = [ABFLUSS_JUNK R_Q];
        end

        KONTROLLQUERSCHNITT = [KONTROLLQUERSCHNITT; KQ_JUNK];
        VOLUMEN = [VOLUMEN; VOLUMEN_JUNK];
        ABFLUSS = [ABFLUSS; ABFLUSS_JUNK];
    end
   
    if feof(fid)
       break
    end
end
fclose(fid);
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich hatte ja extractBetween vorgeschlagen. Damit könntest du aus
Code:
scannedtext=fgets(fid);
        II= strfind(scannedtext,'difference ');
        JJ= strfind(scannedtext,'[m^3]');
        DIFFERENCE = str2num(scannedtext(II+10:JJ-1));

schon mal sowas machen:
Code:
DIFFERENCE = str2double(extractBetween(scannedtext, 'difference ', '[m^3]'));

... und eine andere Möglichkeit hatte ich ja auch schon erwähnt: Patterns, insbesondere digitsPattern . Speziell das Beispiel "Extract Digits from Text" kann nützlich sein, wenn es im Grunde nur darum geht, sämtliche Zahlen aus einem Text zu ziehen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Kopi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 28.09.08
Wohnort: weit weg von der Heimat
Version: R2020b
     Beitrag Verfasst am: 12.12.2020, 20:25     Titel:
  Antworten mit Zitat      
Guten Abend Harald,

vielen Dank. Werde es gleich ausprobieren.

Mein Schema hatte funktioniert und dann wollte ich erst mal fertig werden und habe den Hinweis mit Patterns total aus den Augen verloren

Viele Grüße
Kopi
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2021 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.