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

AUsgabe in individuelles txt-File

 

GPSev

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2013, 18:18     Titel: AUsgabe in individuelles txt-File
  Antworten mit Zitat      
Hi,

Ich bin Matlab Anfänger und habe es nach einer Woche geschafft ein funktionierendes MAtlab-file zu schreiben (mit stundenlange Recherchen in diesem Forum! DANKE, an dieser Stelle)
Jetzt möchte ich zum krönenden Abschluß meine Daten, die alle in einem Zellen-Array gespeichert sind, da strings und Zahlen enthalten sind, in ein txt-file exportieren, dessen Namen abgefragt werden soll. Nachdem ich das beim file-einlesen schon erfolgreich programmiert habe, habe ich den selben Code kopiert und versucht mit den Befehlen export, fprintf und dlmwrite mein Array zu exportieren. Leider ohne Erfolg. So sieht mein Code aus:
Code:

url = -1;
msg ='';
while url < 0
    pattern = '%s \t %s \t %s \t %s \t %f \t %f \t %f \t %f \t %f \t %f \t ';
    disp(msg);
    filename = input('Output file: ', 's');
      [url,msg] = fprintf(filename, pattern, A);
end
 


Egal, was ich versuch, zeigt mir MAtlab eine Fehlermeldung an. In diesem Fall:

??? Error using ==> fprintf
Too many output arguments.
...

Hat jemand von euch eine Idee, wie ich das lösen könnte?
Vielen Dank!


Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 12.03.2013, 18:49     Titel:
  Antworten mit Zitat      
Hallo,

Beim Aufruf von fprintf hast du 2 Ausgabeparameter angegeben, fprintf kann aber nur einen handhaben. Aus der Hilfe:
Zitat:
nbytes = fprintf(fileID,formatSpec,A1,...,An) additionally returns the number of bytes that fprintf writes.


Zudem musst du fopen und fclose verwenden. Hier mal ein Beispiel; ich denke das verdeutlicht das Vorgehen, um in ein Textfile zu schreiben.

Code:
function write_file()
   filename = 'neu.txt';
   
   % Datei zu filename zum Schreiben (write) öffnen
   fid = fopen( filename, 'w' );
   % Check, ob fid gültig ist
   if( fid < 0 )
      fprintf( 'Kann Datei %s nicht öffnen \n', filename );
      return; % im Fehlerfall Funktion beenden
   end

   % Fünfmal Text von der Tastatur holen
   fprintf( 'Bitte 5 Zeilen Text eingeben : \n' );
   for( n = 1:5 )
      % Text von der Tastatur holen
      tline = input( '- ' );
      % Text-Zeile tline in Datei schreiben
      fprintf( fid, '%s \n', tline );
   end

   % Datei wieder schließen
   fclose( fid );


Grüße,
Seban

Zuletzt bearbeitet von Seban am 12.03.2013, 18:56, insgesamt einmal bearbeitet
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: 12.03.2013, 18:54     Titel: Re: AUsgabe in individuelles txt-File
  Antworten mit Zitat      
Hallo GPSev,

Die Fehlermeldung ist schonmal hilfreich, oder? FPRINTF gibt nur ein Output zurück, und das ist die Anzahl der geschriebenen Elemente.
Allerding benötigt FPRINTF einen File-Identifier als ersten Input, siehe "help fopen". Mir ist nicht klar, was "url" und "msg" sein sollen und wozu die Schleife dient.
UIPUTFILE ist hübscher um einen File-Namen auszusuchen.

Wenn A ein CELL-Array ist, kann man es nicht direkt als Input für FPRINTF verwenden, sondern man benötigt etwas wie:
Code:
A = {'a', 1; 'b', 2};
At = A.';
fprintf(1, 's %g\n', At{:});

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
GPSev

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.03.2013, 17:02     Titel:
  Antworten mit Zitat      
Vielen Dank für die Hilfe!

