www.mikrocontroller.net

Forum: PC-Programmierung komplizierte Textdatei einlesen in Matlab


Autor: Drei Newton (3_newton)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche eine Datei mit Matlab einzulesen die folgendes Format hat:

Sweep 2_3_25
10000 points
"time[s]",   "trace1 [V]"
 0.00000E+000  -6.56875E-002
 1.00000E-003  -6.57187E-002
 2.00000E-003  -6.56563E-002
...9997 weiter Punkte...
Sweep 2_3_26
10000 points
"time[s]",   "trace1 [V]"
 0.00000E+000  -5.26865E-002
 1.00000E-003  -5.46689E-002
...9998 weiter Punkte...

usw. mit 3 bis 7 solchen 10000er-Blöcken. Ich habe jetzt versucht mit 
textscan:

%Daten einlesen
for filecount = 1:length(fileName)

   fid=fopen([filePath fileName{filecount}],'r')
   while ~feof(fid);

       v = textscan(fgetl(fid), '%f%f','delimiter','  ');
       try
       data(i,:) = [v{1} v{2}];
       i = i + 1;
       catch
       end
   end
fclose(fid)
end

das Zeilenweise einzulesen. Geht aber nicht. Er erkennt die beiden 
Spalten einfach nicht! Wenn ich %f%*s%f nehme, liest er zumindest die 
erste, aber keine Chance mit der zweiten. Jemand einen Plan wie ich das 
machen kann?
Vielen Dank!
3N

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo 3N

Mit dem Befehl

v = textscan(fgetl(fid), '%f%f','delimiter','  ');

versucht Matlab in der Datei eine Auflistung von Zahlen nach diesem 
Format hier einzulesen:

 0.00000E+000  -6.56875E-002
 1.00000E-003  -6.57187E-002
 2.00000E-003  -6.56563E-002

Wenn diese Tabellenform dann aber durch irgendwelchen Text durcheinander 
gerbacht wird, wie z.B.

Sweep 2_3_25
10000 points
"time[s]",   "trace1 [V]"

bricht Matlab natürlich ab.
Im Grunde genommen sollte es aber kein Problem sein, auch das Matlab bei 
zu bringen. Du kannst ja mal so eine betroffene Textdatei anhängen und 
dann kann ich mal probieren ein entsprechendes Skript zu schreiben mit 
dem das dann geht.

Gruß Felix



2. Möglichkeit wäre übrigens in der Datei per Hand einfach die 
Textanteile zu entfernen und nur die Zahlen übrig zu lassen.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich habe das Problem gerade auch. Es scheint daran zu liegen, dass 
Matlab die zwei Leerzeichen in '  ' für den delimiter nicht erkennt.

Ich suche jetzt schon seit zwei Tagen nach einer Lösung, werde mir jetzt 
aber einfach ein C++-Programm schreiben, das mir in der Datei alle 
Leerzeichen-Ketten auf nur ein Leerzeichen reduziert. Das werde ich dann 
per system() aufrufen.

Wenn jemand eine elegantere Lösung weiß, bitte melden!


Gruß,
Thomas

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spar dir c++ verenkungen^^

>>> import re
>>> pattern = re.compile("[\t ]+")
>>> file("outfile", "w").write(pattern.sub(' ',file("infile").read()) + "\n")

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich mach' das bei solchen files immer so, dass ich zeilenweise als text 
einlese und mir dann die aktuelle zeile genauer ansehe. Wenn es z.B. 
gelingt, zwei zahlen mit den von dir definierten delimitern einzulesen, 
hast du eine zeile mit einem zahlenpaar, wenn nicht, hast du eine 
textzeile erwischt.

infile = fopen(filename,'rt');
while not(feof(infile))
    line = fgetl(infile);
    [Ta,Tb]=strread(line,'%f %f','delimiter',[':',' ',';']);
    if ~(isempty(Ta)|isempty(Tb))
        ...
    else
        ...
    end
end
fclose(infile);

Ist allerdings nicht besonders schnell. Aber das ist matlab ja eh' nicht 
...

Autor: akolb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab auch so ein ähnliches problem:
ich möchte einen schwung dateien einlesen und nur bestimmte werte davon 
verwenden.
beispiel hier:

!INTERFILE :=
image data byte order := LITTLEENDIAN
!PET data type := emission
%CPS data type := sinogram subheader
!name of data file := countrate_0.s
!study date (dd:mm:yryr) := 00:00:   0
!study time (hh:mm:ss) := 00:00:00
data format := sinogram
...
number of z elements := 153 286 250 214 178 142 106 70
Total Prompts := 3425580617
Total Randoms := 3146973362

ich brauch nur die zwei werte nach Total Prompts und Randoms. ich könnte 
einen delimeter '=' verwenden aber irgendwie bekomm ich es nicht 
gebacken.
hat mir hier jemand einen guten tipp?

Autor: Hamlet.Hase (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@akolb:

ich bin kein matlab-pro und garantiere für nichts :D

aber versuchs mal mit

strmatch

schreibste einfach in ne for-schleife in der er jede zeile abläuft, mit 
ner if dann abfrage welchen wert du siehst "total prompts" oder eben 
"total randoms"

und irgendwie (wie gesagt kein pro) sagste ihm dann er soll genau die 
zeile auslesen und den wert nehmen.


hoffe ich konnte dir iwie helfen

cya

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hamlet.Hase schrieb:

> hoffe ich konnte dir iwie helfen

lieber nicht, das würde nämlich heißen, dass er seit über einem Jahr 
daran sitzt...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.