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 File auslesen

 

kawhans
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 07.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.03.2012, 16:27     Titel: *.txt File auslesen
  Antworten mit Zitat      
Hallo zusammen,

ich hätte da eine Frage, was das Einlesen von *.txt Dateien angeht. Ich weiss, dieses Problem ist schon häufig im Forum besprochen worden, jedoch habe ich für meinen Fall keine Lösung finden können.

Zu meinem Problem:

Ich habe in einem Ordner viele *.txt Files liegen. Im Forum habe ich gefunden, dass ich mittels

Code:
Dateiliste = dir('*_Tore.txt');


die Liste der Dateinamen in Matlab laden kann. Dies funktioniert soweit auch super. Dabei ist der * der Platzhalter für vorangehende Zeichen.

Jetzt versuche ich mittels

Code:
for t=1:length(Dateiliste)
        fileName = Dateiliste.name
        fid = fopen(fileName, 'r')
        text = textscan (fid, '%s %f %f %f')
       
    end
 


alle Dateien einzulesen, was jedoch nicht funktioniert. Hier wird nur eine Datei eingelesen und nicht der ganze Ordner mit allen Dateien. Hier komme ich leider nicht weiter.

Als kleine Ergänzung:
Die Textdateien enthalten Zeilenweise (unterschiedlich viele) Informationen in Form von String Zahl Zahl Zahl (also in Matlab: %s %f %f %f).

Ich möchte diese Zahlen, mit einer Referenzzahl (genauer gesagt einem Referenzvektor) verrechnen. Die Grundsätzliche Berechnung (aber sehr undynamisch) funktioniert soweit.

Code:

%Dies soll später mal dynamisch sein mit Werten aus der *.txt !
Ref_RE = [17 21 17];
Ref_LI = [18 63 12];

%Referenz - ist statisch.
Ziel_RE = [18 63 12];

%Berechnung des Vektorbetrags !
Bet_RE = sqrt(sum(Ref_RE.^2))
Bet_LI = sqrt(sum(Ref_LI.^2))

%Berechnung des Vektorbetrags der Referenz!
Bet_ZI= sqrt(sum(Ziel_RE.^2))

%Subtraktion der Beträge
Ergebnis = Bet_ZI_F - Bet_RE_F
 


Die Frage mit der Bitte um einen Rat mal auf den Punkt gebracht:

Ich habe Verschiedene *.txt Dateien (%s %f %f %f - aber unterschiedliche Anzahl von Zeilen). Deren Werte möchte ich mit einem Standardreferenzwert verrechnen. Dabei sollen die Werte innerhalb einer *.txt Datei automatisch in die Formel eingesetzt werden und verrechnet werden. Dabe ist es mir total wichtig zu wissen, bei welcher Datei (repräsentiert einen Namen) und unter welcher ZEILE (! also Tor1 oder Tor2 etc) welches Ergebnis herauskommt.

Mit dem Befehl

Code:

xlswrite('Test.xls', ergebnis)
 


wollte ich mir am Ende dann entsprechend die Ergebnisse eintragen lassen. (Aber da suche ich mir im Forum noch heraus, dass in Spalte A der Dateiname steht und B der String der TXT Datei etc)

Ich habe auch mal den Import Wizard benutzt - und fande die Anordnung "Create vectors from each row using row names" ganz schön. Wäre dies Prgrammierertechnisch ungeschickt?

Um einen Rat wäre ich unendlich Dankbar - und ich habe wirklich das Forum 2 Tage lang durchforstet Sad

LG

Hans

Jens_tore.txt
 Beschreibung:

Download
 Dateiname:  Jens_tore.txt
 Dateigröße:  28 Bytes
 Heruntergeladen:  367 mal
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 07.03.2012, 16:31     Titel:
  Antworten mit Zitat      
Code:
for t=1:length(Dateiliste)
        fileName = Dateiliste(t).name
        fid = fopen(fileName, 'r')
        text{t} = textscan (fid, '%s %f %f %f')
       
    end
 

wenn du die laufvariable einführst musst du sie auch benutzen Smile

Zuletzt bearbeitet von Winkow am 07.03.2012, 16:44, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
kawhans
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 07.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.03.2012, 16:40     Titel:
  Antworten mit Zitat      