Leider funktioniert es immer noch nicht. Ich habe versucht, beide Ansätze zu vereinen und an mein Ergebniszellarray anzupassen. Der Code sieht jetzt so aus:
Code:
% Ausgabe
   filename = 'Ausgabe.txt';
   
   % Datei zu filename zum Schreiben (write) öffnen
   fid = fopen( filename, 'w' );
   % Check, ob fid gültig ist
   if( fid < 0 )
      fprintf( 'Kann Datei %s nicht öffnen \n', filename );
      return; % im Fehlerfall Funktion beenden
   end
 
  At=A.';
  % Text-Zeile tline mit Übersetzer pattern in Datei schreiben
  tline = At{:,1};
  pattern = '%s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \n';
  fprintf( fid, pattern, tline );  
     
   for( l = 2:(n+1) )
     % Text-Zeile tline mit Übersetzer in Datei schreiben
      tline = A{:,l};
      pattern = '%s \t %s \t %s \t %s \t %f \t %f \t %f \t %f \t %f \t %f \t %f \t %f \t %f \n';
      fprintf( fid, pattern, tline );
   end

   % Datei wieder schließen
   fclose( fid );
 


Die Fehlermeldung lautet nun:
Code:
??? Error using ==> fprintf
Function is not defined for 'cell' inputs.

Error in ==> Versuch at 141
      fprintf( fid, pattern, tline );
 


Jan's Matrizentransponierung um die Zellarrays auzugeben funktioniert leider nicht.
Die ersten beiden Zeilen des Arrays sehen wie folgt aus:
Code:
'PktNr'   'Datum'   'Uhrzeit'   'Lösung'   'Länge'   'Breite'   'Höhe'   'Qult. Lage'   'Qult. Höhe'   'Qult. 3D'   'Diff. Länge'   'Diff. Breite'   'Diff. Höhe'
'P1'   '07/16/2012'   '04:58:44'   'Code'   16,1032295027778   48,1785276472222   431,080700000000   -2,33526042382346   0,880807564822603   14,0364000000000   -2,33526042382346   0,880807564822603   14,0364000000000
 
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.03.2013, 18:49     Titel:
  Antworten mit Zitat      
Hallo GPSev,

Wenn "tline = At{:,1};" immer noch ein CELL ist, welchen Inhalt hat dann A eigentlich? Dieses Detail können wir nicht erraten, aber es scheint ein CELL aus CELL Strings zu sein. Ist das hilfreich? Dann kann aber der Kasten "Die ersten beiden Zeilen des Arrays sehen wie folgt aus:" nicht stimmen. Zudem erkenne ich nicht, wo die Zeilen aufhören.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
GPSev

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.03.2013, 17:21     Titel:
  Antworten mit Zitat      
Hallo,

Die erste Zeile meines Cells ist nur mit Strings gefüllt (Beschriftung).
Die zweite Zeile beginnt mit der Punktnummer (hier P1) und endet mit den Differenzen. Alle folgenden Zeilen sind aufgebaut wie die zweite Zeile.
Ich will einfach nicht verstehen, dass man das nicht irgendwie exportieren kann!

GPSev
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.03.2013, 15:32     Titel:
  Antworten mit Zitat      
Hallo GPSev,

Die Beschreibung als Text ist deutlich schwerer zu versetehen, als wenn du die entsprechende Matlab-Syntax benutzen würdest. Ich habe keine Ahnung, was "die Punktnummer" ist, und wenn sie "mit den Differenzen endet" ist immer noch nicht erklärt, was im Mittelteil steht.

Zitat:
Ich will einfach nicht verstehen, dass man das nicht irgendwie exportieren kann!

Es lässt sich garantiert so konvertieren, dass man damit arbeiten kann. Bisher ist aber immer noch nicht klar, welches Format die Daten zur Zeit haben, und welches Du benötigst. Siehe z.B. Dein Posting vom 18.03.2013, 16:02. Hier zeigst Du zwar ein Beispiel, aber man muss erraten, wo die Zeile endet und ob das Komma ein Dezimal-Trenner ist oder ob hier ein neues Cell- oder Array-Element beginnt.
Deshalb kann ich Dir noch keinen Ratschlag geben. Bitte stelle die Frage nochmal so klar wie möglich.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.03.2013, 17:09     Titel:
  Antworten mit Zitat      
