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

e (exponential) und +/- in Zahl --> NaN

 

equi
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 07.03.17
Wohnort: Tübingen
Version: Matlab 2018a
     Beitrag Verfasst am: 29.06.2017, 11:55     Titel: e (exponential) und +/- in Zahl --> NaN
  Antworten mit Zitat      
Hallo zusammen,

es liegen mir mehrere .dat-Dateien vor, diese möchte ich über eine Funktion in eine .csv-Datei umwandeln.
Die .dat-Dateien liegen wie im Anhang vor (8 Spalten, +0.0000e+000).

Das Problem liegt hier damit in der csv-Datei immer nun NaN kommt...
Ich vermute mal es liegt einfach daran, damit in der Zahl +/- bzw e (Exponent) vorkommt.
Ich habe das + einfach mit strrep entfern, das minus kann ich natürlich nicht einfach entfernen.
Das nächste Problem ist das e, in Matlab ist ja e^ = exp().

Ich vermute mal, da mir die Werte als Cell vorliegen erkennt er exp nicht als "Zahl" sondern als Zeichen.

Code:
function fileout=convertscope(filein)

fin=fopen(filein, 'r');
   A=textscan(fin, '%s%s%s%s%s%s%s%s', 'delimiter',';', 'headerlines',9);  
   a=cellstr(A(1,1));
   b=cellstr(A(1,2));
   c=cellstr(A(1,3));
   d=cellstr(A(1,4));
   e=cellstr(A(1,5));
   f=cellstr(A(1,6));
   g=cellstr(A(1,7));
   h=cellstr(A(1,8));
   A_b=strrep([a,b,c,d,e,f,g,h],'+',''); %Entfernt +
   A_c=strrep(A_b,' ',',');%Tauscht Leerzeichen in Komma(Trennzeichen von Spalte)
   A_d=strrep(A_c,'e','exp');
   B=str2double(A_d);    
   dlmwrite([strrep(filein,'.dat','') '.csv'],B,',');  
 [fileout]=([strrep(filein,'.dat','') '.csv']);
   fclose(fin); %Wird nicht benötigt?
  end


Ist bestimmt recht simple das zu korrigieren bzw. umzuwandeln aber ich komm nicht drauf Crying or Very sad

Ich hoffe ihr könnt mir helfen

Datei1.zip
 Beschreibung:
Musste ich leider zippen, da es .dat nicht hochgeladen hat

Download
 Dateiname:  Datei1.zip
 Dateigröße:  30.39 KB
 Heruntergeladen:  452 mal
Datei1_Screenshot.JPG
 Beschreibung:

Download
 Dateiname:  Datei1_Screenshot.JPG
 Dateigröße:  254.65 KB
 Heruntergeladen:  485 mal

_________________

Grüße Equi Smile
Private Nachricht senden Benutzer-Profile anzeigen


equi
Themenstarter

Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 07.03.17
Wohnort: Tübingen
Version: Matlab 2018a
     Beitrag Verfasst am: 06.07.2017, 07:34     Titel:
  Antworten mit Zitat      
Hat niemand eine Idee, wie ich die Datei einlesen kann damit Matlab das e nicht als e (Zeichen) sondern als Exponentialfunktion einliest?
_________________

Grüße Equi Smile
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.07.2017, 10:41     Titel:
  Antworten mit Zitat      
Hallo equi,

Nur als Bemerkung: "e" ist nicht die "Exponential-Funktion":
Code:
disp(1e2)   % 100
disp(1*exp(2))  % 7.38905609893065


Wie wäre es die Zahlen gleich als Zahlen einzulesen, also mit %f statt %s?
Code:
A=textscan(fin, '%f%f%f%f%f%f%f%f', 'delimiter',';', 'headerlines',9);


'+1e+02' ist ein String, der von Matlabs sscanf oder fscanf auf Anhieb erkannt wird. textscan und str2double schaffen das dann auch. Es sind keine weiteren Verrenkungen nötig.

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

Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 07.03.17
Wohnort: Tübingen
Version: Matlab 2018a
     Beitrag Verfasst am: 10.07.2017, 08:26     Titel:
  Antworten mit Zitat      
Hallo Jan,

ohman Embarassed das ist mir jetzt etwas peinlich Rolling Eyes

du hast natürlich recht damit e nicht die Exponentialfunktion ist, ich weiß gar nicht wie ich da drauf gekommen bin Embarassed musste gerade deswegen voll lachen Very Happy

Ja wenn ich es direkt mit %f machen funktionierts Very Happy

Danke Smile

Jetzt hat sich allerdings eine weitere frage aufgetan und zwar liest es nur bis Zeile 248 ein ich habe aber 3260 Zeilen, an was kann das liegen?

Es kommt keine Fehler Meldung und wenn ich die .dat Datei mittel Notepad++ öffne sind auch in dieser Zeile keine Auffälligkeiten.
_________________

Grüße Equi Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
equi
Themenstarter

Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 07.03.17
Wohnort: Tübingen
Version: Matlab 2018a
     Beitrag Verfasst am: 10.07.2017, 12:53     Titel:
  Antworten mit Zitat      
Hier der Code, die .dat Datei ist oben in der Zip Datei

Code:
function fileout=convertscope(filein)
 
