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/.dat Datei komplett in Matlab als Matrix einlesen

 

Luftus

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2017, 09:57     Titel: .txt/.dat Datei komplett in Matlab als Matrix einlesen
  Antworten mit Zitat      
Hallo zusammen,

ich scheitere seit Tagen an dem Versuch einen .dat bzw. .txt Datei in Matlab einzulesen. Das Problem an der Datei ist, dass sie aus Text und Zahlen besteht und relativ unregelmäßig aufgebaut ist. Ich habe schon textscan oder auch fget ausprobiert, aber da sich das Format immer wieder ändert und das in der Originaldatei in 1000 Zeilen wäre es sehr mühsam immer wieder Matlab das Format vorgeben zu müssen.

Gibt es einen "einfachen" Befehl, der mir die Daten der Datei in einzelne Zellen einer Matrix speichert analog zu Excel?

Besten Dank für Eure Hilfe!!!

Gruß Luftus

P.S.: Die Version die ich an der Uni zur Verfügung habe ist die R2012...

Test.txt
 Beschreibung:

Download
 Dateiname:  Test.txt
 Dateigröße:  2.56 KB
 Heruntergeladen:  651 mal


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.04.2017, 10:08     Titel:
  Antworten mit Zitat      
Hallo,

wenn es diesen Befehl gäbe, was würdest du mit den dann unstrukturierten Cell Arrays anfangen?

Ich würde es anders angehen: welche Daten brauchst du aus dieser Datei?
Dann eine Schleife folgender Art:
while ~feof(fid)
textscan(...) % Daten einlesen
fgetl % nicht benötigte Daten überspringen

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2017, 10:12     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für die schnelle Antwort. Das Problem ist, dass ich alle Inhalte der Datei benötige. Ich habe insgesamt vierzig solcher Files und möchte die alle als Schleife dann am Schluss in Matlab einlesen und dann im Folgenden ein Programm schreiben, welches mir verschiedene Diagramme plottet. Da ich alles automatisiert haben möchte, brauche ich auch die einzelnen Spalten- und Zeilenüberschriften...

Gruß Luftus
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Das Problem ist, dass ich alle Inhalte der Datei benötige.

Das wäre das erste Mal, dass ich das bei einer so unregelmäßig aufgebauten Datei erlebe.

Im Zweifelsfall kannst du mit einer Schleife über fgetl alle Zeilen der Reihe nach einlesen. Es dürfte jedoch mühsam sein, die Daten dann auszusortieren.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Lokdog
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 96
Anmeldedatum: 07.04.16
Wohnort: Heilbronn
Version: ---
     Beitrag Verfasst am: 13.04.2017, 11:24     Titel:
  Antworten mit Zitat      
Ja so oder?

Code:

Jetzt hast du den kompletten Text in einer Zelle und kannst dir mit z.B.

Code:

etwas darin suchen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Luftus

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2017, 19:38     Titel:
  Antworten mit Zitat      
Hallo,

danke für Eure Hilfe. Die Lösung in einer Zelle ist schon mal nicht schlecht. Einen Befehl um alles nicht in einer Zelle sondern in verschiedenen Zellen, quasi einer Matrix, zu speichern, gibt es nicht, oder? Weil auch wenn es unglaublich klingt, aber ich benötige tatsächlich alle Inhalte der Datei Smile Und jede einzelne Zeile einzulesen ist dann doch mühsam, besonders da ja innerhalb einer Zeile auch Text und Zahlen stehen...

Danke für Ihre Mühen!
 
Lokdog
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 96
Anmeldedatum: 07.04.16
Wohnort: Heilbronn
Version: ---
     Beitrag Verfasst am: 13.04.2017, 20:04     Titel:
  Antworten mit Zitat      
Mit
Code:
kannst richtig geil Sachen suchen. les dir mal bisschen was durch.
Private Nachricht senden Benutzer-Profile anzeigen
 
Luftus

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.04.2017, 10:30     Titel:
  Antworten mit Zitat      
Hallo zusammen,

