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

Einlesen großer Textfiles

 

Semsemnamm

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.06.2008, 11:22     Titel: Einlesen großer Textfiles
  Antworten mit Zitat      
Hallo,

ich habe im Rahmen meiner Diplomarbeit eine kleine MATLAB-Routine entwickelt, um Daten aus ANSYS-Dumpfiles in MATLAB zu importieren. Diese Dumpfiles haben in etwa folgendes Aussehen:

Code:

RECORD=      13   LENGTH=       7   LOC=        7645   KBF=       0
   1.00000       0.00000       0.00000       0.00000       0.00000     <      5
   0.00000       0.00000
 


Ich muß nun verschiedene solcher RECORDs aus dieser Datei auslesen, das habe ich bisher über "textread" mit "headerlines"-Option gemacht. Funktioniert an sich auch prima, das Problem ist nur bei größeren Dumpfiles, daß MATLAB mit dem "Vorankommen" in der Datei immer länger braucht. Das liegt m.E. daran: Je mehr Zeilen über "headerlines" übersprungen werden, desto mehr Zeit wird benötigt, um überhaupt an der Stelle anzukommen, ab der ausgelesen werden soll. Sollen z.B. die ersten 2 Mio. Zeilen übersprungen werden, benötigt MATLAB ca. 10 Sekunden zum Auslesen der 2.000.001ten Zeile. Werden jedoch nur 10 Zeilen übersprungen, werden nur Bruchteile einer Sekunde zum Auslesen der 11. Zeile benötigt. Bei der 5.000.000ten Zeile waren es gar 25 Sekunden.

Meine Frage ist, ob man das nicht irgendwie "eleganter" lösen kann, so daß der Zeitaufwand massiv reduziert wird. Bei meiner Beispieldatei (ca. 375 MB und über 10 Mio. Zeilen) ist MATLAB nach ca. 40 Stunden noch nicht mit dem Abarbeiten der Gesamtroutine fertig geworden.


keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 26.06.2008, 12:03     Titel:
  Antworten mit Zitat      
Schau Dir mal die Hilfe zu den Befehlen
Code:

an. Da solltest Du sinnvolle Hinweise kriegen.

Der Nachteil an textread ist eben, dass er immer vom Dateianfang die Datei durchsucht. Mit fseek kann man dagegen zu einem bestimmten Byte in der Datei springen und von da an die Daten mit fread oder fscanf auslesen. Welche der beiden Methoden in Deinem Fall sinnvoller ist, weiss ich nicht, da ich bisher nie mit fscanf gearbeitet habe. Bei Textinformationen sollte es aber leichter mit fscanf gehen.
Wenn die Eintraege pro Zeile in Deiner Eingabedatei immer gleich lang sind (in Bytes bzw. Zeichen gesprochen), ist der Einsatz von fseek besonders leicht, da man um z.B. in die n+1. Zeile zu gelangen nur n mal die Laenge einer Zeile (in Bytes) ueberspringen muss.
Private Nachricht senden Benutzer-Profile anzeigen
 
Semsemnamm

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.06.2008, 13:36     Titel:
  Antworten mit Zitat      
Vielen Dank erstmal, hat mir zumindest zum Teil geholfen.

Mit fscanf komme ich zwar zumindest erstmal weiter, das Problem ist nur, daß die erste Zeile meines obigen Beispiels in eine Matrix überführt wird, in der jedes Zeichen der gesamten Zeile als eine Spalte der Matrix dargestellt wird. Das heißt, das Ergebnis sieht nun so aus:

Code:

A = RECORD=13LENGTH=7LOC=7645KBF=0
 


wobei z.B. Spalte 6 der Matrix lediglich das D von RECORD ist. Ich benötige jedoch direkten Zugriff auf den Wert hinter LENGTH (also in dem Fall 7) weil dieser Wert angibt, wieviele Werte unter der Kopfzeile des RECORDs stehen. Beim Auslesen geht es mir sowieso nur um die eigentlichen Inhalte, die RECORD-Kopfzeilen brauche ich nur, damit ich MATLAB mitteilen kann, welche RECORDs ausgelesen werden müssen und damit MATLAB weiß, wie viele Werte zu dem entsprechenden RECORD gehören.

Selbst wenn ich es hinkriege, daß er nur den Wert hinter LENGTH ausliest, dann liegt er als Matrix vor, d.h., ist LENGTH=40, dann ist der entsprechende Wert eine (1,2)-Matrix mit den Einträgen 4 und 0.
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 26.06.2008, 16:19     Titel:
  Antworten mit Zitat      
Wenn die Record-Zeile immer gleich aussieht, koenntest Du folgendes versuchen:
Code:
slen = 'LENGTH=';
sloc = 'LOC';
k1 = findstr(A,slen) + length(slen) + 1; % Findet den Index, an dem "slen" in A beginnt, addiert dann die laenge von slen plus 1, um den ersten Index nach dem = (also den ersten der Laengenvariablen) zu erreichen
k2 = finstr(A,sloc) - 1; % Findet den Index, an dem "sloc" in A beginnt und subtrahiert 1 um den letzten Index der Laengenvariablen zu erreichen
laenge = str2num(A(k1:k2));
Private Nachricht senden Benutzer-Profile anzeigen
 
Semsemnamm

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2008, 09:07     Titel:
  Antworten mit Zitat      
Sorry, daß ich mich jetzt erst wieder melde. Hat wunderbar geklappt, vielen herzlichen Dank. Die neue Routine hat für die große Beispieldatei, die ich oben erwähnte, jetzt gerade mal noch 25 Minuten gebraucht (statt vorher mehrere Tage).
 
CubaMAN

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2009, 20:17     Titel:
  Antworten mit Zitat      
Hallo,

habe das Beispiel oben eben auch versucht umzusetzen, nur leider erfolglos.

Die out_ca Datei schaut wie folgt aus.

Code:
t(s)     t(CA)        T(K)       ccc  
  0.000E+00 -1.800E+02  5.550E+02  8.668E+01  4.000E+00
  1.000E-15 -1.800E+02  5.550E+02  8.668E+01  4.000E+00
  1.010E-13 -1.800E+02  5.550E+02  8.668E+01  4.000E+00


Aus dieser wollte ich die Position von 'ccc' bestimmen, so dass ich mit dem einlesen nach 'ccc' anfangen kann. Habe im Prinzip nur das obige Beispiel an meine Situation angepasst.


Code:
fid = fopen('out_ca','r');

slen = 'ccc';
k1 = findstr(fid,slen) + length(slen) + 1;


Nach Ausführung des Codes steht in der Variablen k1 nichts. Value [].
Hat jemand ne Idee wo der Fehler liegt?

Grüße
CubaMAN
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2009, 20:23     Titel:
  Antworten mit Zitat      
Mit Position meinst Du die Nummer der Zeile mit ccc in der Datei?
Das Beispiel kann so nicht funktionieren. Du hast die Datei bisher nur geöffnet. Zum Einlesen musst Du einen der Befehle von weiter oben nehmen. Allgemein zum Einlesen von Dateien gibt es im Forum viele Beispiele. (->Suche)
 
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 - 2024 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.