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

schlecht formatiertes .txt einlesen, Header entfernen

 

lonelydriver
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 09.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2014, 12:31     Titel: schlecht formatiertes .txt einlesen, Header entfernen
  Antworten mit Zitat      
Hallo,

im Rahmen meiner Abschlussarbeit muss ich Messdaten auswerten, die in folgender Form vorliegen
19075, 586, 2, -707
19075, 586,
586, 2, -707
19074, 586, 2, -707
19073, 586, 2, -707
19075, 586, 2, -707
19002, 584, 2, -70
2, -700
19004, 584, 2, -700
19003, 584, 2, -700
19004, 584, 2, -700

18984, 583, 2, -698
19001, 584, 2, -700
19000,
96
18946, 582, 2, -694
18955, 583,
, 583, 2, -697
18974, 583, 2, -697
18976, 583, 2, -697
18977, 583, 2, -697
18978, 583, 2, -697
18980, 583, 2, -698
18979, 583, 2, -697
# ----------------------------------
#h 300, 200, 100, 0
#f 9000, 10000, 11000, 18979
# ----------------------------------
# count f[kHz] h[mm]
18972, 583, 2, +1
18971, 583, 2, +1
18969, 583, 2, +1
18969, 583, 2, +1
18973, 583, 2, +1
18968, 5
18901, 581, 2, +1
18903, 581, 2, +1
18903, 581, 2, +1
18906, 581, 2, +1
18905, 581, 2, +1
18904, 581, 2, +1
18910, 581, 2, +1
18903, 581, 2, +1
18906, 581, 2, +1
18906, 581, 2, +1
18781, 577, 1, +102
18783, 577,
2, 582, 2, +62
18935, 582, 2, +58
18938, 582, 2, +54
18943, 582, 2, +47


Das Problem besteht darin, dass die Daten in einem .txt vorliegen und für die Auswertung nur die 4. Spalte von Relevanz ist.
Bisher habe ich den folgenden Code
Code:
% and write only valid data (4 cols per line) into output table.
%
% call in command window (or other script files):
% t = getDatamess(file);
% e.g.: logfile=getDatamess('Log20140106T161329.txt')
% e.g.: logfile=getDatamess('Log20140114T193148.txt')
function table=getDatamess(file)
    % open log file of interest
    f=fopen(file);
    % init output table
    table = [];
    % loop until break
    while 1
        % read line
        l = fgetl(f);
        % check if line contains char (not EOF)
        if ~ischar(l)
            % if no char -> EOF; break while loop
            break;
        end
        % split line at comma
        s = regexp(l, ',', 'split');
        % if 4 entries
        if length(s) == 4
            % loop each value
            for i = 1:4
                % convert string to double (value)
                % dval is vector with 4 entries
                dval(1,i) = str2double(s(i));
            end
            % add dval to end of table
            table = [table; dval];
        end
    end
    % close file
    fclose(f);
end


der Code schreibt auf jeden Fall keine Zeilen mit, in denen in Spalte 4 keine Werte stehen,

aber leider wird z.B aus dem Header die Werte mitgeschrieben und dann z.B 18979 als h[mm] für die Spalte 4 interpretiert.
#h 300, 200, 100, 0
#f 9000, 10000, 11000, 18979

Es sollen praktisch alle mit # beginnenden Zeilen nicht ins Array übernommen werden. Der mit # eiengeleitete Header wird immer mal wieder in unregelmäßigem Abstand in das Protokoll gestreut.
Unter http://www.gomatlab.de/txt-datei-mi.....aben-einlesen-t20430.html oder unter http://www.gomatlab.de/datei-einles.....er-ignorieren-t24044.html findet man dazu was.
Ich wüsste aber nicht, wie ich den jetzigen Code entsprechend abändern kann.

Das letzte Problem ist, dass manchmal die Werte verrutschen.
18781, 577, 1, +102
18783, 577,
2, 582, 2, +62
18935, 582, 2, +58

und es andererseits manchmal keine Werte in Spalte 4 gibt.
18973, 583, 2, +1
18968, 5
18901, 581, 2, +1
18903, 581, 2, +1
18903, 581, 2, +1


Ich hätte halt gerne eine vollständig automatisierte Lösung, da eine Messaufzeichnung ca 7000 Zeilen besitzt.

Vielen Dank für Hilfe.
Ihr seid die Besten!
_________________

Wer nicht wagt, der nicht gewinnt!
Private Nachricht senden Benutzer-Profile anzeigen


Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 16.01.2014, 14:59     Titel:
  Antworten mit Zitat      
Ich würde vermutlich strfind anwenden.

Wenn in der Zeile ein # vorkommt, einfach mit nächster Zeile weitermachen.

Code:


Enthält die letzte Spalte - sofern sie vorkommt - immer ein Vorzeichen? Wenn ja, dass kannst du auch dannach suchen (also entweder + oder -) um auch bei zeilen, wo einer der anderen 4 werte fehlt den 4. Wert zu identifizieren.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2014, 15:21     Titel:
  Antworten mit Zitat      
Code:
xx = regexp(s,'[^\s#hf]\d+, \d+, \d+, ([+-]\d+)','tokens')
Private Nachricht senden Benutzer-Profile anzeigen
 
lonelydriver
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 09.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2014, 16:15     Titel:
  Antworten mit Zitat      
