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 in Matlab einlesen und Array erstellen

 

Co

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2008, 16:35     Titel: .txt in Matlab einlesen und Array erstellen
  Antworten mit Zitat      
Moin moin,
ich habe folgendes Problem:

Ich habe eine .txt Datei und will aber viel lieber ein Array haben^^

Ich bräuchte einen Code, der den Benutzer nach dem Dateinamen fragt, überprüft ob es die Datei gibt und sie einließt.

Dann sollen aus dieser Datei Werte ausgelesen werden.
Ich habe mal eine Datei als Anhang eingefügt, damit ihr wisst wie so ding aussieht.

Erst kommen Header Zeilen (es können unterschiedlich viele sein!!) und dann kommen die wichtigen Daten, es sind immer 1200 Messwerte die zu einer Messung gehören. Danach folgt ein "Endrec" und es folgen die nächsten header zeilen.

Jede Messreihe soll in eine Spalte des selben Arrays kommen.
Also REC 1 in die erste spalte REC 2 in die zweite spalte und so weiter.

Achso auch die Anzahl der RECs in den txts ist unterschiedlich!!

Danke schon mal im Vorraus!!!!

Gruß Co

110107.txt
 Beschreibung:
Ist eine txt die ich gerne einlesen würde.

Download
 Dateiname:  110107.txt
 Dateigröße:  24.97 KB
 Heruntergeladen:  882 mal


Co

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2008, 10:06     Titel:
  Antworten mit Zitat      
Moin moin,
und habt ihr schon ne Idee? mir gehts halt hauptsächlich um das übertragen der Daten in ein Array da man sonst stundenlang nur mit der umformatierung beschäftigt ist.

Das mit dem dateinamen eingeben ist nicht so wild, denn kan man sonst auch im skript einfügen.

Hat einer von euch schon was raus bekommen?

Freundliche und Dankene Grüße

Co
 
Co

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2008, 10:45     Titel:
  Antworten mit Zitat      
Achso, wenn es einfacher ist das zu ne Excel datei zu machen ist das auch ok, ich brauche die daten nur in Tabellenform mit jedem Rec in einer neuen Zeile.


co
 
co

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2008, 10:47     Titel:
  Antworten mit Zitat      
Sorry nicht Zeile,

SPALTE

also

REC#1 REC#2
W W
E E
R R
T T
E E

und so weiter

sorry habe eben nicht aufgepasst.
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2008, 11:27     Titel:
  Antworten mit Zitat      
Hallo,

du kommst da wohl nicht ums Parsen drum herum.

Mit
Code:
fid = fopen(dateiname);
tline = fgetl(fid); %oder tline = fgets(fid)
kannst du die Datei zeilenweise lesen (bzw. du liest so eine Zeile aus). Anschließend vielleicht noch mit
Code:
die Zeile in eine Zahl umwandeln und mit
Code:
überprüfen ob es sich um eine Zahl oder um Text handelt (den Text wegwerfen, die Zahl in ein Array schreiben). Um die Werte in eine Matrix zu speichern, musst du irgendwas finden. Da bietet sich zB EndRec an, falls
Code:
if strcmp(tline,'EndRec')
zutrifft, kommt die nächste Zeile dran.

Wie schnell das ganze nun läuft, weiss ich leider nicht. Alternativ ist
Code:
vielleicht noch eine Möglichkeit, ich habe da allerdings keine Erfahrung damit gemacht.

Falls du nur Dateien mit Werten hast, kannst du die auch einfach mit
Code:
laden.

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Co

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2008, 09:54     Titel:
  Antworten mit Zitat      
Code:

file = input('dateiname mit .txt endung : ','s')
fid = fopen(file);
if (fid==-1)
    sprintf('Dateiname nicht gefunden')
else
array = [];
x = 1;
s = 1;
z = 1;
while(x == 1)
    tline = fgets(fid)
    if strncmp(tline, '[0-9]', 1)
        disp('Zahl gefunden')
        zahl = str2double(tline)

        if ~isnan(zahl);
            continue;
   
        else
            disp('Zahl ins Array');
            array(s,z) = zahl;
            z = z+1;
            continue;
   
        end
       
    elseif strcmp(tline, 'EndRec')
        disp('Neue Spalte');
        s=s+1
        z = 1
        continue;
   
    elseif strcmp(tline, 'EndData')
        disp('Fertig');
        x = 2
        break;
   
    else
        continue;
    end

