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

hilfestellung beim auslesen einer textdatei

 

noob
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 15.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2008, 10:27     Titel: hilfestellung beim auslesen einer textdatei
  Antworten mit Zitat      
hi leute, wir dachten ja schon dass wir eure hilfe jetzt schön langsam nicht mehr benötigen, da haben wir uns aber anscheinend getäuscht!

wir hatten ja damals das problem mit dem einlesen einer textdatei, da ist uns auch super schnell bei jedem anliegen geholfen worden. vielleicht als erinnerung: http://www.gomatlab.de/daten-aus-ed.....header-auslesen-t668.html

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

freuen uns auf eure kommentare

ps: nochmals der code für den überblick

Code:

fid = fopen('Mau.txt')
mkdir('Mau');
% 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');
%
test_comm = test_comm(3:end);
% '/' backslash eliminieren
test_comm(ismember(test_comm,'/'))=[];

% 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([[pwd filesep '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);
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: 06.02.2008, 10:51     Titel:
  Antworten mit Zitat      
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)

if isempty(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
 


Wenn die einzelnen Messblöcke anders getrennt sind, muss die Abbruchbedingung natürlich anders aussehen, meldet euch da doch bitte.
Private Nachricht senden Benutzer-Profile anzeigen
 
noob
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 15.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2008, 12:37     Titel:
  Antworten mit Zitat      
danke

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.

lg
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 06.02.2008, 13:12     Titel:
  Antworten mit Zitat      
Moin,
ganz pauschal und schnell würd ich ausgehend von dem vorherigen Bsp. folgendes probieren:
Code:
%
% Zeilen überspringen bis nächster Header -> Test Type (nur wenn die zuletzt eingelesene Zeile NICHT leer war)
if ~isempty(zeile)
fgetl(fid);
end


Probiert mal ob das klappt Wink
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
noob
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 15.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2008, 13:28     Titel:
  Antworten mit Zitat      
hi
so geht gar nix mehr!

das liet daran, dass vor jedem datenblock eine leerzeile ist, egal ob jetzt 2000 zeilen oder nur 690 zeilen in einem datenblock sind

wie könnte man das lösen?

lg
Private Nachricht senden Benutzer-Profile anzeigen
 
noob
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 15.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2008, 13:48     Titel:
  Antworten mit Zitat      
wir dachten irgendwie an
Code:

aber das funktioniert dann ja auch nicht weil ja i am anfang <2000 ist

das nächste problem ist ja, er soll ja trotzdem alle datenblöcke in ein m-file schreiben. egal ob das jetzt kürzer ist
lg
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: 06.02.2008, 13:52     Titel:
  Antworten mit Zitat      
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)

if isempty(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
 
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 06.02.2008, 14:07     Titel:
  Antworten mit Zitat      
Genau das gleiche wollte ich mit meinem Vorschlag ebenfalls bezwecken Sad
Nur was ist falsch an meiner Syntax?!

Muss es bei dir nicht heißen
Code:
?
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
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: 06.02.2008, 14:17     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 06.02.2008, 14:22     Titel:
  Antworten mit Zitat      
Achso ok Smile

Aber dieses blöde "==" vergess ich immer wieder Rolling Eyes

Mein Vorschlag war nur eine leichte Veränderung des oben geposteten Quellcodes...
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
noob
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 15.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2008, 15:23     Titel:
  Antworten mit Zitat      
danke an beide ersthelfer,

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

mit dankbaren grüßen
noobs
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: 06.02.2008, 15:28     Titel:
  Antworten mit Zitat      
Versuchts mal damit:

Code:

[filename, pathname]=uigetfile('*.txt', 'Select input data file:');
 

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
noob
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 15.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2008, 15:38     Titel:
  Antworten mit Zitat      
wir haben uns ja auch schon weiterentwickelt *g* haben jetzt schon matlab 7!

was mach ich mit den namen, die ich schon im code drinnen stehen hab?
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: 06.02.2008, 15:47     Titel:
  Antworten mit Zitat      
Ich denke, folgende Änderungen sollten zur Automatisierung beitragen:

Code:

[filename, pathname]=uigetfile('*.txt', 'Select input data file:');
fid = fopen([pathname filename])
mkdir([pathname filename(1:end-4)]);
% ....
% file anlegen
fid1 = fopen([[pathname filename(1:end-4) filesep], fname],'wt');
 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
noob
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 15.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.02.2008, 09:30     Titel:
  Antworten mit Zitat      
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.

dankende grüße noob
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3  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.