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

Inhalt einer Datei teilweise löschen

 

Avatarius
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 05.10.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.10.2009, 16:10     Titel: Inhalt einer Datei teilweise löschen
  Antworten mit Zitat      
Hallo zusammen,
ich habe folgendes Problem:

Zu Beginn habe ich eine ATS - Datei (Magnetotellurische Messung).

Bei dieser Datei beinhalten die ersten 1024 Byte den Header, anschließend kommen die gemessenen Rohdaten.

Das Einlesen der Daten und Teile des Headers habe ich hinbekommen. Nun will ich aber nur die ersten x Daten behalten und den Rest aus der Datei löschen.

Bisheriges Vorgehen:

Daten in Array einlesen ( ca. 10*10^6 Zeilen, 5 Spalten )
Neuen Array erstellen, der nur die ersten x Zeilen obigen arrays enthält.
OriginalDatei kopieren
Kopierte Originaldatei öffnen
Mit fseek zur Position 1024 springen und die neuen Daten einfügen. Leider ist die Datei trotzdem so groß wie vorher, da die restlichen Daten nicht abgeschnitten werden.

Aufgrund der Formatierung der Datei ist es mir nicht möglich einfach einen Editor zu nehmen, oder eine neue Datei zu erstellen und den Header reinzukopieren.

Bisheriger Code:

Code:

%atsreadf: reads some headerinformation and raw data from ats-file to
%variables datalf2,hlf2
clear all
disp('start atsreadf');

datalf2=[];
hlf2=[];
channels=[];
types=[];
i=5;
disp('read lf2');
 while i>0
     switch i                                                 %promt to enter channeltype
         case 5
        fileo = input('Input filename Ex serie (press return to skip): ','s');
       
         case 4
        fileo = input('Input filename Ey serie (press return to skip): ','s');
               
         case 3
        fileo = input('Input filename Hx serie (press return to skip): ','s');
               
         case 2
        fileo = input('Input filename Hy serie (press return to skip): ','s');
               
         case 1
        fileo = input('Input filename Hz serie (press return to skip): ','s');
               
     end;

        x = 0;
    y = double(fileo);
    if x~=y
    fid = fopen([fileo '.ats'],'r');                           %opens ats file

        fseek(fid, 4, 'bof');                                  %reads from ats header:
        samplenum=fread(fid,1,'int32=>float32');                        %samplenumber
        samplefreq=fread(fid,1,'float32=>float32');                     %samplefrequencie
        starttime=fread(fid,1,'int32=>float32');                        %unix timestamp
        lsbvalue=fread(fid,1,'float64=>float32');                       %lsbvalue
       
        fseek(fid, 36, 'bof');
        type=fread(fid,1,'int8=>int8');
       
        fseek(fid, 38, 'bof');
        chan=fread(fid,1,'char=>char');
       
        fseek(fid, 1024, 'bof');                                        %timeseries data
        rawdata=fread(fid,'int32=>float32');
       
        datalf2=[datalf2,rawdata.*lsbvalue];                   %contains lf2
        hlf2=[hlf2,[samplenum;samplefreq;starttime;lsbvalue]];
        channels=[channels;chan];
        types=[types;type];
        fclose(fid);
    end;
    i=i-1;
    end;
i=5;    

k=input('display values (y/n)','s');
k=double(k);
if k==121
    format short eng;             %displays headerinfo(4 values) followed by the first 3 values of data for each band and channel:
    if isempty(hlf2)
        i=1;
    else disp(hlf2);
         disp(datalf2(1:5,:));  %       left to right: Ex Ey Hx Hy Hz
    end;
    if i==1
        disp('no files read');
    end;
end;
disp('end of sfatsreadf.m');
disp('start atswrite');

Datenmenge=[];
Cutdatalf2=[];
i=5;
disp('write lf2');

Datenmenge=input('Anzahl der zu behaltenden Datenpunkte: ');  
% Datenmenge=
    while i>0
     switch i                                                 %promt to enter channeltype
         case 5
        fileo = input('Input filename Ex serie (press return to skip): ','s');

         case 4
        fileo = input('Input filename Ey serie (press return to skip): ','s');

         case 3
        fileo = input('Input filename Hx serie (press return to skip): ','s');

         case 2
        fileo = input('Input filename Hy serie (press return to skip): ','s');

         case 1
        fileo = input('Input filename Hz serie (press return to skip): ','s');
     end;
    x = 0;
    y = double(fileo);
   
    if x~=y
   
    Cutdatalf2(:,6-i)=datalf2(1:Datenmenge,6-i)./lsbvalue;    
    sourcename=[fileo '.ats'];
    destname=[fileo 'cut.ats'];    
    copyfile(sourcename,destname);

  fid = fopen(destname,'r+');                           %opens ats file
        fseek(fid, 1024, 'bof');                        
        count=fwrite(fid,Cutdatalf2(:,6-i),'int32')
       
    fclose(fid);
    end;
    i=i-1;
    end;
i=5;    

k=input('display values (y/n)','s');
k=double(k);
if k==121
    format short eng;             %displays headerinfo(4 values) followed by the first 3 values of data for each band and channel:

    if isempty(hlf2)
        i=1;
    else disp(hlf2);
         disp(Cutdatalf2(1:5,:));
    end;
    if i==1
        disp('no files read');
    end;
end;
disp('end of atswritelf2.m');


 


Vielen Dank schonmal
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 05.10.2009, 16:38     Titel:
  Antworten mit Zitat      
Hallo,

ist es möglich auch txt-Datei anzuhängen?

Wenn du den Header und Daten ausliest, wo ist dann das Problem den File
komplett neu zuschreiben bzw überschreiben?
Private Nachricht senden Benutzer-Profile anzeigen
 
Avatarius
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 05.10.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.10.2009, 19:30     Titel:
  Antworten mit Zitat      
Hi,

sorry nächstes mal folgt der Code in einer txt-Datei.

Leider kann ich eben nicht den kompletten Header einlesen und dann einfach eine neue Datei anlegen und dann in diese schreiben. Überschreiben klappt indofern, das der alte Header bestehen bleibt und ddie neuen Daten folgen, allerdings bleiben die alten Daten, die nicht überschrieben werden stehen.


Die Daten sind als LONGINT Binärwert, nach INTEL Ordnung gespeichert ( Aus dem Handbuch )

Im Anhang ist eine solche Datei

105B01BA.zip
 Beschreibung:

Download
 Dateiname:  105B01BA.zip
 Dateigröße:  695.09 KB
 Heruntergeladen:  796 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 05.10.2009, 22:59     Titel:
  Antworten mit Zitat      
Hallo,

hab erstmal nur grob angeschaut, ich brauche etwas mehr Zeit um zu verstehen, was dein Programm macht
Kannst du vielleicht in Worten beschreiben, was du in Code versuchst zu erreichen.


In zeilen 112-114 machst die Datei nur in Lesemodus auf, obwohl du etwas Darauf-schreiben versuchst.

Code:

fid = fopen(destname,'at+');                           %opens ats file
fseek(fid, 1024, 'bof');
count=fwrite(fid,Cutdatalf2(:,6-i),'int32');

fclose(fid);
 
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.