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

Ascii file verarbeiten

 

affho
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2010, 21:01     Titel: Ascii file verarbeiten
  Antworten mit Zitat      
Hallo.
Habe schon lange sowas nicht mehr gemacht und wollte mal die zugegebenermaßen ziemlich doofe Frage stellen, wie ich anfangen kann. Ich würde gerne ein ascii-file mit folgendem Format importieren, nur wie.
Alle built-in functions stören sich an den Strings, korrekt??

--"komplett" soll ignoriert werden
--aus den querzeilen soll jeweils ein vektor eingelesen werden und
erkannt werden, daß hier in eine neue Variable geschrieben werden soll
--die neuen dateien sollen dann jeweils "Ov" bzw "C+Ru" heissen

Es handelt sich um ein Datenfile aus einem Spektroskop. Die Querzeilen beinhalten die Versuchsparameter, die langen Spalten die Intensitätswerte.

Zitat:

komplett
100.00610 1260.16235 1.00708 5.00000 0.10000 1153 46.1 1253.60
Ov
26119
25911
25501
24826
24807
24527
24099
23651
23391
23084
22833
22668
.
.
.
.
213
244
233
940.00244 989.99023 0.09155 70.00000 0.10000 547 23.1 1253.60
C+Ru
6200
6204
6420


Tausen Dank für ein klein wenig Starthilfe!
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: 25.07.2010, 00:26     Titel: Re: Ascii file verarbeiten
  Antworten mit Zitat      
Hallo affho,

Code:

outFID = 0;
inFID = fopen(FileName, 'rb');
if inFID < 0, error('Cannot open input file'); end
dummy = fgetl(inFID);  % Skip 'komplett'

NL = char(10);  % Or [13, 10] for DOS line breaks

while 1
   Line = fgetl(inFID);
   if ~ischar(Line)
      break;
   end
   Param = sscanf(Line, '%g');
   if length(Param) > 1
     if outFID ~= 0
        fclose(outFID);
     end
     Name = fgetl(inFID);
     outFID = fopen(Name, 'wb');
     if outFID < 0, error('Cannot open output file'); end
   else  % length(Param) > 1
    % Exact copy of the line, while FPRINTF('%g') can influence
    % the accuracy:
     fwrite(outFID, Line, 'uchar');
     fwrite(outFID, NL, 'uchar');
   end
end
fclose(inFID);
fclose(outFID);
 


Hattest Du an so etwas gedacht?

Gute Nacht, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2010, 00:41     Titel:
  Antworten mit Zitat      
Bin gerade dabei, den Code zu schnallen.
Kann es kaum fassen, daß sich jemand die Mühe gemacht hat. Echt hammerhart. Das muß dir ja echt Spaß machen....
Dauert jetzt erstmal ne Weile.
Mußte erstmal kucken, was "while 1" heißt.
Jetzt gerade über fopen--'rb' ...was ist das denn??
Jedenfalls vielen Dank da draussen, eucht zu nett!!
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.07.2010, 01:06     Titel:
  Antworten mit Zitat      
Hallo affho,

Code:
fopen(FileName, 'rb')

bedeutet: Öffne eine File zum Lesen (read) im binary mode. Im Text-Mode "rt" werden die Zeilen-Enden-Zeichen in Abhängigkeit vom Betriebssystem behandelt. Z.B. unter Windows werden CHAR([13, 10]) in CHAR(10) übersetzt, ohne den aktuellen File-Lese-Cursor weiterzuschieben. Dies ist selten nützlich, kostet aber Rechenzeit.

"while 1" ist einfach nur eine Endlos-Schleife, die mit BREAK unterbrochen wird, nachdem FGETL statt eines Strings (getestet mit ISCHAR) die Ausgabe 0 zurückgeliefert hat (also das File-Ende erreicht ist).

Ja, Matlab macht mir Spaß. Es war auch schneller das zu programmieren, als zu beschreiben, wie es gemacht werden könnte. Leider kann ich es auf meinem Internet-Rechner nicht laufen lassen (kein Matlab drauf), so dass Du es noch testen müsstest. Bei Error einfach nochmal posten.

Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
affho
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2010, 10:56     Titel:
  Antworten mit Zitat      
OK, vermutlich beschränken sich deine Programmierfähigkeiten nicht nur auf die Verabreitung von irgendwelchen Messdaten Smile
Das führt andererseits dazu, daß ich nicht wirklich die einzelnen Schritte des Codes nachvollziehen kann, zumindest nicht so gut, daß ich selbst Code reinbasteln könnte; jedenfalls nicht ganz auf die Schnelle. Shame on me. Gut auf jeden Fall, fgetl zu kennen.
ZB hätte ich jetzt erwartet, daß in "PARAM" der Inhalt der jeweiligen Querzeile aus dem Ursprungsfile steht. Das tut aber aber nicht, wie ich feststellen mußte. Wäre das ausgegeben gewesen, hätte ich da mal anknüpfen können.
Was ich letztlich bräuchte, da du schon so nett anbietest, auch wenn kein ERROR pop-upt: Ein File mit zwei Spalten x und y, wobei die idealerweise Tabstop-getrennt sein und Kommazahlen mit "Punkt" dargestellt sein sollten, denn so hätte das Peak-fit Programm das gerne. y liefert schon dein Code und schreibt das in die Files, genau so, wie ich das wollte. x könnte wie folgt erzeugt werden:

Code:

xpre(1)=Querzeile(1);
for i=2:length(y)
 xpre(i)=xpre(i-1)+Querzeile(3);
end
for i=1:length(y)
 x(i)=(Querzeile(8)-xpre(i))*(-1);
end
 