fclose (fid);
end
end
 


Moin moin da bin ich wieder^^

Erstmal danke dib0r, hast mir echt schon geholfen mit deinen Tipps.

Ich habe nun soweit mal code geschrieben nur gibt ein paar probleme. Ich habe keine ahnung wie ich das Array ansprechen soll, bzw. ob das so funktioniert.
Aus C ken ich das so das man ein Mehrdimensionales Array über X udn Y Indexzahlen anspricht. Da aber der REGEXP "[0-9] nie zutrifft konnte ich das nicht nicht testen

Wenn ich den Code laufen lasse, bekomme ich zwar in tline alle Zeilen einzeln aufgelistet, aber die abfrage über

Code:
if strncmp(tline, '[0-9]', 1)


klappt leider nicht. Ich würde gerne das abgefragt wird ob die ersten zwei zeichen entweder eine zahl zwischen 0-9, ein komma oder ein minuszeichen sind.

Die nächste abfrage ob
tline = EndRec
funktioniert auch nicht da sonst s um einen erhöt werden müsste.
interessanterweise funktioniert aber die letzte abfrage ob
tline = EndData
ist. Denn "fertig " wird ausgegeben.

Vielleicht kann mir da wer sagen was ich falsch gemacht hab.

danke
Gruß Co

p.s. bei :
Code:


kann es sein das er mir da die Kommas rausschmeißt?

140k.txt
 Beschreibung:
Habe diesen Code mit einer abgespeckten Version einer .txt File laufen lassen. Hier noch mal damit ihr die selben bedingungen habt.

Download
 Dateiname:  140k.txt
 Dateigröße:  3.56 KB
 Heruntergeladen:  554 mal
 
Co

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2008, 12:35     Titel:
  Antworten mit Zitat      
also irgend wie funzt das mit dem

Code:

 if strcmp(tline, 'EndRec')
 


auch nicht. Scheint ich habe einen groben Syntaxfehler oder so was, ich bekomme keine fehler meldung aber selbst wenn ich eine txt oeffne die nur EndRec in jeder zeile hat, wird das nicht gefunden.

Wäre echt super wenn mir da wer helfen könnte.

Muss das zum laufen bekommen.


Habe auch schon mit switch tline
und case 'EndRec' versucht aber auch da bekomme ich keinen treffer.

Selbst wenn ich am Dateiende bin und tline nur noch -1 enthält, bekomme ich mit case '-1' keinen treffer.

ich hab keinen schimmer warum das nicht läuft.

gruß co

p.s. bei fragen könnt ihr auch gerne über ICQ (312045285) msgs schreiben.
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2008, 18:29     Titel:
  Antworten mit Zitat      
Hallo,

das Problem ist
Code:
. Da wird auch der Newline-Charakter (\n) mit in den String geschrieben. Benutze lieber
Code:
.

Falls du ein graphisches Menü zum Auswählen der Datei willst, kannst du auch
Code:
benutzen (eigentlich nicht so wichtig Smile )

In Matlab werden Arrays auch über die Indexzahlen angesprochen, die Indizes starten allerdings bei 1 und nicht bei 0.
Code:
A = [1 2 3;
       4 5 6];

A(2,1) -> 4;
A(2,3) -> 6;


Kommas werden als "Beistriche" erkannt, und nicht als Dezimaltrenner (hm, keine Ahnung wie das Fachwort heisst). Das sind Punkte unter Matlab. Du musst also die Kommas "ersetzen", z.B. mit
Code:


Der Vergleich mit strncmp funktioniert so nicht. Da gibt es allerdings mehrere Möglichkeiten, z.B.liefert
Code:
1 wenn tline mit einer Zahl beginnt. Oder auch
Code:
.

MfG

PS: Vielleicht hilft dir ja
Code:
,eine Auflistung (nahezu) aller relevanten Funktionen in Matlab, die mit Strings operieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
Co

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2008, 12:31     Titel:
  Antworten mit Zitat      
