|
|
Datei einlesen, Header ignorieren |
|
Martinuk |

Forum-Century
|
 |
Beiträge: 208
|
 |
|
 |
Anmeldedatum: 18.04.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 09.06.2012, 16:32
Titel: Datei einlesen, Header ignorieren
|
 |
|
 |
|
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.
|
|
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 09.06.2012, 17:07
Titel:
|
 |
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
|
|
|
Martinuk |
Themenstarter

Forum-Century
|
 |
Beiträge: 208
|
 |
|
 |
Anmeldedatum: 18.04.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 09.06.2012, 17:33
Titel:
|
 |
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?
|
|
|
Martinuk |
Themenstarter

Forum-Century
|
 |
Beiträge: 208
|
 |
|
 |
Anmeldedatum: 18.04.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 09.06.2012, 18:13
Titel:
|
 |
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.
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 09.06.2012, 18:18
Titel:
|
 |
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) :
Grüße,
Harald
|
|
|
Martinuk |
Themenstarter

Forum-Century
|
 |
Beiträge: 208
|
 |
|
 |
Anmeldedatum: 18.04.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 09.06.2012, 19:47
Titel:
|
 |
Danke,
nur leider interpretiert der Befehl
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?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 09.06.2012, 22:58
Titel:
|
 |
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
|
|
|
Martinuk |
Themenstarter

Forum-Century
|
 |
Beiträge: 208
|
 |
|
 |
Anmeldedatum: 18.04.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 10.06.2012, 00:25
Titel:
|
 |
|
 |
|
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.
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 10.06.2012, 20:59
Titel:
|
 |
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
und das dann als neuen Inhalt der Listbox nehmen.
Grüße,
Harald
|
|
|
Martinuk |
Themenstarter

Forum-Century
|
 |
Beiträge: 208
|
 |
|
 |
Anmeldedatum: 18.04.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 11.06.2012, 00:48
Titel:
|
 |
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.
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 11.06.2012, 21:30
Titel:
|
 |
Hallo,
es gibt die Möglichkeit sicher, über WindowButtonMotionFcn und WindowButtonUpFcn. Das wäre jedoch ein beträchtlicher Aufwand.
Grüße,
Harald
|
|
|
Martinuk |
Themenstarter

Forum-Century
|
 |
Beiträge: 208
|
 |
|
 |
Anmeldedatum: 18.04.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 12.06.2012, 01:46
Titel:
|
 |
Das ist dann zu viel Aufwand.
Nochmals danke für die Hilfe.
Schöne Grüße
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|