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
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.
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
spar dir c++ verenkungen^^ >>> import re >>> pattern = re.compile("[\t ]+") >>> file("outfile", "w").write(pattern.sub(' ',file("infile").read()) + "\n")
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 ...
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?
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.