goMatlab - Mein MATLAB Forum

Mein MATLAB Forum

 
Login  | Registrieren
Bücher:

Automatisierungstechnik

Fachkräfte:
Softwareentwickler MATLAB/Simulink (w/m)
Erarbeitung von Lösungen im Bereich der Schnittstelle zum Simulink-Modell und der Benutzeroberfläche von TargetLink
dSPACE GmbH - Paderborn

Testingenieur (w/m) Testframework für Simulink-basierte Echtzeitanwendungen
Pflege des MATLAB/Simulink-Testframeworks, Spezifizieren von Testkriterien, Testfällen und Testszenarien
dSPACE GmbH - Paderborn

Testingenieur (w/m) Konfigurationswerkzeuge für Echtzeitsysteme
Einbinden von Simulink®-Simulationsmodellen, Verteilung der Simulationsmodelle auf Multicore- und Multiprozessorsysteme
dSPACE GmbH - Paderborn

Senior Systemingenieur/in
Entwicklung von Funktionen im Bereich Antrieb Automotive
ESG Elektroniksystem- und Logistik-GmbH - München

Entwicklungsingenieur/-in Systemengineering - Software - Landmaschinengetriebe
Anforderungsmanagement, Softwareentwicklung, Systemanalysen
ZF Friedrichshafen AG - Friedrichshafen

weitere Angebote

Partner:




Vermarktungspartner


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: 163
Anmeldedatum: 06.05.09
Wohnort: Hamburg
Version: R2010b
     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: 3879
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 6.5, 2009a
     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: 163
Anmeldedatum: 06.05.09
Wohnort: Hamburg
Version: R2010b
     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:  46 mal
test1.txt
 Beschreibung:

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

Beiträge: 3879
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 6.5, 2009a
     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: 163
Anmeldedatum: 06.05.09
Wohnort: Hamburg
Version: R2010b
     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: 3879
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 6.5, 2009a
     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



Options and Permissions
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2012 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.