Hallo zusammen,
ich weiß, dass dieses Thema schon öfters behandelt wurde, aber ich versuche gerade eine TXT-Datei (Trennzeichen Semikolon) einzulesen, in der folgende Daten stehen:
Es handelt sich dabei um HEX-Werte, die in der Datei stehen.
Gespeichert werden sollten die Daten in einem Array von 11 Spalten, in denen dann genau diese HEX-Werte stehen.
Vom Prinzip her nicht schwer, dachte ich:
- mit load geht es nicht, da wird nur Schrott in eine Spalte geschrieben
- Geschafft hatte ich es mal mit:
"Import Data" funktioniert bei mir, die Daten stehen in der Variable textdata. Hier der von Matlab generierte Code:
Code:
function importfile(fileToRead1)
%IMPORTFILE(FILETOREAD1) % Imports data from the specified file % FILETOREAD1: file to read
% Auto-generated by MATLAB on 31-Jan-2008 14:57:29
% Import the file
newData1 = importdata(fileToRead1);
% Create new variables in the base workspace from those fields.
vars = fieldnames(newData1);
for i = 1:length(vars) assignin('base', vars{i}, newData1.(vars{i}));
end
Klappt bei mir auch, wenn RuheDataHeizung.txt 10.000 Zeilen, also 110.000 Werte enthält.
Herzliche Grüße
Bijick
_________________
>> why
Ska78
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 31.01.2008, 16:29
Titel:
Hallo Nyquist, hallo Bijick !!!
Vielen Dank für Eure Antworten
Bei fopen(...) ist bei mit fid leider nur 3.
Allerdings fünktioniert "Import Data" von Bijick ganz gut. Ich bekomme dann die Daten als Cell angezeigt.
Der Rechner braucht nur eine Weile, um die Datei zu öffen. Darstellen kann er sie schon nicht mehr.
Ich habe gerade herausgefunden, dass es sich um fast 340.000 Zeilen a 11 Spalten handelt
Nach ca. 15min rödeln hat der Rechner endlich die Daten ausgeworfen.
Vielen Dank für EURE Hilfe. Das hat mich sehr weiter gebracht.
Nochmals Danke.
Viele Grüße
Dee
Hallo Dee,
die DAtei ist im speicher aus so riesig, da sie als string abgelegt ist. Eventuell tust Du dich leichter, wenn Du das ganze bereits beim einlesen mit fopfen und fgetl zeilenweise einsortierst.
Ich würde da folgendermassen vorgehen: Je Zeile erst mal nach den Semikolons suchen (strfind ) und dann in die einzelnen Spalten von Hand zerhacken. Die Uhrzeit konvertieren (zB in epoch, da hilft auch datestr, datenum oder datevec) und dann die einzelnen Hex Zahlen gleich in normale Zahlen (sollte mit sscanf und format %x funktioneren)
Dann hast das ganze gleich als Zahl . Das ist m.E. schneller als erst alles einzulesen und dann alles zu konvertieren. Wenn Du genauer sagst, was Du brauchst, kann ich Dir gerne noch mehr Tipps geben. Da ich kein matlab hier habe, tue ich mich schwer, die routine gleich on the fly zu entwerfen.
Gruß,
Michaela
PS und ja,daten einlesen ist langsam... geht mir auch so. Am besten gleich nach dem einlesen erstmal als mat speichern und dann von dort aus weiterarbeiten...
PPS Und der alte Tipp: Falls Du sowas öfters machst und es auf Rechenzeit ankommt, dann schaue dir mal perl und co an, ob Du damit die Daten vorformatierst. Ich habe immer das Gefühl, dass Matlab nicht zum Dateneinlesen optimiert ist.
_________________
---------------------------------------------------------------
Leider habe ich daheim zwar Internet aber kein Matlab - daher sind alle Syntaxbeispiele circa Angaben.....
Da soll auch nur eine Zahl in fid drin stehen, nämlich die interne Nummer die Matlab dem file zuweist.
Was liefert denn dann
zeile1 = fid(1) ?
_________________
---------------------------------------------------------------
Leider habe ich daheim zwar Internet aber kein Matlab - daher sind alle Syntaxbeispiele circa Angaben.....
Hi Nyquist,
Das klappt. Zeile für Zeile
Allerdings müsste ich dass dann 300.000 x in ein Array kopieren, oder?
Eigentlich klappt es ja mit Bijick's Funktion.
Ist das normal, dass Matlab ein Datenarray mit mehr als 100.000 Zeilen nicht mehr anzeigt? Oder kann man das irgendwo einstellen.
Nochmals Danke.
Viele Grüße
Dee
ja wenns mit dem Code funktioniert ist es ja in Ordnung.
Zu deiner Frage. Ja du müsstest dann 300000Zeilen rauslesen und 300000 mal in ein Array kopieren. Das lässt sich bestimmt über eine for schleifenerledigen ist aber nicht so elegant und dauert denk ich auch zu lange.
Ist auf jeden Fall bei kleineren Files eine einfache Lösung
Ich hatte selber noch nie so eine große Datenmenge auf einmal. Kann Dir also leider nicht sagen ob man das einstellen muss
_________________
Mit freundlcihem Gruß
Nyquist
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
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.