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

Datenfile mit verschiedenen Delimitern einlesen

 

Spacecowboy
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 18.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2017, 13:27     Titel: Datenfile mit verschiedenen Delimitern einlesen
  Antworten mit Zitat      
Hallo,
ich möchte gerne bestimmte Teile eines Textfiles mit Messdaten einlesen. Der Aufbau des Files macht mir aber Probleme. Der obere Teil des Files beinhaltet Parameter mit einem entsprechenden Wert (falls vorhanden). Parameter und Wert sind durch ein Leerzeichen getrennt. Der untere Teil beinhaltet Messdaten (über 100 Kanäle), welche durch Tabulatoren getrennt sind.

Folgendermaßen sieht das aus:

Code:

FORMAT TAB_DELIMITED
NUM_HEADER_BLOCKS 162
NUM_PARAMS 646
PT_COUNT.CND_1 3895
FRAMES.CND_1 16
FILE_TYPE TIME_HISTORY
OPERATION RSP_TO_TAB
DATA_TYPE ASCII_FLOATING_POINT
DATE Fri Jun 23 11:20:24 2017
DELTA_T 9.765625e-02
TOTAL_T 3.803711e+02
PTS_PER_FRAME 256
PTS_PER_GROUP 256
CHANNELS 120
.
.
.
RfLongPositionFbk   RfLatPositionFbk     ......
mm       mm
-12.6182   -4.071238
-12.6192   -4.070237
-12.6182   -4.069237
 



Folgendes möchte ich gerne machen:

1. Ich möchte gerne das File öffnen und die Zeile suchen, in der Parameter NUM_PARAMS steht.
2. Dann möchte ich gerne den Wert dahinter einlesen. Der Wert sagt mir wieviele Parameter (Zeilen) im Header vorhanden sind und ab wann die Daten kommen.
3. Ich möchte alle Datenkanäle (diese sind mit Tabulatoren getrennt) einlesen und weiterverarbeiten.

Ich habe in einem ersten Versuch mal die Datei mit fopen geöffnet und den Inhalt eingelesen:

Code:

s = textscan(fid, '%s', 'delimiter', '\n');
 


Ich erhalte eine Cell welche den Inhalt des Textfiles zeilenweise enthält.

Ich habe dann versucht den Zeilenindex zu suchen, wo der Parameter NUM_PARAMS vorkommt:

Code:

idx_NUM_PARAMS = find(strcmp(s{1}, 'NUM_PARAMS '), 1, 'first')+1;
 


Das funktioniert aber nicht, ich möchte gerne den Index der Zeile finden, welche mit NUM_PARAMS beginnt.

Danke schonmal für eure Tipps.
Private Nachricht senden Benutzer-Profile anzeigen


Spacecowboy
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 18.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2017, 16:23     Titel:
  Antworten mit Zitat      
Ich bin ein wenig weiter gekommen:

Code:

s = textscan(fid, '%s%s', 'delimiter', ' ');    
idx_NUM_PARAMS = find(strcmp(s{1}, 'NUM_PARAMS'), 1, 'first');
NUM_PARAMSdbl = str2double(s{1,2}{idx_NUM_PARAMS,1});
 


Ich weiß jetzt wie lange mein Header ist und ab welchem Index die Daten kommen.

Wie kann ich jetzt das Datenfeld einlesen, damit die Daten schön spaltenweise organisiert sind.
Oben möchte ich die Nummerrierung, Namen und Einheiten der Kanäle stehen haben.
Private Nachricht senden Benutzer-Profile anzeigen
 
SigiSorglos
Forum-Century

Forum-Century


Beiträge: 147
Anmeldedatum: 24.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2017, 16:49     Titel:
  Antworten mit Zitat      
Evtl. hilft dir der Befehl:
Code:


Mit dem Parameter "HeaderLines" kannst du auch bestimmen ab welcher Zeile die Tabelle beginnt.

Falls du dabei Hilife brauchst, melde dich nochmal.
Private Nachricht senden Benutzer-Profile anzeigen
 
Spacecowboy
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 18.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2017, 17:27     Titel:
  Antworten mit Zitat      
Ja das funktioniert, allerdings bekomme ich eine Warning, da ich nicht nur nummerische Daten einlese (ich lese noch die Kanalnamen in die erste Zeile und die Einheiten in die zweite Zeile ein).

Warning: Variable names were modified to make them valid MATLAB identifiers.
> In makeValidName at 25
In @table\private\setVarNames at 48
In table.readTextFile at 278
In table.readFromFile at 33
In readtable at 118
In Load_mat_File at 30


Sollte man das vermeiden?
Bzw gibt es einen Datentyp/Struktur die besser geeignet wäre 2 Zeilen Beschreibung (Kanalnamen und Einheiten) und Daten aufzunehmen?

Ich hatte mir das so gedacht, dass ich mir den zu verabeitenden Datenkanal über den Namen suche und somit die entsprechende Spalte finde.

Denkbar wäre auch für die Kanalnamen/Einheiten ein String-array zu machen. Darin könnte ich auch suchen und den entsprechenden Index herausfinden. Mit diesem Index gehe ich dann in die dataTable.
Private Nachricht senden Benutzer-Profile anzeigen
 
SigiSorglos
Forum-Century

Forum-Century


Beiträge: 147
Anmeldedatum: 24.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2017, 08:51     Titel:
  Antworten mit Zitat      
Also mit 'ReadVariableNames' auf "true" setzen, sollte eine Zeile mit Spaltenbezeichnungen kein Problem sein. Schau doch mal in der Matlab Hilfe nach:

Code:
detectImportOptions


Dort gibt es eine Einstellung "VariableUnitsLine". Könnte sein, dass du damit einstellen kannst an welcher Stelle die Einheit der Spalte kommt. Ich habe das selbst noch nicht verwendet, aber ich kann mir nicht vorstellen, dass es in Matlab nicht möglich ist mit dem readtable() Befehl auch Tabellen einzulesen, die neben den Variablenbezeichnungen auch Einheiten enthalten.
Private Nachricht senden Benutzer-Profile anzeigen
 
Spacecowboy
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 18.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2017, 13:22     Titel:
  Antworten mit Zitat      
Mit 'ReadVariableNames' auf "true" wird leider die Zeile oberhalb der Daten welche nur die Einheiten enthält als Variablennamen importiert. Ich kann ihm leider nicht sagen dass sich die eigentliche Zeile noch eine Zeile obendrüber befindet.

Gibt es eine Möglichkeit einfach die Einheitenzeile aus dem zu importierenden File zu löschen? Dann wäre ich mit readtable am Ziel.

Oder sollte ich die Variablennamen in eine zweite Tabelle/Array schreiben und kann ich diese Tabelle nutzen um in der Datentabelle die Spalten zu benennen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Spacecowboy
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 18.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2017, 14:26     Titel:
  Antworten mit Zitat      
detectImportOptions kann ich nicht nutzen da es erst ab v2016 verfügbat ist. Habe matlab 2014a.
Private Nachricht senden Benutzer-Profile anzeigen
 
Spacecowboy
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 18.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2017, 11:59     Titel:
  Antworten mit Zitat      
Das Thema ist nun hier zu finden:

https://de.mathworks.com/matlabcent.....der-data-and-numeric-data
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.