ich habe Eure Vorschläge mal ausprobiert und das mit fgetl funktioniert auch relativ gut. Allerdings specihert er mir im Moment immer nur die letzte Zeile meiner Datei in die Matrix A ab. Wie kann ich jede einzelne Zeile dort untereinander in Zeilen drucken lassen?
Und gibt es anschließend die Möglichkeit die einzelnen Zeilen nach Tabs zu durchsuchen und dann in Spalten aufzuteilen?

Besten Dank für Eure Hilfe!

Code:
%Soweit bin ich
clear
close all
clc


fid = fopen('Test.txt');

tline = fgetl(fid);
while ischar(tline)
    A =[tline];
    disp(tline);
    tline = fgetl(fid);
end

fclose(fid);


 
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.04.2017, 10:51     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Wie kann ich jede einzelne Zeile dort untereinander in Zeilen drucken lassen?

Indem du einen Index verwendest, z.B. Initialisierung:
Code:

und Aktualisierung:
Code:
A{end+1} = tline;


Zitat:
Und gibt es anschließend die Möglichkeit die einzelnen Zeilen nach Tabs zu durchsuchen und dann in Spalten aufzuteilen?

strsplit

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.04.2017, 12:16     Titel:
  Antworten mit Zitat      
Hallo Harald,

das funktioniert schon sehr gut, vielen Dank!

Noch zwei Fragen hätte ich:

Kann ich die einzelnen tline-Zeilen, die ich in A schreibe auch untereinander und nicht nebeneinander speichern? Dann könnte ich mir das transponieren sparen...

Mit strsplit speichert es jetzt die einzelnen Werte in ein Cell Array, das innerhalb von A steht. Kann ich die einzelnen Werte auch direkt in die Matrix A schreiben lassen?

Besten Dank!

Gruß Luftus

Mein aktueller Code:
Code:


clear
close all
clc


fid = fopen('Test.txt');        % öffnet gewünschtes File

tline = fgetl(fid);             % nimmt Zeile für Zeile aus dem File

A = {};                         % Initialisiert Matrix


while ischar(tline)             % sucht nach Zeichen in jeder Zeile
    C = strsplit(tline,'\t');   % trennt die Zeichen nach Tabs und speichert die Zeile als Cell Array
    A{end+1} = C;               % schreibt die Zeilen spaltenweise hinterienander      
    tline = fgetl(fid);         % springt zur nächsten Zeile
end
B = transpose(A);               % transponiert A, damit Zeilen untereinander stehen


fclose(fid);

 
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.04.2017, 12:44     Titel:
  Antworten mit Zitat      
Hallo,

Vorschlag:
Code:
fid = fopen('Test.txt');        % öffnet gewünschtes File

tline = fgetl(fid);             % nimmt Zeile für Zeile aus dem File

A = cell(0, 5);                         % Initialisiert Matrix


while ischar(tline)             % sucht nach Zeichen in jeder Zeile
    C = strsplit(tline,'\t');   % trennt die Zeichen nach Tabs und speichert die Zeile als Cell Array
    A(end+1, 1:numel(C)) = C;   % schreibt die Zeilen spaltenweise hinterienander      
    tline = fgetl(fid);         % springt zur nächsten Zeile
end
%B = transpose(A);               % transponiert A, damit Zeilen untereinander stehen


fclose(fid);


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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.04.2017, 10:36     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen, vielen Dank so hab ich mir die Struktur vorgestellt. Smile

Nun hab ich nur noch das Problem, dass ich zwar auf die einzelnen Zellen zugreifen, aber noch nicht mit Ihnen rechnen kann, da die Daten im Moment noch characters und keine Zahlen sind...

Gibt es da einen einfachen Befehl? Ich dachte daran jede Zeile dahingehend zu überprüfen, ob sie mit einer Ziffer oder einem minus beginnt. Jedoch komme ich mit der Matlabsyntax noch nicht ganz klar...

Code:

clear
close all
clc


fid = fopen('Test.txt');        % öffnet gewünschtes File

tline = fgetl(fid);             % nimmt Zeile für Zeile aus dem File

A = cell(0, 5);                 % Initialisiert Matrix


