Verfasst am: 15.01.2008, 10:25
Titel: Daten aus editorfile ohne header auslesen
Hallo zusammen,
mein Kollege und ich sind im zuge unserer Bachelorarbeit mit einer für uns unlösbaren aufgabe konfrontiert worden.
wir sind auf der suche nach einer lösung für folgende Problemstellung, und hoffen dass uns jemand von euch weiterhelfen kann:
in einem editorfile stehen z.b 144 datensätze (2000 zeilen und 10 spalten) die jeweils durch einen header getrennt sind. wir möchten jeweils die zweite und vierte spalte der 144 datensätzen, ohne header!, in 144 unterschiedliche m-files abspeichern. optimal wäre es wenn dann jedes m-file so heißt wie z.b die erste zeile vom header. alle abstände zwischen den messungen (mit ausnahme des ersten headers, der die messung beschreibt) sind gleich, d.h dass der header und die matrizen immer die gleichen zeilen-bzw spaltenanzahl aufweisen.
Das ist natürlich nicht der gesamte teil unserer aufgabe, aber er wäre zumindest mal der erste schritt um die daten weiterverarbeiten zu können.
wir würden uns freuen, wenn sich jemand zu unserem problem äußern wurde, bzw einen tipp für uns hat!
vielen dank im voraus
P.S. eine beispieldatei befindet sich im anhang
oder ihr machts anders: ERstmal die ganze Datei einlesen, und jeweils die Zeilen ab UNITS einlesen bis zur nächsten Leerzeile (kann man beides mit strfind finden). Dann kann man alle Daten automatisch in ein cell-array schreiben, den man auch noch die headerzeilen als info-str mitgeben kann. Ansonsten müsst ihr ja hinterher wieder 133 Dateien einlesen?
Falls sich so Probleme öfter stellen : für Datei-Konversion eignet sich perl eigentlich viel besser. (phython wohl auch). Wenn noch Zeit ist, wäre das auch eine interessante Alternative.
_________________
---------------------------------------------------------------
Leider habe ich daheim zwar Internet aber kein Matlab - daher sind alle Syntaxbeispiele circa Angaben.....
An Outsider:
leider funktioniert nach eingabe des codes, nur das auslesen des test_type. es werden aber keine files erstellt (die sollten ja dann im workordner sein, oder?).
wenn wir den code richtig verstehen dann sollte die zeile:
fid1 = fopen(sprintf('%s%d.dat',type,n),'wt');
einen ordner erstellen,der den namen der variable hat. Wir bräuchten aber den variablenwert als namen.
weiters würden wir abgesehen vom test type gerne andere zeilen des headers auslesen ( Condition Number und test command)
mit
trial_number = sscanf(fgetl(fid),' Trial Number: %s');
test_command = sscanf(fgetl(fid),' Test Comment: %s');
funktioniert es zwar, aber nur wenn die einzelnen zeilen nacheinander kommen (wir schaffen es nicht zu sagen: "nimm die erste, dritte und letzte zeile")
das ziel sollte sein dass sich der namen des ordners aus den Variablenwerten zusammensetzt. d.h.
test_type: erast
Trial Number: 5
Condition Number: 1
Test Comment: good luck
--> Dateiname: erasT_5_1_golu
wir hoffen dass wir deine hilfsbereitschaft nicht überstrapazieren, wichtig wäre uns jedoch in erster Linie zu wissen warum er die 3 files nicht erstellen konnte.
Die fortlaufende Nummer habe ich gelassen, da sonst gleiche Dateinamen angelegt und dadurch überschrieben werden. Falls dies nur im Beispiefile so ist, jedoch nicht in den originalen Daten, könnt Ihr das selbst entfernen.
MfG
Edit by Martin: Hab es in Code-Formatierung umgewandelt!
Es kleines Problem haben wir noch bei der File-Namensgebung
Wir haben bei dem Beispielfile vergessen, dass in der Zeile "Test Comment" nicht nur z.B good luck stehen kann. Es ist auch möglich, dass
mehrere ausdrücke drinnen stehen können die durch einen backslash getrennt werden(am besten den anhang ansehen).
Unser Problem ist jetzt, dass die länge des ausdrucks nicht immer gleich ist, z.B einmal 4 Ausdrücke und einmal 6 ausdrücke.
Code:
fid = fopen('testfile.txt') % % Main-Header überspringen (14 Zeilen) for i=1:14;
fgetl(fid) end % try
n = 0;
while1 %
n = n+1 % Type auslesen
test_type = sscanf(fgetl(fid),'Test Type: %s');
fgetl(fid);fgetl(fid);fgetl(fid);fgetl(fid);
cond_num = sscanf(fgetl(fid),'Condition Number: %s');
trial_num = sscanf(fgetl(fid),'Trial Number: %s');
fgetl(fid);fgetl(fid);fgetl(fid);fgetl(fid);
%
tmp = fgetl(fid);
test_comm = strread(tmp,'%s');
% % % filenamen bilden
fname = sprintf('%s_%s_%s_%s%s.m', ...
test_type,trial_num,cond_num,test_comm{3}(1:2),test_comm{4}(1:2)) %
%file anlegen
fid1 = fopen(fname,'wt');
% % startet bei Zeile: Test Comment
%
%überspringt die nächsten 2 Zeilen (" " und "Units...") for i=1:3 fgetl(fid);
end %
%speichert Zeile DP LF .... bis Zeile 20 -> (Units)
%
for i=1:20
%
fprintf(fid1,'%s \n',fgetl(fid));
%
end % % % % angelegten File schliessen fclose(fid1);
% % Zeilen überspringen bis nächster Header -> Test Type for i=1:5 fgetl(fid) end % end% while end% try % fclose(fid)
Das Programm erzielt zwar das gewünschte Ergebnis, aber es sollte darauf hingewiesen werden, dass ziemlich gepfuscht/getrickst wird. Das soll kein persönlicher Affront gegen outsider sein, eher ein allgemeines Statement.
Eine "while 1"-Schleife wird durch einen Fehler eines Funktionsaufrufs unterbrochen, die Fehlerausgabe wird durch "try" unterdrückt.
Das ist zwar prinzipiell funktionsfähig, aber wirklich mit Programmierung hat das meiner Meinung nach nichts zu tun.
Stattdessen sollte auf ordentliche Fehlerbehandlung gesetzt werden, auch wenn dadurch der Code etwas ausführlicher wird.
Für sowas wäre ich, als ich das Programmieren gelernt hab, vom Übungsleiter geköpft worden ;)
Ich denke, es ist eher ein Problem mit den impliziten Funktion @(x) in Matlab 6.
Ich hatte auch so ein Problem, bis ich auf Matlab R2007b umgestiegen bin.
Der Fehler scheint das zu bestätigen "Column: 22" heisst ja nichts anderes, als dass der Fehler in der 22. Spalte der entsprechenden Zeile zu finden ist, also nach dem "@".
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
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.