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

Datei einlesen, Header ignorieren

 

Martinuk
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2012, 16:32     Titel: Datei einlesen, Header ignorieren
  Antworten mit Zitat      
Hallo,

bin wieder mal auf der Suche nach einer Lösung. Ich möchte gerne ein m-File haben welches ermöglicht unterschiedliche Dateien (zB. *.txt, *.csv, *.xls, ...)
einzulesen. Das einzulesende File besitzt einen Header welcher sowohl 'Strings' als auch manchmal nur 'Integer' Werte beinhaltet.

zB. so

NA, FW_VERSION, FW_DATE
DATE, TIME,
" 8 Mar 2012 ","11:25:32",
CHAN,MEAS,FORMAT
1601,9.99E0,3700
CHAN_START_FREQ,CHAN_STOP_FREQ,
30000,250000000,
POINTS, POWER, IF_BW

Der Header sieht je nach Messgerät unterschiedlich aus, d.h. die Länge des Headers variiert und auch der Informationsgehalt.

Danach kommen die Daten die ich auswerten möchte. Die können auch variieren, d.h. die Anzahl der Spalten kann variieren.

Die Daten können also zB. so (quasi 2 Spalten)

30000,-53.479,
30169,-53.692,
30512, 5.8623E+1,
30684, 6.4671E+1,
30340,-53.655,
30512,-54.16,

oder eben so (quasi 4 Spalten)

30000,-53.479, 30000,-53.479,
30169,-53.692, 30169,-53.692,
30512, 5.8623E+1, 30512, 5.8623E+1,
30684, 6.4671E+1, 30684, 6.4671E+1,
30340,-53.655, 30340,-53.655,
30512,-54.16, 30512,-54.16,

aussehen.

Wir können aber mal annehmen das der Inhalt der gesamten Datei so aussieht.

NA, FW_VERSION, FW_DATE
DATE, TIME,
" 8 Mar 2012 ","11:25:32",
CHAN,MEAS,FORMAT
1601,9.99E0,3700
CHAN_START_FREQ,CHAN_STOP_FREQ,
30000,250000000,
POINTS, POWER, IF_BW
30000,-53.479,
30169,-53.692,
30512, 5.8623E+1,
30684, 6.4671E+1,
30340,-53.655,
30512,-54.16,

Nun möchte ich nur die Daten auslesen und den Header ignorieren. An dieser Stelle wäre ich an einer eleganten Lösung interessiert zumal aufgrund der Variation des Headers und der Daten eine allgemein gültige Lösung vonnöten ist. Es sollte alles automatisch ohne irgendeine Eingabe des Users (natürlich bis auf die Files).

Wäre über konstruktive Antworten sehr dankbar.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

ich würde es auf jeden Fall mit TEXTSCAN, evtl. in Kombination mit FGETL, versuchen; das ginge für txt/csv.

Ist die Anzahl der Header-Zeilen konstant?
Die Anzahl der Spalten kann analysiert werden, indem man sich mit FGETL eine Zeile holt und mit STRFIND die Anzahl der Spaltentrennzeichen (hier Komma) zählt.

Für .xls würde ich XLSREAD verwenden, also leider damit ein ziemlich anderer Ansatz. Ich würde mich möglichst (erst mal) auf Textformat oder Excel beschränken.

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

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2012, 17:33     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für die rasche Antwort.

Die Anzahl der Header Zeilen kann auch variieren. Für mich wäre vorrangig TXT-Datei und CSV-Datei.

Mein aktueller Ansatz ist die Datei Zeilenweise zu scannen und schauen ob die Zeile ein Alphabetisches-Zeichen enthält. Beginnend von der letzten Zeile der Datei. Damit kann ich ganz einfach bestimmen wie lange der Header der Datei ist.
Das funktioniert aber nur wenn die Daten diese Form haben
30000,-53.479,

Sobald eine Zeile so vorkommt
30512, 5.8623E+1,
habe ich mit E ein Alphabetisches-Zeichen drinnen und mein Ansatz funktioniert nicht mehr so einfach.

Wenn ich mal weiß wie lange der Header ist kann ich diesen problemlos löschen damit meine Daten dann in Matlab (Workspace, Originaldatei bleibt unangetastet) nurnoch in dieser Form zur Verfügung stehen

30000,-53.479,
30169,-53.692,
30512, 5.8623E+1,
30684, 6.4671E+1,
30340,-53.655,
30512,-54.16,

Nur wie kann ich diese dann elegant in 2 Spalten zerpflücken?
Private Nachricht senden Benutzer-Profile anzeigen
 
Martinuk
Themenstarter

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2012, 18:13     Titel:
  Antworten mit Zitat      
Bzgl.

30000,-53.479,
30169,-53.692,
30512, 5.8623E+1,
30684, 6.4671E+1,
30340,-53.655,
30512,-54.16,

