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

Txt-Datei einlesen (andere Art)

 

Ska78

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.01.2008, 14:13     Titel: Txt-Datei einlesen (andere Art)
  Antworten mit Zitat      
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:

12:43:09.00;0E3;8;00;80;00;00;5A;7F;06;1B;0
12:43:09.00;165;8;00;00;00;00;14;24;26;85;0
12:43:09.00;0D8;8;0B;80;00;FF;56;80;07;DE;0
12:43:09.00;0E3;8;00;80;00;00;6E;7F;07;28;0
12:43:09.00;165;8;00;00;00;00;16;00;27;C3;0

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:

Code:

[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11] = textread('RuheDataHeizung.txt', '%s %s %s %s %s %s %s %s %s %s %s', 'delimiter', ';');
data(:,1) = a1;
data(:,2) = a2;
data(:,3) = a3;
data(:,4) = a4;
data(:,5) = a5;
data(:,6) = a6;
data(:,7) = a7;
data(:,8) = a8;
data(:,9) = a9;
data(:,10) = a10;
data(:,11) = a11;
 


Aber das klappt jetzt auch nicht mehr. Es könnte daran liegen, dass der Datensatz über 100.000 Werte besitzt.

Über jede Hilfe bin ich dankbar !!!
Vielen Dank im Voraus.
Viele Grüße
Dee

P.S.: Mit Import-Data (rechtsclick auf Datei) gehts auch nicht, da das Semikolon nicht erkannt wird und so nur 1 Zeile mit Müll importiert wird.


Nyquist
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 19.11.07
Wohnort: Laupheim
Version: ---
     Beitrag Verfasst am: 31.01.2008, 14:56     Titel:
  Antworten mit Zitat      
Hallo Ska 78,

du kannst es mal mit

fid = fopen(...) probieren

in fid steht dann der Inhalt des Textfiles.

1Zeile = fid(1)
2Zeile = fid(2)
...

vielleicht hilft dir das weiter
_________________

Mit freundlcihem Gruß
Nyquist
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 31.01.2008, 15:11     Titel:
  Antworten mit Zitat      
Hallo Ska78,

"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


Der Aufruf wäre dann
Code:
importfile('RuheDataHeizung.txt');


Klappt bei mir auch, wenn RuheDataHeizung.txt 10.000 Zeilen, also 110.000 Werte enthält.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Ska78

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.01.2008, 16:29     Titel:
  Antworten mit Zitat      
Hallo Nyquist, hallo Bijick !!!
Vielen Dank für Eure Antworten Smile

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 Wink
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
 
Michaela
Forum-Century

Forum-Century


Beiträge: 239
Anmeldedatum: 12.07.07
Wohnort: ---
Version: bis 2007b
     Beitrag Verfasst am: 31.01.2008, 21:01     Titel:
  Antworten mit Zitat      
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.....
Private Nachricht senden Benutzer-Profile anzeigen
 
Michaela
Forum-Century

Forum-Century


Beiträge: 239
Anmeldedatum: 12.07.07
Wohnort: ---
Version: bis 2007b
     Beitrag Verfasst am: 01.02.2008, 04:52     Titel:
  Antworten mit Zitat      
Ska78 hat Folgendes geschrieben:


Bei fopen(...) ist bei mit fid leider nur 3.


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.....
Private Nachricht senden Benutzer-Profile anzeigen
 
ska78
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 01.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2008, 12:15     Titel:
  Antworten mit Zitat      
Hallo Michaela,
Zeile1 = fid(1) liefert auch 3.
Gruß
Dee
Private Nachricht senden Benutzer-Profile anzeigen
 
Nyquist
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 19.11.07
Wohnort: Laupheim
Version: ---
     Beitrag Verfasst am: 01.02.2008, 12:35     Titel:
  Antworten mit Zitat      
Hallo Ska78

probier mal
Code:

fid=fopen(.....txt)
Zeile1 = fgets(fid);
Zeile2 = fgets(fid);
.
.
.
.
.
 

wird jede Zeile in einem eigenen Vektor abgelegt den kannst du dann ganz gemütlich in eine Matrix wandeln Very Happy
_________________

Mit freundlcihem Gruß
Nyquist
Private Nachricht senden Benutzer-Profile anzeigen
 
ska78
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 01.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2008, 12:42     Titel:
  Antworten mit Zitat      
Hi Nyquist,
Das klappt. Zeile für Zeile Smile
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Nyquist
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 19.11.07
Wohnort: Laupheim
Version: ---
     Beitrag Verfasst am: 01.02.2008, 14:55     Titel:
  Antworten mit Zitat      
sers,

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
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.