Hi,

ja richtig, leider klappts trotzdem nicht....zeigt mir nur eine eingelesene Datei an....

LG
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 07.03.2012, 16:45     Titel:
  Antworten mit Zitat      
achja ich hatte es zwar hingeschrieben aber dann beim formel abtippen vergessen. fehler ist aber der selbe wie oben gesagt. laufvariable verwenden.
Private Nachricht senden Benutzer-Profile anzeigen
 
kawhans
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 07.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.03.2012, 16:54     Titel:
  Antworten mit Zitat      
Hi,

ah ok ich sehe es - dann ist es also korrekt, dass im Workspace unter der Variable fileName immer nur ein File angezeigt wird? Sprich das letzte File im Ordner?


LG und vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
kawhans
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 07.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.03.2012, 17:38     Titel:
  Antworten mit Zitat      
..was mir gerade einfällt - kann man bei

textscan ('%s %f %f %f')

den dritten parameter direkt ansprechen? also den gespeicherten wert auslesen um ihn zu verrechnen?

LG
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.03.2012, 18:57     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
ah ok ich sehe es - dann ist es also korrekt, dass im Workspace unter der Variable fileName immer nur ein File angezeigt wird? Sprich das letzte File im Ordner?

Ja, das ist korrekt. Du hast die Dateinamen ja auch in Dateiliste, brauchst sie also nicht nochmal?
In text solltest du aber die Daten für alle deine Dateien sehen; schau mal in den Variable Editor. Die Variable solltest du übrigens anders nennen, da es auch einen Befehl text gibt.

Zitat:
kann man bei textscan ('%s %f %f %f') den dritten parameter direkt ansprechen?

Was meinst du damit? Wenn du nur den dritten Parameter brauchst, kannst du dir anderen mit %*s bzw. %*f überspringen. Ansonsten kannst du dir aus dem für jede Datei erzeugten Cell Array jeweils die dritte Komponente herausholen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 07.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.03.2012, 22:43     Titel: Super
  Antworten mit Zitat      
Hi,

vielen Dank für die Hinweise - haben mir schon weiter geholfen Smile

Jetzt habe ich jedoch ein Folgeproblem:

Ich habe in der txt Datei mehrere Zeilen. Mittels Haralds Hinweis habe ich dann alle Zeichen der Zeilen auslesen können.

Ich habe jetzt versucht, eine For-Schleife zu basteln, welche von Anfang bis Ende geht:

Code:

for a1=1:1:length(a{1,1});          
         a_Ber = a{1,1}(a1)
     
     end
 


Dies geht dann bis d so weiter.

Jetzt stehe ich vor dem Problem, dass wenn ich die 3 Zahlenwerte mit einem vorher definierten anderen Wert (gleiches Format) verrechnen möchte, macht er dies nur mit dem letzten Eintrag in der *.txt - Datei.
Ich habe schonmal in der Hilfe geschaut, aber mit dem
Code:

komme ich hier nicht weiter oder?
Hätte jemand einen Tipp, wie ich jede Zeile mit dem vorher definierten Wert verrechnen kann?

LG
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.03.2012, 23:15     Titel:
  Antworten mit Zitat      
Hallo,

wenn du das gleiche Problem hast, dann versuchs doch mit der gleichen Lösung? Also wieder auf der linken Seite indizieren.

Wenn du sagen kannst, was der Ausgangspunkt ist und was du haben willst, kann man dir vielleicht eher weiterhelfen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 07.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.03.2012, 10:58     Titel: Hier mal der Code
  Antworten mit Zitat      
Hallo Harald,

anbei mal der Code:

Code:

%Referenzwert (statisch)
Ziel_RE = [25 56 90];

%Berechnung des Betrags des Vektors!
Bet_ZI_F = sqrt(sum(Ziel_RE.^2));

%Alle Dateien im Ordner finden mit der Endung *_tore.txt
Dateiliste = dir('*_tore.txt');