Sorry,

hier meine bisherverfolgte Logik:
Cell-/Arraytrennzeichen: Leerzeichen od. \t
Dezimaltrennzeichen: . Punkt

Das ganzein Matlab Code:
Die erste Zeile der Ausgabematrix sieht so aus:
Code:

'PktNr'   'Datum'   'Uhrzeit'   'Lösung'   'Länge'   'Breite'   'Höhe'   'Qult. Lage'   'Qult. Höhe'   'Qult. 3D'   'Diff. Länge'   'Diff. Breite'   'Diff. Höhe'
 


Mein zugehörige Formatierung lautet:
Code:

pattern = '%s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t \n';


Alle folgenden Zeilen sehen so aus:
Code:

'P1'   '07/16/2012'   '04:58:44'   'Code'   16.1000   48.1000   431.1000   -6.1000   1.1000   14.1000   -6.1000   1.1000   14.1000
 


Mein Übersetzer dafür lautet:
Code:

pattern = '%s \t %s \t %s \t %s \t %f \t %f \t %f \t %f \t %f \t %f \t %f \t %f \t %f \t \n';
 


Ich hoffe das ich mich jetzt etwas klarer ausgedrückt habe.
Vielen Dank,
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.03.2013, 14:10     Titel:
  Antworten mit Zitat      
Hallo,

Wenn ich es richtig verstehe, könnten Deine Daten also so aussehen:
Code:
Data = {'PktNr', 'Datum', 'Uhrzeit', 'Lösung', 'Länge', 'Breite', 'Höhe', 'Qult. Lage', 'Qult. Höhe', 'Qult. 3D', 'Diff. Länge', 'Diff. Breite', 'Diff. Höhe'; ...
'P1', '07/16/2012', '04:58:44', 'Code', 16.1, 48.1, 431.1, -6.1, 1.1000, 14.1, -6.1, 1.1, 14.1; ...
'P1', '07/16/2012', '04:58:44', 'Code', 16.1000, 48.1, 431.1, -6.1, 1.1000, 14.1, -6.1, 1.1, 14.1};

Richtig? Wenn Du die daten so postest, dass man sie direkt in Matlab per Copy&Paste einfügen kann, sind Lösungsvorschläge mit viel weniger Aufwand zu erstellen.

Das möchtest Du nun als Text-File speichern, oder?

Code:
pattern1 = '%s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t %s \t \n';
parttern2 = '%s \t %s \t %s \t %s \t %f \t %f \t %f \t %f \t %f \t %f \t %f \t %f \t %f \t \n';

FID = fopen(FileName, 'w');
if FID == -1, error('Cannot open file: %s', FileName); end
fprintf(FID, pattern1, Data{1, :});

for iRow = 2:size(Data, 1)
  fprintf(FID, pattern2, Data{iRow, :});
end
fclose(FID);

Oder statt der Schleife:
Code:
DataT = transpose(Data(2:end, :));
fprintf(FID, pattern2, DataT{:});

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
GPSev

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.04.2013, 16:14     Titel:
  Antworten mit Zitat      
Hallo Jan,

Sorry, wenn ich mit der Dateneingabe auf der Leitung gestanden bin. Ja, so sehen meine Daten aus.

Dein vorgeschlagener Code funktioniert teilweise. Die erste Zeile funktioniert klaglos auszugeben. bei den restlichen kommt die altbekannte Fehlermeldung:
Code:
Error using fprintf
Function is not defined for 'cell' inputs.

Error in KoordinatenvergleichUCenter (line 133)
fprintf(FID, pattern2, DataT{:});


Das ist bei beiden Lösungsansätzen gleich. Ich habe nur?! eine Studentenlizenz. Kann das damit zusammenhängen?

Vielen Dank
 
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 - 2025 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.