ja, sogar die Null besitzt ein Vorzeichen.

Ich weis aber nicht, wie ich die COdes entsprechend in das vorhandene
Skript integriere, da dieses ja alle 4 Spalten nach MATLAB überträgt, und ich mir dann von diesem in einem weiteren Skript nur den Vektor aus Spalte 4 rauspicke mittels h = logfile(:,4);

es wäre super nett, wenn ich das noch hinkriege, da dieses blöde .txt nicht mein Verbrechen ist, aber ich nur das habe.

Vielen vielen Dank.
_________________

Wer nicht wagt, der nicht gewinnt!
Private Nachricht senden Benutzer-Profile anzeigen
 
jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2014, 16:37     Titel:
  Antworten mit Zitat      
das regexp macht doch eh genau das was du willst, oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
lonelydriver
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 09.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2014, 21:51     Titel:
  Antworten mit Zitat      
ja laut der MATLAB Hilfe schon,

aber wie muss ich den Code abändern, dass er aus dem 4 spaltigen .txt file
genau die 4.Spalte mit den genannten Anforderungen rausließt und in eine neue Variable in den Workspace schreibt.
Vielleicht könnt ihr (du) das mal mit dem Datensatz aus dem Eingangspost ausprobieren. Ich bin MATLAB Greenhorn und hatte im Studium nix dazu und muss aber nun einen Datensatz auswerten und will das sauber und elegant ohne manuelles Bereinigen machen können, damit spätere Messungen dann reproduzierbar sind.

Schwierig sehe ich noch, wie MATLAB aus -702, wo -70 in der oberen und der Rest 2 in die darunterliegende Zeile verutscht ist, als -702 der 4.Spalte interpretiert.

Ich komm schon voll in den Stress wegen des Abgabetermins. Daher nocheinmal die Bitte an Euch! Very Happy Very Happy
_________________

Wer nicht wagt, der nicht gewinnt!
Private Nachricht senden Benutzer-Profile anzeigen
 
Headbucket
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 03.12.13
Wohnort: Dresden
Version: R2007B
     Beitrag Verfasst am: 17.01.2014, 08:56     Titel:
  Antworten mit Zitat      
Um die vierte Spalte einzulesen kannst du z.B. mit fgetl Zeile für Zeile durchgehen und jeweils den vierten Wert auslesen. Ein ähnlichen Thread findest du z.B. hier.

Code:
fid = fopen('Textfile.txt');
i = 1;

tline = fgetl(fid);
while ischar(tline)
    k = strfind(tline, '-'); % Existiert ein "-"-Zeichen?
    if k ~= 0
        Result(i) = str2num(tline(k:end));
        i = i + 1;
    end
    k = strfind(tline, '+'); % Existiert ein "+"-Zeichen?
    if k ~= 0
        Result(i) = str2num(tline(k:end));
        i = i + 1;
    end
    tline = fgetl(fid); % Zeilenindex erhöhen
end


Das kopiert dir z.B. alle Werte mit einem - oder + davor in einen Vektor.
Das ganze geht sicher noch deutlich eleganter. Aber ich denke mal, dass dieses Vorgehen sehr anschaulich und einfach verständlich ist.

Natürlich werden jetzt aber noch keine Zeilensprünge erkannt. Dazu müsstest du z.B. den aktuellen Wert mit dem vorherigen vergleichen und schauen, ob eine große Abweichung besteht (wie z.B. zwischen 700 und 70). Wenn ja: Zeilensprung.
Das ist aber wirklich etwas tricky. So kann man ja z.B. nicht immer von einem Zeilensprung ausgehen, wenn du Zeile nur 2 oder 1 Wert enthält, richtig? Sicher alles machbar aber da musst du noch ein wenig programmieren.

Generall empfehle ich dir, dir die MATLAB-Grundlagen anzuschauen. Du hast sicher schon gemerkt, dass dir hier ungern jemand das Schreiben deiner Abschlussarbeit abnehmen will. Ich habe in meiner Diplomarbeit auch viel MATLAB benutzt und musste mir ebenso alles aneignen. Es bringt nicht, wenn du in deiner Arbeit MATLAB-Code stehen hast, den du selbst nicht verstehst. Nicht böse gemeint sondern eher ein guter Rat Smile. Wenn die Zeit drängt ist das natürlich ungünstig... .

Grüße
Headbucket
Private Nachricht senden Benutzer-Profile anzeigen
 
jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.01.2014, 09:09     Titel:
  Antworten mit Zitat      
lonelydriver hat Folgendes geschrieben:
ja laut der MATLAB Hilfe schon,

aber wie muss ich den Code abändern, dass er aus dem 4 spaltigen .txt file
genau die 4.Spalte mit den genannten Anforderungen rausließt und in eine neue Variable in den Workspace schreibt.

Mit dem sollten die Werte der 4. Spalte als Cells im Workspace liegen:
Code:
regexp(s,'[^\s#hf]\d+, \d+, \d+, ([+-]\d+)','tokens')



lonelydriver hat Folgendes geschrieben:

Schwierig sehe ich noch, wie MATLAB aus -702, wo -70 in der oberen und der Rest 2 in die darunterliegende Zeile verutscht ist, als -702 der 4.Spalte interpretiert.

kommt drauf an wie du diese regel umsetzen würdest. und ob es sinn macht.
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.