Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Studierende:
Praktikant Toolentwicklung Matlab (m/w)
Branche: Beratung, Expertise, Fahrzeugtechnik, Fahrzeugteile, Technische Dienstleistungen
MBtech Group GmbH & Co. KGaA - Fellbach

Abschlussarbeit / Praktikum: Entwicklung Matlab (m/w)
Branche: Informationstechnologie, Elektrotechnik, Elektronik
GIGATRONIK Technologies GmbH - Ulm

Werkstudent (m/w) im Bereich Hochfrequenzmesstechnik
Branche: Mess-, Regel-, Automatisierungstechnik, Telekommunikation, Nachrichtentechnik
ROHDE & SCHWARZ GmbH & Co. KG - München

Bachelor-/ Masterarbeit in der Softwareentwicklung
Branche: Fahrzeugtechnik, Fahrzeugteile
über Campusjäger GmbH - Karlsruhe

Praktikant/Werkstudent (m/w) für 5G Research- & Development-Aktivitäten
Branche: Elektrotechnik, Elektronik, Mess-, Regel-, Automatisierungstechnik, Telekommunikation, Nachrichtentechnik
ROHDE & SCHWARZ GmbH & Co. KG - München

weitere Angebote

Partner:


Vermarktungspartner


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, 08: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:  35 mal


Harald
Forum-Meister

Forum-Meister


Beiträge: 17.530
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 13.04.2017, 09: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, 09: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: 17.530
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 13.04.2017, 10: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: 82
Anmeldedatum: 07.04.16
Wohnort: Heilbronn
Version: ---
     Beitrag Verfasst am: 13.04.2017, 10: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, 18: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: 82
Anmeldedatum: 07.04.16
Wohnort: Heilbronn
Version: ---
     Beitrag Verfasst am: 13.04.2017, 19: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, 09: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: 17.530
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 18.04.2017, 09: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, 11: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: 17.530
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 18.04.2017, 11: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, 09: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, 14: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
 
 
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2017 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.