Mit str2num(...) gehts sehr gut, nun habe ich noch das problem mit den Zeilen.
Wie kann ich zB. die Zeile
30512, 5.8623E+1,
auf 'E' und 'e' (Case-insensitiv) prüfen wo mir dann der Befehl 0 od. 1 zurückgibt.

Möchte nur wissen ob die Zeile ein großes oder kleines e enthält.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.06.2012, 18:18     Titel:
  Antworten mit Zitat      
Hallo,

ich würde von oben anfangen und mit FGETL durchgehen. Du kannst es auch so machen, dass du versuchst, die Daten im Double-Format zu lesen. Wenn das nicht klappt, eine Zeile überspringen. Etwa so (einfach mal so hingeschrieben) :
Code:

fid = fopen(fid);
zeile1 = fgetl(fid);
spalten = numel(strfind(zeile1, ',')) + 1; % Spaltentrennzeichen Komma
data = {};
while ~feof(fid)
data = [data; textscan(fid, repmat('%f', 1, spalten))];
fgetl(fid);
end


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

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2012, 19:47     Titel:
  Antworten mit Zitat      
Danke,

nur leider interpretiert der Befehl

Code:
textscan(fid, repmat('%f', 1, spalten))


zB. die Zeile
30512, 5.8623E+1,

nicht richtig. Das Ergebnis ist folgendes

[30000] [0x1 int32]

str2num(zeile1) liefert mir hingegen folgendes Ergebnis.
1.0e+04 *

3.0000 -0.0000

Momentan habe ich allerdings mehr das Problem Daten von Header zu unterscheiden.

Hast du vllt. dazu eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wenn du einen "echten" Header (d.h. mit Wörtern) hast, sollte str2num NaN zurückgeben. Das kannst du ja dann z.B. mit ISNAN abfragen.

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

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2012, 00:25     Titel:
  Antworten mit Zitat      
Hallo Harald,

das wäre natürlich eine einfache und elegante Lösung den Header zu finden. Allerdings funktioniert das nur wie du schon sagst nur bei einem Header der wirklich nur aus Wörtern besteht.
Ist bei mir nicht zwingend der Fall

NA, FW_VERSION, FW_DATE
HP8753ES,07.74,"Oct 30, 2002"
DATE, TIME,
" 8 Mar 2012 ","11:25:32",
CHAN,MEAS,FORMAT
3,S11,PHASE
CHAN_START_FREQ,CHAN_STOP_FREQ,
30000,250000000,
POINTS, POWER, IF_BW
1601,9.99E0,3700
FREQUENCY,UNITS,
Hz,deg,

-> 30000,250000000, fällt hier zB. aus der Reihe

Ich habs jetzt anders gelöst, funktioniert auch gut und ist in Rahmen meiner Tests auch allgemein anwendbar.

Danke für deine Hilfe. Nebenbei erwähnt, hast du zufällig eine Ahnung ob es einen Befehl gibt wie man die Elemente einer Listbox in einer GUI sortieren kann (mit Up/Down-Button). Möchte praktisch das markierte Element bei jedem Betätigung des Buttons das Element um eine Stelle nach oben bzw. nach unten verschieben.
Für den Fall das es keinen eigenen Befehl gibt, wie könnte man das Lösen? Die Listbox (letztlich eine Art Vektor) darf dabei die Größe nicht verändern.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.06.2012, 20:59     Titel:
  Antworten mit Zitat      
Hallo,

der Inhalt der Listbox ist ja ein Cell Array. Man muss dort "nur" die passenden Einträge vertauschen, z.B. i und i+1

Code:
newcontent = oldcontent([1:i-1 i+1 i i+2:end]);

und das dann als neuen Inhalt der Listbox nehmen.

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

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2012, 00:48     Titel:
  Antworten mit Zitat      
Hallo Harald,

Danke für die Antwort.

Sehr interessante und elegante Codezeile. Jetzt funktioniert alles perfekt.

Eine Frage ich aber noch am Rande. Gibt es eine Möglichkeit die Listenelemente anstatt extra Up/Down Button zu verschieben nur über die Maus zu verschieben?
Und wie kann man eine leere Listbox über die GUI füllen, sprich Einträge in die Listbox hinzufügen ohne externen Button. Möchte praktisch mit der Maus in eine Zeile der Listbox klicken und dort einen Eintrag machen bzw. ändern.

Danke.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

es gibt die Möglichkeit sicher, über WindowButtonMotionFcn und WindowButtonUpFcn. Das wäre jedoch ein beträchtlicher Aufwand.

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

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.06.2012, 01:46     Titel:
  Antworten mit Zitat      
Das ist dann zu viel Aufwand.

Nochmals danke für die Hilfe.

Schöne Grüße
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.