while ischar(tline)             % sucht nach Zeichen in jeder Zeile
    C = strsplit(tline,'\t');   % trennt die Zeichen nach Tabs und speichert die Zeile als Cell Array
    A(end+1, 1:numel(C)) = C;   % schreibt die Zeilen spaltenweise hinterienander      
    tline = fgetl(fid);         % springt zur nächsten Zeile
end


while i=1:1:n and j=1:1:n
    stringVar=A(i,j)
    switch
        case stringVar(1)='0'
            do Q=str2num(stringVar) %= function(stringVar): str2num (stringVar)
        case stringVar(1)='1'
            do Q=str2num(stringVar)
            ...
        case stringVar(1)='-'
            do Q=str2num(stringVar)
        otherwise: do nothing % stringVar=string    
   
    end
end

B=str2num(A);

fclose(fid);

D=A{30,2};
E=A{31,2};
F=E-D
 
 
Luftus

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.04.2017, 15:23     Titel:
  Antworten mit Zitat      
Hallo zusammen,

ich habe nun eine Lösung gefunden und wollte der vollständigkeithalber die Lösung posten. Besten Dank für die Hilfe!

Code:

clear
close all
clc

   
fid = fopen('Test.txt');                    % öffnet gewünschtes File

tline = fgetl(fid);                         % nimmt Zeile für Zeile aus dem File

A = cell(0, 5);                             % Initialisiert Matrix



while ischar(tline)                         % sucht nach Zeichen in jeder Zeile
    C = strsplit(tline,'\t');               % trennt die Zeichen nach Tabs und speichert die Zeile als Cell Array
    A(end+1, 1:numel(C)) = C;               % schreibt die Zeilen spaltenweise hinterienander      
    [hA,lA]=size(A);
    for j=1:numel(C)
        stringVar=A(hA,j);
        stringVar=cell2mat(stringVar);
        if isempty(stringVar)==1
        else
            switch stringVar(1)
                case '0'
                    A{hA,j}=str2double(stringVar);         %= function(stringVar): str2num (stringVar)
                case '1'
                    A{hA,j}=str2double(stringVar);
                case '2'
                    A{hA,j}=str2double(stringVar);
                case  '3'
                    A{hA,j}=str2double(stringVar);
                case '4'
                    A{hA,j}=str2double(stringVar);
                case  '5'
                    A{hA,j}=str2double(stringVar);
                case  '6'
                    A{hA,j}=str2double(stringVar);
                case  '7'
                    A{hA,j}=str2double(stringVar);
                case  '8'
                    A{hA,j}=str2double(stringVar);
                case  '9'
                    A{hA,j}=str2double(stringVar);
                case '-'
                    A{hA,j}=str2double(stringVar);
                otherwise
                    %disp('HIER11')
                %A(end+1,j)=string(Var);
            end
        end
    end    
   
    tline = fgetl(fid);                     % springt zur nächsten Zeile
end


fclose(fid);

D=A{30,2}
E=A{31,2}
F=E-D
 
 
RaphaelE
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 07.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2018, 14:46     Titel: .txt/.dat Datei komplett in Matlab als Matrix einlesen
  Antworten mit Zitat      
Grüß euch,

ich hänge an einem ähnlichem Problem, wie auch schon Luftus im Jahr zuvor. Ich möchte eine .dat Datei in Matlab einlesen (.dat ist hier nicht erlaubt, darum als .txt hochgeladen). Mit der Lösung von Luftus komme ich da nicht weiter. Habt ihr eine Lösung? Sollte ein 3761x18 Array ergeben.
Ich brauche eigentlich nur die Werte und keine Überschriften.

Danke schon einmal!

Version: R2017b

TRY2015_483418110259_Jahr_dat_in_txt.txt
 Beschreibung:
Wetterdaten Testreferenzjahr 2015 als .txt

Download
 Dateiname:  TRY2015_483418110259_Jahr_dat_in_txt.txt
 Dateigröße:  669.26 KB
 Heruntergeladen:  436 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.11.2018, 19:48     Titel:
  Antworten mit Zitat      
Hallo,

deine Datei ist einfacher strukturiert. Da sollte z.B. textscan mit einer passenden Anzahl Kopfzeilen schon ausreichen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.