Verfasst am: 06.01.2011, 12:33
Titel: fehlerhafte formatierung num2str, nur tab ohne leerzeile
Moinsen,
ich habe einen Code geschrieben, der aus verschieden Daten (Zeit und Messwerte und einem Header) eine Text datei schreibt. Diese Textdatei ist bis auf den Trenner zwischen den einzelnen Messwerten in ordnung. Mein Ziel ist es, dass die Messwerte nur durch einen TAB voneinander getrennt werden. Dies geschieht nur bei Zahlen mit 3 Ziffern (z.b. 100 100). Bei zweiziffrigen Zahlen, werden zusätzlich eine Leerzeile eingefügt bzw. zwei bei dreiziffrigen. Diese sollen verschwinden, da die Datei für einen weiteren Import sonst nicht zu verwenden ist.
Die Stelle an dem der Code wahrscheinlich geändert werden muss, befindet sich bei : "test3=....."
Bin für jegliche Hilfe sehr dankbar!!
grüße vb
Code:
% Speichern der Ausgangsmatrix als Textdatei, mit dem ';' als Trennzeichen:
% Aufrufen der Dialogbox zum Abspeichern % Eingabe des zu speichernden Dateinamens als Textdatei
f = uiputfile('*.txt','Select a TXT-File');
% VARIABELN (Kopf, Zeit, und korrigierte Messwerte) aus dem "Base"-WS
Head=evalin('base','Header');
Zeit=evalin('base','Zeit');
Daten_ALL=evalin('base','Daten_ALL');
% Schreibt in die Textdatei die abzuspeichernde Matrix
Nl=length(Zeit);
o=waitbar(0, 'Datei wird geschrieben...(Dieser Vorgang kann einige Minuten dauern)');
for k=1:Nl
waitbar(k/Nl);
% test3=num2str(Daten_ALL(k,2:97),'%-3i\t');
test3=num2str(Daten_ALL(k,2:97),'%hu\t');
test4=strcat(Zeit(k),test3);
dlmwrite(f,test4,'delimiter','','-append');
end;
close(o);
Verfasst am: 06.01.2011, 17:16
Titel: Re: fehlerhafte formatierung num2str, nur tab ohne leerzeile
Hallo Vanillebacke,
Ich kann das "%hu"-Format für NUM2STR nicht in der Dokumentation finden. Wie kommst Du darauf und was soll es bewirken?
Zitat:
Mein Ziel ist es, dass die Messwerte nur durch einen TAB voneinander getrennt werden. Dies geschieht nur bei Zahlen mit 3 Ziffern (z.b. 100 100). Bei zweiziffrigen Zahlen, werden zusätzlich eine Leerzeile eingefügt bzw. zwei bei dreiziffrigen.
Es wäre praktisch, wenn Du ein Beispiel angeben könntest. Welche "Zahlen" sind drei-ziffrig?
Welchen Wert hat "Zeit(k)" in "test4=strcat(Zeit(k),test3);"?
Eigentlich müsste "Zeit" ein String sein, oder ein Cell-string. "Zeit(k)" ginbt dann entweder ein einzelnes CHAR oder einen skalaren Cell string zurück - beides ist hier nicht geeignet.
Du öffnest die Datei mit FOPEN, benutzt den File-Handle aber gar nicht, sondern schreibst mit DLMWRITE. Dann solltest Du eigentlich auf das FOPEN verzichten!
Zudem ist DLMWRITE('-append') auf Dauer ziemlich langsam, weil es dauernd das File wieder öffnen und nach dem Ende suchen muss. Ich vermute, dass eine entsprechende FPRINTF Method deutlich schneller ist.
Die Daten per EVALIN aus dem Baseworkspace zu kopieren ist ausgesprochen unpraktisch und macht die Funktion unnötig unflexibel. Eine ordentliche Übergabe per Input wäre da übersichtlicher und weniger fehleranfällig.
Den Kommentar "% Speichern der Ausgangsmatrix als Textdatei, mit dem ';' als Trennzeichen:" kann ich nicht nachvollziehen. Es werden keine Semikolons verwendet, oder?! Irreführende Kommentar behindern aber das Debuggen und das Verstehen Deines Programms hier.
UIPUTFILE würde ich unbedingt mit dem Pfad benutzen. Ansonsten hat man kaum eine Kontrolle darüber, wo die Files überhaupt landen.
% Schreibt in die Textdatei die abzuspeichernde Matrix
Nl = length(Zeit);
o = waitbar(0, 'Datei wird geschrieben...(Dieser Vorgang kann einige Minuten dauern)');
for k=1:Nl
ifrem(k, 100) == 0% Sonst braucht WAITBAR zu viel Zeit waitbar(k/Nl);
end fprintf('%s\t', Zeit{k}); % Oder '%g' oder passend ??? fprintf('%g\t', Data_ALL(k, 2:97));
fprintf('\n');
end;
close(o);
das %hu"-Format war ein tipp fehler, kann ignoriert werden.
die messwerte können 3ziffrig sein, ist immer unterschiedlich (siehe datei anhang)
ich habe mal deinen code ausprobiert. Dieser funktioniert auch fast, nur dass zum in der erstellten textdatei nur der kopf (head) geschrieben wird und die mesdaten (zeit und messwerte) nur in das command window geschrieben wird.
Es ist die originaldatei beigefügt und eine test datei, die durch meinen code erstellt wird.
Ich habe leider keine weiteren ideen, die mich weiterbringen.
die messwerte können 3ziffrig sein, ist immer unterschiedlich (siehe datei anhang)
Den Fehler können wir natürlich immer noch nicht finden, weil er sich ja gut hinter dem verbergen kann, was Du als Tippfehler in "num2str(Daten, '%hu\t')" umgewandelt hast.
Zitat:
ich habe mal deinen code ausprobiert. Dieser funktioniert auch fast, nur dass zum in der erstellten textdatei nur der kopf (head) geschrieben wird und die mesdaten (zeit und messwerte) nur in das command window geschrieben wird.
Der Fehler liegt daran, dass ich das "fid" in den FPRINTFs vergessen habe. Also bitte ändern:
Code:
fprintf(fid, '%s\t', Zeit{k}); % Oder '%g' oder passend ??? fprintf(fid, '%g\t', Data_ALL(k, 2:97));
fprintf(fid, '\n');
Wusstest Du, dass FPRINTF ins Command Window schreibt, wenn man keinen File-Handle oder 1 angibt? Hättest Du vielleicht aus der puren Anschauung darauf schließen und es selbst verbessern können?
Zitat:
Ich habe leider keine weiteren ideen, die mich weiterbringen.
Wie wäre es, wenn Du auch die "fid"s einfügst und dann meinen Code mal laufen läßt? Oder wenn Du Deinen Code ohne Tippfehler postest?
Ich kann in dem angefügten File jedenfalls keine zusätzlichen Leerzeilen sehen. Es sieht zwar ein wenig chaotisch aus, aber ich sehe den Zusammenhang zu den 2- und 3-zoffrigen Zahlen nicht.
ja danke hast recht, hab wohl gestern zu lang dran gesessen, dass ich den wald vor lauter bäumen nicht mehr gesehen habe.... Danke dir für deine Hilfe....
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.