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

Daten aus editorfile ohne header auslesen

 

noob
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 15.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2008, 11:25     Titel: Daten aus editorfile ohne header auslesen
  Antworten mit Zitat      
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

testfile.txt
 Beschreibung:

Download
 Dateiname:  testfile.txt
 Dateigröße:  10.38 KB
 Heruntergeladen:  1162 mal
Private Nachricht senden Benutzer-Profile anzeigen


outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 15.01.2008, 14:35     Titel:
  Antworten mit Zitat      
Code:
fid = fopen('testfile.txt')
%
% Main-Header überspringen (14 Zeilen)
for i=1:14
   fgetl(fid)
end
%
try
   n = 0;
   while 1
      %
      n = n+1
      % Type auslesen
      test_type = sscanf(fgetl(fid),'Test Type: %s');
      %
      %file mit dem gleichen Namen anlegen
      fid1 = fopen(sprintf('%s%d.dat',type,n),'wt');
      %
      % Header (11) überspringen und die 2 Zeile auslesen und speichern
      for i=1:13
         fgetl(fid);
      end
      %
      fprintf(fid1,'%s\n',fgetl(fid));
      %
      % 3 zeile überspringen
      fgetl(fid);
      %
      % 4 speichern
      fprintf(fid1,'%s\n',fgetl(fid));
      %
      % angelegten File schliessen
      fclose(fid1);
      %
      % 23 Zeilen überspringen
      for i=1:23
         fgetl(fid)
      end
      %
   end% while
end% try
%
fclose(fid)
 


Nach dem Start bekomme ich 3 Dateien mit et folgendem Inhalt

DP LF RR SH LR RF FP.COFx FP.COFy FP.COGx FP.COGy
2 18.69 10.45 -0.18 11.96 19.13 -0.18 2.73 -0.16 2.75

Der Code ist zwar nicht super sauber, aber für den Anfang reichts.
Codetuninng musst Du schon selbst machen... Smile


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Michaela
Forum-Century

Forum-Century


Beiträge: 239
Anmeldedatum: 12.07.07
Wohnort: ---
Version: bis 2007b
     Beitrag Verfasst am: 15.01.2008, 23:20     Titel:
  Antworten mit Zitat      
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.....
Private Nachricht senden Benutzer-Profile anzeigen
 
noob
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 15.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2008, 13:03     Titel:
  Antworten mit Zitat      
danke für die schnelle hilfe!

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.

mfg
Private Nachricht senden Benutzer-Profile anzeigen
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 16.01.2008, 23:47     Titel:
  Antworten mit Zitat      
So jungs... Ihr schuldet mir was... Rolling Eyes

hier vollständiger Code der funzt... mehrmals getestet mit dem Beispiel textfile.
Code:
fid = fopen('testfile.txt')
%
% Main-Header überspringen (14 Zeilen)
for i=1:14
   fgetl(fid)
end
%
try
   n = 0;
   while 1
      %
      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 mit laufenden Nummer, weil sonst Files überschrieben werden können.
      fname = sprintf('%s_%s_%s_%s%s_%d.dat', ...
         test_type,trial_num,cond_num,test_comm{3}(1:2),test_comm{4}(1:2),...
         n)
      %
      %file anlegen
      fid1 = fopen(fname,'wt');
      %
      % restlichen Header überspringen und die 2 Zeile auslesen und speichern
      for i=1:2
         fgetl(fid);
      end
      %
      fprintf(fid1,'%s\n',fgetl(fid));
      %
      % 3 zeile überspringen
      fgetl(fid);
      %
      % 4 speichern
      fprintf(fid1,'%s\n',fgetl(fid));
      %
      % angelegten File schliessen
      fclose(fid1);
      %
      % 23 Zeilen überspringen
      for i=1:23
         fgetl(fid)
      end
      %
   end% while
end% try
%
fclose(fid)


Als ergebnis werden folgende Dateien angelegt:
Code:
erasT_5_1_golu_1.dat
erasT_6_1_golu_2.dat
erasT_5_1_golu_3.dat


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!
Private Nachricht senden Benutzer-Profile anzeigen
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 17.01.2008, 13:06     Titel:
  Antworten mit Zitat      
Hallo Martin,

Zitat:
Edit by Martin: Hab es in Code-Formatierung umgewandelt!


Das war meine Absicht und zwar weil
"\n" wird in der Code Darstellung nicht angezeigt!

das bezieht sich auf die Zeile
Code:
fprintf(fid1,'%s\n',fgetl(fid));