fin=fopen(filein, 'r');
   A=textscan(fin, '%f%f%f%f%f%f%f%f%f%f', 'delimiter','\t', 'headerlines',9);  

   a=cell2mat(A(1,1)); % liest bis Zeile 248  
   b=cell2mat(A(1,2)); % liest bis Zeile 248
   c=cell2mat(A(1,3)); % liest bis Zeile 248
   d=cell2mat(A(1,4)); % liest bis Zeile 248
   e=cell2mat(A(1,5)); % liest bis Zeile 248
   f=cell2mat(A(1,6)); % liest bis Zeile 248

   g=cell2mat(A(1,7)); % liest bis Zeile 247
   h=cell2mat(A(1,8)); % liest bis Zeile 247
   i=cell2mat(A(1,9)); % liest bis Zeile 247
   j=cell2mat(A(1,10)); % liest bis Zeile 247

   B=[a,b,c,d,e,f,g,h,i,j];
   dlmwrite([strrep(filein,'.dat','') '.csv'],B,',');  
 [fileout]=([strrep(filein,'.dat','') '.csv']);
   fclose(fin); %Wird nicht benötigt?
  end


Eventuell kann es jemand bei sich Versuchen ob Matlab da alle Zeilen einliest, denn ich finde keinen Grund warum das einlesen mitten in der Datei aufhört einzulesen.
_________________

Grüße Equi Smile
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: 10.07.2017, 13:41     Titel:
  Antworten mit Zitat      
Hallo equi,

Ein paar Fragen zum Code:
Code:
function fileout=convertscope(filein)

   a=cell2mat(A(1,1)); % liest bis Zeile 248  
% Einfacher:
  a = A{1};
  % usw. Oder gleich einfacher:
  B = cat(2, A{:});

   B=[a,b,c,d,e,f,g,h,i,j];

   dlmwrite([strrep(filein,'.dat','') '.csv'],B,',');
% Ich würde mich nie darauf verlassen, dass "filein" nicht auch einen Pfad
% enthält, z.B. "C:\Man.dataFolder\File.dat". Hier dann ".dat" zu ersetzen ist
% tückisch! Sicherer:
  [fPath, fName] = fileparts(filein);
  fileout = fullfile(fPath, [fName, '.csv']);
  dlmwrite(fileout, B, ',');

   fclose(fin); %Wird nicht benötigt?
   % Doch, wird dringend benötigt!  
end

Es ist wichtig, geöffnete Files wieder zu schließen. Das Betriebssystem beschränkt die Zahl offener Files nämlich auf etwa 200 (Kommt auf das System an). Wenn dann fopen plötzlich scheitert, kann man lange nach der Ursache suchen...

Ich habe Deinen Code verwendet und das angehängte File problemlos gelesen. Ich kann nicht nachvollziehen, wieso Du meinst, es würden nur 248 Zeilen eingelesen. Die letzte 4 Zeilen sind unvollständig, deshalb enthalten die Daten NaNs. Aber es werden wie erwartet alle 2415 Zeilen importiert.
Teste es also nochmal.

Vielleicht liest Du nicht das File ein, das beabsichtigt ist? Wenn man Files ohne Pfad öffnet, sollte man beachten, dass z.B. ein Timer oder GUI-Callback den aktuellen Ordner ändern kann. Darum sollte man Files grundsätzlich und immer mit Pfad-Namen definieren.

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

Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 07.03.17
Wohnort: Tübingen
Version: Matlab 2018a
     Beitrag Verfasst am: 10.07.2017, 14:33     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen dank für deine Hilfe!
Files mit dem Pfad-Namen zu definieren macht für mich jetzt auch sinn, vielen dank für die Erklärung!
Werde ich ab jetzt immer so machen Smile



Code:
function fileout=convertscope(filein)

fin=fopen(filein, 'r');
  % A=textscan(fin, '%f%f%f%f%f%f%f%f%f%f', 'delimiter','\t', 'headerlines',9);  
   A=textscan(fin, repmat('%f',1,10), 'delimiter','\t', 'headerlines',9);
   a=A{1};
   b=A{2};
   c=A{3};
   d=A{4};
   e=A{5};
   f=A{6};
   g=A{7};
   h=A{8};
   i=A{9};
   j=A{10};
% bzw. mit B = cat(2, A{:});  
   
   B=[a,b,c,d,e,f,g,h,i,j];
  [fPath, fName] = fileparts(filein); % Pfad und Dateiname
  fileout = fullfile(fPath, [fName, '.csv']);  % hängt an Pfad und Dateiname .csv
  dlmwrite(fileout, B, ',');
  fclose(fin);
end  


Kommt bei mir trotzdem immer "horizontal dimensions mismatch (248x6 vs 247x1)" ganz komisch... und dieses mal habe ich die Datei mit Pfad aufgerufen.

Ich versuch es mal heute Abend an meinem Laptop ob es da funktioniert.
Ich gebe bescheid sobald ich es getestet habe.

Und Vielen Dank für deine Hilfe:)
_________________

Grüße Equi Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
equi
Themenstarter

Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 07.03.17
Wohnort: Tübingen
Version: Matlab 2018a
     Beitrag Verfasst am: 18.07.2017, 13:15     Titel:
  Antworten mit Zitat      
Ich hab ganz vergessen zu antworten Shocked

Also am Laptop funktioniert es...

Vielen Dank für deine Hilfe Jan!
_________________

Grüße Equi Smile
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.