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

fehlerhafte formatierung num2str, nur tab ohne leerzeile

 

Vanillebacke
Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 06.05.09
Wohnort: Hamburg
Version: R2014a
     Beitrag Verfasst am: 06.01.2011, 13:33     Titel: fehlerhafte formatierung num2str, nur tab ohne leerzeile
  Antworten mit Zitat      
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');

% Öffnet die abgespeicherte Textdatei
fid = fopen(f,'w');
dlmwrite(f,Head{1,1},'delimiter', '','-append');
dlmwrite(f,Head{2,1},'delimiter', '','-append');
dlmwrite(f,Head{3,1},'delimiter', '','-append');
dlmwrite(f,Head{4,1},'delimiter', '','-append');
dlmwrite(f,Head{5,1},'delimiter', '','-append');
dlmwrite(f,Head{6,1},'delimiter', '','-append');
dlmwrite(f,Head{7,1},'delimiter', '','-append');
dlmwrite(f,Head{8,1},'delimiter', '','-append');


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

%Schließt die Datei wieder
fclose(fid);
 
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.01.2011, 18:16     Titel: Re: fehlerhafte formatierung num2str, nur tab ohne leerzeile
  Antworten mit Zitat      
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.
Code:

function WriteData(Head, Zeit, Daten_ALL)

[FileName, FilePath] = uiputfile('*.txt','Select a TXT-File');
if ~ischar(FileName)
  return;
end
File = fullfile(FilePath, FileName);

% Öffnet die abgespeicherte Textdatei
fid = fopen(File, 'w');
fprintf(fid, '%s\n', Head{:});

% 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
    if rem(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);

fclose(fid);
 

Ich vermute, dass die WAITBAR hier mehr Zeit braucht, als das eigentliche Schreiben. Deshalb habe ich die Updates mal etwas eingeschränkt.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Vanillebacke
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 06.05.09
Wohnort: Hamburg
Version: R2014a
     Beitrag Verfasst am: 06.01.2011, 19:15     Titel:
  Antworten mit Zitat      
hey jan,

danke schonmal für deine ausführliche antwort.

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.

danke für weitere hilfe

original.txt
 Beschreibung:

Download
 Dateiname:  original.txt
 Dateigröße:  4.55 MB
 Heruntergeladen:  1034 mal
test1.txt
 Beschreibung:

Download
 Dateiname:  test1.txt
 Dateigröße:  528.71 KB
 Heruntergeladen:  796 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.01.2011, 21:52     Titel:
  Antworten mit Zitat      
Hallo Vanillebacke,

Zitat:
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Vanillebacke
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 06.05.09
Wohnort: Hamburg
Version: R2014a
     Beitrag Verfasst am: 07.01.2011, 13:36     Titel:
  Antworten mit Zitat      
Hey Jan,

ja danke hast recht, hab wohl gestern zu lang dran gesessen, dass ich den wald vor lauter bäumen nicht mehr gesehen habe....Smile Danke dir für deine Hilfe....

Gruß

vb
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.01.2011, 00:55     Titel:
  Antworten mit Zitat      
Hallo Vanillebacke,

Klappt's denn jetzt? Das wäre schön!

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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.