Code:
while (1)                                                  
file = input('dateiname mit .txt endung : ','s')        
fid = fopen(file);                                                
    if (fid==-1)                                                    
         out=questdlg('File Not Found! >> Try again?');
         if (strcmp(out,'Yes'))                                    
            continue;                                                
       
         else                                                        
                break;                                            
         end                                                
 
    else                                                    
    array = [,];
    s = 1;
    z = 1;
        while(1)                                          
           tline = fgetl(fid);                            
           comma = '(,)';                              
           DP = '(:)';                                              
            tline = regexprep(tline, DP, '..');    
            tline = regexprep(tline, comma, '.');
                zahl = str2num(tline);                
                 hilf = isempty(zahl);                  
                    if (hilf == 0)              
                        array(z,s) = zahl;                          
                        z = z+1;            
                        continue;          
                               
                elseif (strcmp(tline, 'EndRec'))      
                       s=s+1;                                
                       z = 1;                                  
                      continue;
   
                elseif (strcmp(tline, 'EndData'))    
                      disp('Ende der Datei')            
                      msgbox('Fertig');  
                      break;                                        
                else                            
                      continue;              
       
                end                            

        fclose (fid);                          
        end                                    

end                                            
break;                                        
end                                            


Es funktioniert^^

Noch mal Danke Dib0r,
hast mir echt geholfen.
Ich habe nun nur noch ein Problem, wenn ich den code laufen lasse, dann öffnet mir Matlab immer das
"Window Design & Analysis tool" das wil ich aber gar nicht haben^^

Weiß einer vielleicht wie ich das noch weg bekomme?

Gruß Co
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2008, 13:15     Titel:
  Antworten mit Zitat      
Hallo,

ich kenne dieses Tool zwar nicht, anscheinend wird es mit
Code:
geladen. An welcher Stelle im Code öffnet es sich?

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Co

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2008, 14:07     Titel:
  Antworten mit Zitat      
also das fenster öffnet sich immer dann wenn tline bei zeile 6 der headerzeilen:

Window duration 30,00 ms


angekommen ist. Mein suchenundersetzten macht daraus dann

Window duration 30.00 ms

weil er des komma durch ein punkt ersetzt.

Ist das vill. ein Matlabbefehl? die matlab konsole gibt mir folgendes als fehler meldung :

Warning: Could not find an exact (case-sensitive) match for 'Window'. D:\BachelorThesis\Progs\Matlab\toolbox\signal\signal\window.m is a case-insensitive match and will be used instead. You can improve the performance of your code by using exact name matches and we therefore recommend that you update your usage accordingly. Alternatively, you can disable this warning using warning('off','MATLAB:dispatcher:InexactMatch').

> In str2num>protected_conversion at 81
> In str2num at 46
> In cotest at 25
Initializing Window Design & Analysis Tool ..... done.

also cotest ist das script selber.
gibts da ne überschneidung die ich irgendwie aufheben muss, von einem befehl oder einer funktion?

MFG
Co
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2008, 15:15     Titel:
  Antworten mit Zitat      
Hallo,

tatsächlich.
Code:
öffnet dieses Tool. Versuch mal anstatt str2num
Code:
zu verwenden. Den Vergleich für eine gültige Zahl müsste so gehen:
Code:
zahl  = str2double(tline);
hilf = ~isnan(zahl);



MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Co

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.07.2008, 11:15     Titel:
  Antworten mit Zitat      
Super,
habe das eben überarbeitet und funzt alles^^
Hab auch
Code:

mit eingebaut Very Happy

Danke für die Hilfe Dib0r
Gibts eigentlich ne Möglichkeit diese Hilfsvariablen wie comma und dp noch während der laufzeit des Programms wieder ausm workspace zu entfernen? also das ich am ende sowas wie

Code:
clear comma dp win


im script schreibe? hatte das schon versucht nur damit scheint es nicht zu gehen ausser in der matLab console

gruß Co
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.07.2008, 14:24     Titel:
  Antworten mit Zitat      
Hallo,

das funktioniert ganz genauso: einfach mit
Code:
die Variable löschen.

Alternativ kannst du auch dein Skript in eine Funktion packen:

Code:
function array = getDataFromFile
% code
return
Du kannst dann natürlich auch noch irgendwelche Eingabeparameter oder zusätzliche Ausgabevariablen mit übergeben. Das ganze rufst du dann mit
Code:
meinArray = getDataFromFile;
auf. Alle Variablen innerhalb der Funktionsdeklaration werden dann nur temporär angelegt und nach Verlassen der Funktion wieder gelöscht (ausser du verwendest globale Variablen).

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