sollte aber so ausschauen
printf(fid1,'%s\n',fgetl(fid));


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
noob
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 15.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.01.2008, 13:35     Titel: Danke!
  Antworten mit Zitat      
Danke outsider!
der code ist perfekt, wir sind schwer beeindruckt Shocked
echt toll wie einem hier geholfen wird!

wennst mal in wien unterwegs bist, steht ein bier Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Martin
Admin

Admin



Beiträge: 651
Anmeldedatum: 16.06.07
Wohnort: Bietigheim-Bissingen
Version: ---
     Beitrag Verfasst am: 17.01.2008, 20:29     Titel:
  Antworten mit Zitat      
outsider hat Folgendes geschrieben:
Hallo Martin,

Zitat:
Edit by Martin: Hab es in Code-Formatierung umgewandelt!


Das war meine Absicht und zwar weil
"\n" wird in der Code Darstellung nicht angezeigt!

das bezieht sich auf die Zeile
Code:
fprintf(fid1,'%s\n',fgetl(fid));

sollte aber so ausschauen
printf(fid1,'%s\n',fgetl(fid));


MfG


Ui, ein sehr interessanter "Bug", mal sehen wann ich Zeit für ihn finde.
Danke für den Hinweis Smile

Gruß Martin
_________________

Der kleine goMatlab.de-Knigge - Eine kleine Liste von wichtigen Regeln, die jeder beachten sollte
Private Nachricht senden Benutzer-Profile anzeigen
 
noob
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 15.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2008, 13:50     Titel:
  Antworten mit Zitat      
Hi Leute

Nochmals danke für die rasche Hilfestellung

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;
while 1
%
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)
 



Gibts vielleicht noch einen aller letzten ratschlag für uns *g*

testfile.txt
 Beschreibung:

Download
 Dateiname:  testfile.txt
 Dateigröße:  10.42 KB
 Heruntergeladen:  839 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 21.01.2008, 14:26     Titel:
  Antworten mit Zitat      
So jung... das macht nun ein Sixpack! Rolling Eyes
Code:
fid = fopen('testfile.txt')
%
% Main-Header überspringen (14 Zeilen)
for i=1:14;
fgetl(fid)
end
%
try
n = 0;
while 1
%
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');
%
% '/' backslash eliminieren
test_comm(ismember(test_comm,'/'))=[];
% nur die erstn 2 Chars von jedem Keyword extrahieren
test_comm = cellfun(@(x) x(1:2),test_comm(3:end),'UniformOutput',false)
%
%
% filenamen bilden
fname = sprintf('%s_%s_%s_%s.m', ...
test_type,trial_num,cond_num,sprintf('%s',test_comm{:}))
%
%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 ',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)


funzt fehlerfrei mit dem Beispiel textfile


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 21.01.2008, 15:00     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 21.01.2008, 15:28     Titel:
  Antworten mit Zitat      
Code:
Für sowas wäre ich, als ich das Programmieren gelernt hab, vom Übungsleiter geköpft worden ;)

Und völlig zu Recht! Smile

Zitat:
Das Programm erzielt zwar das gewünschte Ergebnis, aber es sollte darauf hingewiesen werden, dass ziemlich gepfuscht/getrickst wird.

daraufhin habe ich schon im ersten Post hingewiesen.


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
noob
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 15.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2008, 16:18     Titel:
  Antworten mit Zitat      
wiederum ein großes danke

es gibt jedoch eine fehlermeldung, wenn wir den code ausführen wollen:

und zwar in der 26 Zeile:
test_comm = cellfun(@(x) x(1:2),test_com (3:end),'UniformOutput',false)

schreibt matlab folgendes:
>> funk
??? Error: File: C:\MATLAB6\work\funk.m Line: 26 Column: 22
"identifier" expected, "(" found.

kann das vielleicht am 'UnigormOutput' liegen? oder haben wir da wiedermal was falsch verstanden?

lg

ps: ne kiste österreichisches bier steht noch immer in wien zum abholen bereit!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 21.01.2008, 16:33     Titel:
  Antworten mit Zitat      
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 "@".
Private Nachricht senden Benutzer-Profile anzeigen
 
noob
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 15.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2008, 16:45     Titel:
  Antworten mit Zitat      
das könnte der fehler sein, das problem jedoch ist dass wir nur matlb 6.5 zur verfügung haben. Sparmaßnahmen an der FH.

Gibts glaubst eine möglichkeit das irgendwie anders zu realisieren?

wäre sehr hilfreich

lg danke an alle helferlein
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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