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

dlmwrite überschreibt den Header der Datei.

 

godi
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 25.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2014, 13:51     Titel: dlmwrite überschreibt den Header der Datei.
  Antworten mit Zitat      
Hallo,

ich habe einige csv dateien bei denen die Werte in ein paar Spalten um den Faktor 10 daneben liegen.
Jetzt möchte ich dies mit Matlab bereinigen.

Folgenden Ansatz habe ich schon:
Code:

close all;
clear variables;
clc;

liste = dir('E:\Test\*.csv');
files = {liste.name};

i = 1;
%for i = 1:length(files);

row = 4;
col = 0;
delim = ',';
errorExist = 1;

while errorExist == 1
    try
        M = dlmread(files{i}, delim, row, col);
        errorExist = 0;
    catch err
        if err.message(98) == '%' % erste verwendete Zeile ist ein Kommentar
            row = row+1;
        elseif err.message(98) == ';' % Trennzeichen ist ein Semikolon
            delim = ';';
        else
            rethrow(err); % Error konnte nicht behoben werden.
        end
        errorExist = 1;
    end
end

M(:,[2,4,6]) = M(:,[2,4,6])*10;

try
    %dlmwrite(files{i}, M, 'delimiter', delim, '-append', 'coffset', col, 'roffset', row, 'precision', '%0.16f');
    dlmwrite('Test.csv', M, 'delimiter', delim, '-append', 'coffset', col, 'roffset', row, 'precision', '%0.16f');
catch err
    error('Fehler beim schreiben der Datei: %s', files{i});    
end

%end
 


Die lange try-catch ist dadurch entstanden das die Anzahl der Headerzeilen in den Dateien variiert und das Trennzeichen ein Komma oder Semikolon sein kann.

Also das einlesen und das Multiplizieren des Arrays funktioniert ja schon mal ganz gut.

Jetzt habe ich aber das Problem, dass die Matrix M die alten Werte in der csv Datei überschreiben soll.
Wenn ich bei dlmwrite -append angebe dann fügt er die Daten ganz am Ende an die alte Datei an.
Wenn ich -append nicht angebe dann wird der Header der alten Datei mit leeren Einträgen (zB: ,,,,,) überschrieben, die Daten sind dann aber an der richtigen Stelle.

Hat da jemand eine Idee wie ich den Header erhalten kann, bzw dlmwrite dazu bringe erst ab einer bestimmten Zeile die Werte neu zu schreiben?

godi
Private Nachricht senden Benutzer-Profile anzeigen


godi
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 25.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2014, 16:53     Titel:
  Antworten mit Zitat      
So mittlerweile habe ich eine Lösung gefunden die für mich funktioniert hat.

Code:

close all;
clear variables;
clc;

liste = dir('E:\Test\*.csv');
files = {liste.name};


i = 1;
for i = 1:length(files);
   
    row = 4;
    col = 0;
    delim = ',';
    errorExist = 1;
   
    while errorExist == 1
        try
            M = dlmread(files{i}, delim, row, col);
            errorExist = 0;
        catch err
            if err.message(98) == '%' % erste verwendete Zeile ist ein Kommentar
                row = row+1;
            elseif err.message(98) == ';' % Trennzeichen ist ein Semikolon
                delim = ';';
            else
                rethrow(err); % Error konnte nicht behoben werden.
            end
            errorExist = 1;
        end
    end
   
    M = M(:,1:row*2);
    M(:,[2,4,6]) = M(:,[2,4,6])*10;
   
    fid = fopen(files{i});
    for l = 1:row
        tline{l} = fgets(fid);
    end
    fclose(fid);
   
    fid = fopen(files{i}, 'w');
    fprintf(fid, '%s', tline{:});
    fclose(fid);
   
    try
        dlmwrite(files{i}, M, 'delimiter', delim, '-append', 'precision', '%0.16f', 'newline', 'pc');
    catch err
        error('Fehler beim schreiben der Datei: %s', files{i});
    end
end
 
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.