Könntest du das evtl noch an der richtigen Stelle einbauen??
Dann wäre ich vollständig glücklich.
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: 25.07.2010, 11:59     Titel: Re: Ascii file verarbeiten
  Antworten mit Zitat      
Hallo affho,

ich versuche mal Deinen Code einzubauen. Das geht nicht direkt, weil die LENGTH(y) nicht von Anfang an bekannt ist. Das geht aber trotzdem, weil man die X-Werte auch Schritt für Schritt erzeugen kann.

Vielleicht schaffe ich ads heute Abend, Du kannst es aber auch selbst mal versuchen. Mit dem Debugger (kleine rote Punkte links neben dem Code im Editor setzen) kannst Du übrigens das Programm Zeile-für-Zeile bearbeiten und Dir ganz genau in aller Ruhe anschauen, was passiert.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2010, 23:35     Titel:
  Antworten mit Zitat      
Hallo Jan,
die Sache mit dem Debugger is ja ziemlich gut zu wissen.
Was mir die größten Probleme mit dem Verständnis bereitet, ist die scheinbar willkürliche Ausgabe von "fopen".
Die beiden Codezeilen
Code:

     fwrite(outFID, Line, 'uchar');
     fwrite(outFID, NL, 'uchar');
 

sind mir leider auch völlig unklar. Zusätzlich fehlt mir jedes Verständnis für die Notwendigkeit der Definition von NL.

Auch nach längerem Hin und Her ist es mir zumindest heute nicht so ganz klar geworden. Ich denke zwar schon, daß ich das irgendwie schaffen sollte, aber vielleicht hast du mehr Spaß daran?? Very Happy Very Happy
Beleidigt wäre ich nicht, wenn du das machen würdest...andererseits wenn nicht, bin ich trotzdem schon sehr dankbar.
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: 25.07.2010, 23:52     Titel: Re: Ascii file verarbeiten
  Antworten mit Zitat      
Hallo affho,

Ich bin am Zweifeln. Es ist nicht sinnvoll Dir ein Programm zu schreiben, wenn Du es nicht debuggen oder kleine Anpassungen vornehmen kannst. Wenn diese Aufgabe eine Arbeit ist, die erledigt werden sollte, dann sollte sie auch richtig erledigt werden.

Also beschäftige Dich noch ein wenig mit FOPEN und dem Zeilen-Enden-Zeichen, bis es Dir klar wird. Dann melde Dich doch nochmal wieder.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.07.2010, 00:16     Titel:
  Antworten mit Zitat      
Naj, was heißt "Aufgabe...., die erledigt werden sollte". Ich habe eben nicht die größte Lust, alle Spektren der nächsten 3 Jahre per Excel durchzuwursten Crying or Very sad
Aber du hast sicher recht: Lieber morgen mal mit klarem Kopf draufkucken. Danke dir auf jeden Fall vielmals!
Private Nachricht senden Benutzer-Profile anzeigen
 
affho
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.07.2010, 20:41     Titel:
  Antworten mit Zitat      
Es hakt an vielen Stellen vermutlich.
Dein Rahmenwerk ist einfach ne Ecken zu mächtig für meine Anwendung oder so Smile
evtl könntest du mich nochmal auf die richtige Spur bringen?? Vermutlich fehlt vor allem die Zuordnung von x zu den jeweiligen Files und die Ausgabe von x...nur schnall ich einfach "fopen" nicht.

Code:


fclose all;                                                                                 %neu
clear all;                                                                                  %neu

oe=1;
outFID = 0;
inFID = fopen('rubr.1', 'rb');
if inFID < 0, error('Cannot open input file'); end
dummy = fgetl(inFID);  % Skip 'komplett'

NL = char(10);  % Or [13, 10] for DOS line breaks

while 1
   Line = fgetl(inFID);
   if ~ischar(Line)
      break;
   end
   Param = sscanf(Line, '%g');
   if length(Param) > 1
     if outFID ~= 0
        fclose(outFID);
     end
   
     
     Name = fgetl(inFID);
     outFID = fopen(Name, 'wb');
     outFID2 = fopen(oe, 'wb');
     xvor(1)=Param(1);
     x(1)=-(Param(8)-Param(1));                                                              %neu
     k=2;                                                                                    %neu
     s=Param(3);                                                                             %neu
     oe=oe+1;
     fwrite(outFID2,x(1),'uchar');                                                           %neu
     fwrite(outFID2, NL, 'uchar');                                                           %neu
     if outFID < 0, error('Cannot open output file'); end
   else  % length(Param) > 1
    % Exact copy of the line, while FPRINTF('%g') can influence
    % the accuracy:
    xvor(k)=xvor(k-1)+s;                                                                     %neu
    x(k)=-(Param(8)-xvor(k));                                                                %neu  
    fwrite(outFID, Line, 'uchar');
    fwrite(outFID, NL, 'uchar');                                                                      
    fwrite(outFID2, x(k),'uchar');                                                           %neu
    fwrite(outFID2, NL, 'uchar');                                                            %neu
    k=k+1;                                                                                   %neu
   end
end
fclose(inFID);
fclose(outFID);  
Private Nachricht senden Benutzer-Profile anzeigen
 
affho
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.07.2010, 21:45     Titel:
  Antworten mit Zitat      
Gibt es nicht irgendeine Importfunktion, mit der ich das ganze Ursprungsfile als Matrix oder cell array einlesen kann??
Von da an wäre es für mich sehr einfach mit endlosen wunderschönen for-Schleifen weiterzumachen.. wenn das wohl leider nie elegeant werden wird, funktioniert es auch. Ich kann da leider nicht einsteigen in deinen Code..??..
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 - 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.