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

Effizientes Einlesen einer Textdatei

 

FreddyJR

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.07.2013, 16:28     Titel: Effizientes Einlesen einer Textdatei
  Antworten mit Zitat      
Guten Tag! Very Happy

Ich habe grosse (bis etwa 50MB) Textdateien der Form:

----------- Ab naechster Zeile Inhalt der Datei: ---------------
0 4 1 0.3
0 10 2 0.3 4 0.4
100 3 5 0.5 10 0.4

6 7 4 0.3 0 10 3 0.4 5 0.5
9 10 3 0.3 4 0.4

10 10 10 0.1 10 0.1 10 0.1 10 0.1
-------------- Obere Zeile ist Ende der Textdatei ----------------

- Die Zeilen enthalten nur Zahlen oder sind leer
- Die leeren Zeilen sind zwischen zwei "Objekten", die jeweils von den ganzen Zahlen darueber/darunter definiert werden.


Ich muss fuer jedes vorher definierte Objekt (z.B. erstes und drittes Objekt, das zweite interessiert mich nicht):
1. Zuerst die maximale Anzahl von Zahlen in einer Zeile des Objekts wissen = maxA
2. Jede Zeile mit mindestens p*maxA vielen Zahlen von jedem der definierte Objekte verarbeiten.

--------------

Bisher habe ich das so gemacht, dass ich die Textdatei zweimal Zeile fuer Zeile (mit fgetl) einlese. Einmal um maxA fuer jedes definierte Objekt zu bekommen und einmal um die Zeilen die ich brauche zu verarbeiten. Das ist leider inzwischen aber kaum mehr praktikabel, weil es zu lange dauert.


Meine Frage also:
Wie loese ich das Ganze moeglichst geschickt? Ist es vielleicht effizienter die Textdatei erstmal komplett mit textscan(fid,'%s','Delimiter','\n', 'BufSize', 40*1024) einzulesen (geht das auch direkt so, dass ich kein Cell Array von Strings kriege, sondern von doubles?) - auch wenn ich dann alles lese und nicht nur bis zum weitest hinten stehenden Objekt, das mich interessiert?

Ich hoffe ihr habt eine Idee und ich mich verstaendlich ausgedrueckt Smile
LG!


Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.07.2013, 23:25     Titel:
  Antworten mit Zitat      
Hallo FreddyJR,

um das Zeilenweise Verarbeiten Deiner Dateien wirst Du nicht rumkommen, Du solltest aber gleich die gelesenen Zeilen in Zahlen (str2double) umwandeln und in passende Strukturen schreiben (Cell-Array »Objekte«). Damit sparst Du Dir das zweimalige Lesen.

Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 01.08.2013, 11:39     Titel:
  Antworten mit Zitat      
Das zweimal durchlaufen kannst du dir sparen.

Ausserdem fällt mir ein:

1) Wenn du die parallel computing toolbox hast, könntest du mit parfor durch die Datei marschieren - elegant ist das aber auch nicht Very Happy

2) Du schneidest die Header und Footer Zeile weg. Wenn du Linux als Host hast, oder es irgendwo zu verfügung hast, hüpfst du kurz mit sed drauf.
Code:

sed s/"----------- Ab naechster Zeile Inhalt der Datei: -----------------"/"\n"/g
sed s/"-------------- Obere Zeile ist Ende der Textdatei ----------------"/"\n"/g
 

Anschließend sieht deine Datei so aus:
Code:


0 4 1 0.3
0 10 2 0.3 4 0.4
100 3 5 0.5 10 0.4

6 7 4 0.3 0 10 3 0.4 5 0.5
9 10 3 0.3 4 0.4

10 10 10 0.1 10 0.1 10 0.1 10 0.1

 


Dann könntest du etwas mit regexp spielen.
So z.B.:
Code:

 vielspass = regexp(fileread('test.txt'), '\n', 'split');
 

Das erzeugt dir eine 1x11 Zelle. Jede Leerzeile ist eine leeres Array (also vielspass{1} vielspass{5} vielspass{8} und vielspass{10:11}. Wenn du die erste und letzten Leerzeilen entfernts, hast du nur die Unterbrechung zwischen den Blöccken). Sichtlich hast du es also schon mal nach Blöcken sortiert (2:4 6:7 und 9).
Jetzt musst du dir nur noch überlegen wie du das effizient in Matrizen bekommst. Mit str2num(vielspass{6}) kriegst du die einzelnen Zeilen in eine Matrix. Im einen rutsch fällt mir gerade spontan nichts ein (Vielleicht mit cellfun oder jemand anderes weiß noch etwas).
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
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.