for t=1:length(Dateiliste);
   
        fileName = Dateiliste(t).name;
        %Alle Werte des Txt-Files einlesen!
        fid = fopen(fileName, 'r');
            a {t} = textscan (fid, '%s%*f%*f%*f%*f%*f%*f%*f','delimiter', ',');
            fclose(fid);  
        fid = fopen(fileName, 'r') ;
            b {t} = textscan (fid, '%*s%f%*f%*f%*f%*f%*f%*f','delimiter', ',');
            fclose(fid);  
        fid = fopen(fileName, 'r');
            c {t} = textscan (fid, '%*s%*f%f%*f%*f%*f%*f%*f','delimiter', ',');
            fclose(fid);  
        fid = fopen(fileName, 'r');
            d {t} = textscan (fid, '%*s%*f%*f%f%*f%*f%*f%*f','delimiter', ',');
            fclose(fid);  

       
%Name des Spieler wird herausgeschrieben! Erster String in Zeile
     for a1=1:1:length(a{1,1});          
         a_Ber{a1} = a{1,1}(a1)
     
   
            %  Die numerischen Werte werden herausgeschrieben in der Zeile        
                for b1=1:1:length(b{1,1});          
                b_Ber{b1} = b{1,1}(b1);
                     
                    for c1=1:1:length(c{1,1});
                        c_Ber{c1} = c{1,1}(c1);

                        for d1=1:1:length(d{1,1});
                            d_Ber{d1} = d{1,1}(d1);

                         Ref_RE = [b_Ber c_Ber d_Ber]              
                         Betrag_RE = sqrt(sum(Ref_RE.^2))
                         LE = [Bet_ZI - Betrag_RE a_Ber]
               
                        end
                   end
            end
     end    
end
 


Ziel für mich wäre, den Referenzwert mit den Werten innerhalb des *.txt Files zu verrechnen. Dies soll Zeilenweise passieren. Habe ich also z.B 5 Einträge in dem *.txt File, so müssten mit fünf Ergebnisse LE = herauskommen. Dabei soll der Name immer vor dem Ergebniss stehen. (hier: a_Ber)

Ich hatte das Problem, dass ich in Vergangenheit nur die Verrechnung des letzten Eintrags des *.txt Files mit dem Referenzwert angezeigt bekommen habe. Oder er die Schleifen unendlich durchgelaufen ist.
Optimal wäre, wenn man sich noch das Minimum und Maximum (ich denke mit

Code:

Min(X) bzw Max(X)
 

anzeigen lassen könnte.

Auch möchte ich mir die Ergebnisse einer Person als ExcelDatei abspeichern lassen. Ich hatte auch hier in Vergangenheit mit

Code:

xslwrite
 


das Problem, dass mir nur eine Zahl (sprich das Ergebnis des letzten Eintrags der *.txt) angezeigt wurde.

Anbei nochmal ein *.txt File.

Ich hoffe, mein Problem ist etwas verständlicher darstellt.

Viele Grüße und ein schönes Wochenende!
Hans

Gesamt_tore.txt
 Beschreibung:

Download
 Dateiname:  Gesamt_tore.txt
 Dateigröße:  57 Bytes
 Heruntergeladen:  333 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
kawhans
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 07.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2012, 13:28     Titel: Tip?
  Antworten mit Zitat      
...Hat jemand eine Idee oder ein Tip, welche/r zur Lösung beitragen könnte?

VG
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.03.2012, 14:24     Titel:
  Antworten mit Zitat      
Hallo,

es ist sehr schwierig zu sehen, was der Code eigentlich machen soll. Ich kann mir nicht vorstellen, dass die verschachtelten for-Schleifen sinnvoll sind, weil du auf die Weise jeden Eintrag jeder Zeile mit jedem anderen Eintrag jeder Zeile kombinierst.

Wenn du den Code laufen lässt, erhältst du die folgende Fehlermeldung:
Zitat:
??? Undefined function or method 'power' for input arguments of type 'cell'.

Das ist auch klar, weil du mit Cell Arrays eben nicht "rechnen" kannst.

Wie sollen die Ergebnisse erhalten bleiben, wenn du sie in jedem Schleifendurchlauf überschreibst? Du musst auch hier indizieren; siehe Beitrag von Winkow und von mir (9.3., 23:15).

Grüße,
Harald
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 - 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.