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

textscan bei fehlenden Werten und

 

andreas1425
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 21.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2016, 11:32     Titel: textscan bei fehlenden Werten und
  Antworten mit Zitat      
Hallo,

ich muss große Mengen an Messwerten einlesen und diese später grafisch ausgeben.
Die Messwerte liegen in .asc-Files mit über 100mb vor, nach dem Schema

Datum Uhrzeit Wert1 ... Wert50

durch Leerzeichen getrennt.

Ich Importiere folgendermaßen:

Code:
fileID=fopen(messungen);
fileStr=fscanf(fileID,'%c');
data=strsplit(fileStr);

So bekomme ich dann ein Cell Array welches zB die Ausmaße 1x36000000
Anschließend durchlaufe ich alle Cells und frage mittels regexp ab, ob es sich um ein Datum handelt und und schreibe die folgenden Messwerte dann alle in eine Zeile, bis das nächste Datum kommt, so dass ich für jeden timestamp eben eine extra Zeile habe.

Es kommt aber auch vor, dass ein Wert fehlt und somit das entsprechende Feld leer ist. Wie kann ich Matlab sagen, dass ich da dann beim Importieren eine leere Cell haben möchte?
Außerdem dauert meine Methode, vor allem das Datum-Suchen ziemlich lange, gibt es da einfachere/schnellere Möglichkeiten?

Vielen Dank im Voraus
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: 21.06.2016, 17:51     Titel: Re: textscan bei fehlenden Werten und
  Antworten mit Zitat      
Hallo andreas1425,

Das Einlesen als Characters mit %c ist nicht naheliegend. Schaue Dir mal die Dokumentation von textscan an.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 21.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.06.2016, 12:58     Titel:
  Antworten mit Zitat      
Wenn ich das richtig verstehe, müsste ich aber genau angeben wie viel Spalten und welche Datentypen kommen.
Bei mir kann es aber vorkommen, da die Messungen unterschiedlich lang sind, dass wieder einige Zeilen mit Text kommen und dann erst wieder Messwerte. Ich weiß also vorher nicht wie die Daten ausschauen bzw habe immer etwas andere und möchte sie mit einem universellen Programm einlesen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.06.2016, 13:21     Titel:
  Antworten mit Zitat      
Hallo,

ein oder zwei Beispieldateien und dein bisheriger Code (d.h. inkl. der Erkennung von Datumsangaben etc.) könnten hilfreich sein.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
andreas1425
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 21.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.06.2016, 14:30     Titel:
  Antworten mit Zitat      
Angehängt ein Teil des Messwertfile, das Original hat 237mb und enthält die Daten für ein paar Tage und hat außerdem die Endung .asc

Einlesen der Werte:
Code:
function [ data ] = datimport(messungen)
%IMOPORT Funktion liest .asc Dateien als String ein und zerlegt diesen
% dann in ein cell-Arrayy

fileID=fopen(messungen);
formatSpec='%c';
data=textscan(fileID,formatSpec);
data=strsplit(data);

end


Das Skript zum Datum finden funktioniert im Moment noch nicht ganz, funktioniert aber nach folgendem Prinzip:

Code:
cmp='(\d+)(\W+)(\d+)(\W+)(\d+)';
l=length(data);
j=1;
k=1;

for i=1:l
    a(i)=regexp(data(i),cmp,'match');
    if isempty(a{i})==0
        j=j+1; %nächste Zeile
        k=1; % erste Spalte
    end
        measure(j,k)=data(i);
        k=k+1;
end


Messungen.txt
 Beschreibung:

Download
 Dateiname:  Messungen.txt
 Dateigröße:  100.4 KB
 Heruntergeladen:  375 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.06.2016, 22:11     Titel:
  Antworten mit Zitat      
Hallo,

ich würde zunächst mal in der Datei alle Kommas durch Punkte ersetzen.

Dann würde ich mit fgetl und textscan (Trennzeichen \t) arbeiten. Ab R2014b gibt es datetimes, und dann sollte man Datumsangaben auch als solche einlesen.
Natürlich musst du wissen, nach was du suchst. Interessieren dich beispielsweise immer die Blöcke nach "Datum"?

Das Import-Tool (Rechts-Klick --> Import data) kann auch helfen, die Dateistruktur zu erkennen und mal einen Beispielbefehl zu erzeugen, den man anpassen kann.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
andreas1425
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 21.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2016, 12:22     Titel:
  Antworten mit Zitat      
Super, vielen Dank Very Happy

Mit textscan und dem generierten Importskript konnte ich jetzt schon mal einiges machen.

Jetzt würde mich nur noch interessieren, ob es eine Möglichkeit gibt, mit textscan nur jede n-te Zeile einzulesen, um bei Bedarf den Datenumfang zureduzieren.
In der doku hab ich nix dazu gefunden
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.06.2016, 14:07     Titel:
  Antworten mit Zitat      
Hallo,

es gibt das Beispiel "Skip the Remainder of a Line".

Mit %*[^\n] gehst du ans Ende der Zeile. Mit
Code:
repmat('%*[^\n] ', 1, 5)

sollte es möglich sein, nur jede k-te Zeile zu bekommen.

Grüße,
Harald
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.