dabei mussten wir 145 messblöcke aus einer textdatei einzeln in ein m-file speichern. das hat bis jetzt super geklappt, da ein messblock immer genau 2000 messpunkte (=2000 zeilen) lang war.
jetzt haben wir aber bemerkt, das bei machen files bei unbekannten messblöcken plötzlich nur mehr z.b 690 zeilen vorhanden sind.
dh. dass bis zu diesem messblock alle files brav gespeichert werden, doch alle folgenden werden nicht mehr berücksichtigt, weil die zeilen abstände in der for schleife nicht mehr übereinstimmen mit den zeilen aus dem txt-file.
was kann man jetzt machen, dass alle messblöcke (sowohl der kürzere als auch alle 2000er) wie bisher im m-file gespeichert werden
wir nehmen mal an, dass der code irgendwie mit einer if schleife erweitert werden muss, um die daten von header zu header bzw. von leerzeichen zu leerzeichen auszuwerten, egal welche länge die messblöcke aufweisen
% nur die erstn 2 Chars von jedem Keyword extrahieren
test_comm1 = [];
for i=test_comm'
test_comm1 = [test_comm1 i{1}(1:2)];
end% for % % filenamen bilden
fname = sprintf('%s_%s_%s_%s.m', ...
test_type,trial_num,cond_num,test_comm1);
%
%file anlegen
fid1 = fopen([[pwdfilesep 'Mau' filesep], 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 : 2000
zeile = strread(fgetl(fid),'%s','delimiter',' '); % wenn ihr die Spalten durch Tabs getrennt habt, ansonsten ' ' für Leerzeichen % zeile ist nun ein Cell-Array (mit in eurem Fall 10 Einträgen)
zeile = [zeile{7} ' ' zeile{8}]; % hier wird nun ein String definiert, der nur die Werte der 1., 3. und 7. Spalte enthält fprintf(fid1, '%s \n', zeile);
end % % % % angelegten File schliessen fclose(fid1);
% % Zeilen überspringen bis nächster Header -> Test Type fgetl(fid);
% end% while end% try % fclose(fid);
Spontan würde ich vermuten, dass es sich mit einer einfachen Abbruchbedingung machen ließe.
Wie sind die einzelnen Messblöcke denn getrennt?
Angenommen, es handelt sich dabei um Leerzeilen, dann sollte es so funktionieren:
Code:
for i = 1 : 2000
zeile = strread(fgetl(fid),'%s','delimiter',' '); % wenn ihr die Spalten durch Tabs getrennt habt, ansonsten ' ' für Leerzeichen % zeile ist nun ein Cell-Array (mit in eurem Fall 10 Einträgen)
ifisempty(zeile)% Wenn die eingelesene Zeile leer ist (also keine Strings enthält), soll die For-Schleife abgebrochen werden, da das Einlesen der Messdaten beendet ist. break end
zeile = [zeile{7} ' ' zeile{8}]; % hier wird nun ein String definiert, der nur die Werte der 1., 3. und 7. Spalte enthält fprintf(fid1, '%s ', zeile);
end
das problem ist, das zwar die 145 blöcke durchgezählt werden, aber er speichert nur die ab, die vor dem kürzeren datenblock stehen. das liegt wahrscheinlich daran, dass alle datenblöcke eine leerzeile zum nächsten header aufweisen.
wir bräuchten noch irgendeinen zusatz, damit die anderen dann weiter gespeichert werden.
Ich glaube, ich habe den Fehler in meinem Vorschlag gefunden:
Es wird ja die Leerzeile im Fall eines verkürzten Eintrags bereits in der For-Schleife eingelesen, das heißt, sie darf nicht noch einmal am Ende der While-Schleife eingelesen werden.
Versucht es doch mal so:
Code:
flag = 0; % Hinweiszeichen, ob es sich um einen verkürzten Eintrag handelt
for i = 1 : 2000
zeile = strread(fgetl(fid),'%s','delimiter',' '); % wenn ihr die Spalten durch Tabs getrennt habt, ansonsten ' ' für Leerzeichen % zeile ist nun ein Cell-Array (mit in eurem Fall 10 Einträgen)
ifisempty(zeile)% Wenn die eingelesene Zeile leer ist (also keine Strings enthält), soll die For-Schleife abgebrochen werden, da das Einlesen der Messdaten beendet ist.
flag = 1; % Hinweis für verkürzten Eintrag auf "1" also "wahr" setzen. break end
zeile = [zeile{7} ' ' zeile{8}]; % hier wird nun ein String definiert, der nur die Werte der 1., 3. und 7. Spalte enthält fprintf(fid1, '%s ', zeile);
end
%
%
%
% angelegten File schliessen fclose(fid1);
%
% Zeilen überspringen bis nächster Header -> Test Type if ~flag % Für flag = 0 (und damit ~flag "wahr") wird eine Zeile eingelesen. Wenn flag = 1 ist (und damit ~flag "falsch"), wird keine weitere Zeile eingelesen, weil die Leerzeile ja schon in der For-Schleife eingelesen wurde. fgetl(fid);
end
Stimmt, Dein Vorschlag sollte (an der richtigen Stelle eingesetzt) so funktionieren wie meiner.
Zur Syntax:
if ~flag ist in diesem Fall ausreichend, da es nur eine Unterscheidung zwischen Null und Eins geben soll. ~1 ist Null (Boolean "Falsch"), ~0 ist im strengen Sinn jede von ungleich Null verschiedene Zahl, im Boolean-Sinn aber ein "Wahr". Daher ist die Abfrage if ~flag==1 hinfällig.
Wichtig ist aber, dass bei einem Vergleich ein == steht, denn ein einfaches Gleichheitszeichen ist (zumindest unter C, womit ich sonst programmiere) eine Wertzuweisung.
es funktioniert => juhu! nach einem problem mit der namesgebung, funktioniert alles
jetzt ist uns grad noch was eingefallen,
wir haben ja in summe dann mehrere txt-files zu bearbeiten die wir in m-files zerlegen.
momentan haben wir in dem code, den wir mitgeschickt haben, drei mal die stelle in der der name des textfiles vorkommt. da wir dann ungefähr 70 txt-file zum durchlaufen haben, wäre es sehr mühsam immer händisch den namen des files auszubessern. gäbe es eine möglichkeit den namen mit irgendeiner variable zu ersetzen.
im idealfall
- sollte eine abrage am bildschirm kommen die lautet:
geben sie bitte den namen des textfiles ein
oder
- ein pulldown menü bei dem man alle textfiles, die sich im current directory befinden, aufrufen kann
wir hoffen, dass dieses anliegen genauso einfach umzusetzen ist wie das vorige
Damit öffnet sich ein Fenster, in dem die Datei ausgewählt werden kann. Ich benutze das so, man kann halt nur eine Datei auf einmal auswählen.
Vermutlich gibts das auch als Version mit mehreren Dateinamen, die dann in einer Liste stehen, die man durchlaufen kann, um so alles automatisch zu machen, aber soweit kenne ich mich damit nicht aus.
Ihr erhaltet die Variablen "filename", die den Dateinamen als String enthält, und "pathname", die den kompletten Verzeichnispfad als String enthält. Das "*.txt" sorgt dafür, dass nur Dateien mit Endung txt angezeigt werden, das "Select input data file" ist der Name des Fensters.
Evtl ist unter älteren Matlabversionen die Syntax eine andere, schaut einfach in der Hilfe, falls es nicht klappt.
Dadurch wird im Verzeichnis der geöffneten Datei ein Unterverzeichnis erstellt, das den Namen der Datei trägt (ohne die Dateiendung). In diesem Unterverzeichnis werden dann die einzelnen weiteren Dateien angelegt.
wow wir sind schwer beeindruckt. das funktioniert ja bestens
danke danke danke
gibs für unsere zweites problem auch so einen ähnlichen befehl, da möchten wir nämlich den current directory ändern. nachdem wir ja eigne ordner mit dem txt-file namen angelegt haben, brauchen wir noch einen befehl damit nachdem alle txt-files abgearbeitet, die weiteren codes abgearbeitet werden können. bis dato habe wir den current directory per mausklick verändert. es wäre jedoch wünschenswert das so ähnlich zu lösen wie vorher, dass sich ein fenster öffnet bei dem man dann die jeweilige datei auswählen kann.
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.