Forum: PC-Programmierung komplizierte Textdatei einlesen in Matlab


von Drei N. (3_newton)


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

von Felix (Gast)


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.

von Thomas (Gast)


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

von daniel (Gast)


Lesenswert?

spar dir c++ verenkungen^^

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

von gast (Gast)


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.

1
infile = fopen(filename,'rt');
2
while not(feof(infile))
3
    line = fgetl(infile);
4
    [Ta,Tb]=strread(line,'%f %f','delimiter',[':',' ',';']);
5
    if ~(isempty(Ta)|isempty(Tb))
6
        ...
7
    else
8
        ...
9
    end
10
end
11
fclose(infile);

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

von akolb (Gast)


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?

von Hamlet.Hase (Gast)


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

von Justus S. (jussa)


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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.