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

txtfile einlesen und aufbereiten

 

pfeili
Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 13.06.2012, 11:51     Titel: txtfile einlesen und aufbereiten
  Antworten mit Zitat      
liebe leute,

ich habe folgendes problem. bei messung mittels schallpegelanalysators entstehen txt-files (beispiel im anhang), welche folgendermaßen aussehen:

Zitat:

"Instrument","B&K-7667, VP7506,V1.21,148,106,113,165,109,118,135"
"File no.","001"
"Measured","12-05-31 16:02:20"
"Measurement text"," "
"Measurement type","Intensity Analysis (quad)"
"Input ch. A"," PROBE/PREAMP, HP 20 Hz, Max. 94 dB, ref. 2.0E-05 Pa."
"Input ch. B"," PROBE/PREAMP, HP 20 Hz, Max. 94 dB, ref. 2.0E-05 Pa."
"No. of spectra","1"
"Bandwidth","1/3 oct., 11.2E+3 Hz upper freq. real time."
"Averaging","Linear, 0:00:05.000"
"Spectrum weight","Add to spectrum : LIN., Add to W-Ch : LIN."
"Hold","Inactive"
"Applications","Inactive"

( Start of Data )
"Spectrum no.","1"
"Frequency [Hz]"," ","P [dB]"," ","V [dB]"," ","J [dB]"," ","I [dB]"
"0.40","V",44.61,"V",106.30,"N",75.05,"P",72.58
"0.50","V",32.29,"V",104.51,"P",66.53,"P",60.82
"0.63","V",37.13,"V",98.63,"N",62.13,"N",63.12
"0.80","V",44.19,"V",105.83,"N",69.43,"P",74.01

...

"8000.00","V",63.87,"V",64.18,"N",50.63,"P",63.64
"10000.00","V",62.91,"V",64.42,"P",52.16,"P",63.22
"A/L","V",75.73,"V",-256.12,"P",-256.12,"P",-256.12
"W","V",75.54,"V",117.31,"P",76.41,"P",80.45


nun möchte ich hieraus gern nur die zeilen mit den frequenzen 100 bis 10000 hz auslesen und zugehörig dann jeweils die fünf letzten zeichen (schallintensität) speichern, also z. b.:

Zitat:

...
[8000 63.64]
...


wie lese ich meine daten korrekt ein? bisher habe ich folgendes versucht um mit der eingabe von 1 alle dateien eines ordners einzulesen:

Code:

clc;
auswahlart = input('Ordner (1) oder einzelne Datei (2) einlesen? [1 2] ');
    if auswahlart == 1
        directoryname = uigetdir('C:\Users\', 'Wähle einen Ordner');
    else
    % Code checkt, ob Benutzer Dialog abbricht
    [filename, directoryname] = uigetfile('txt.m', 'Wähle');
        if isequal(filename,0) || isequal(directoryname,0)
           disp('User pressed cancel')
        else
           disp(['User selected ', fullfile(directoryname, filename)])
        end
    end
% Wechseln in ausgewählten Ordner
cd (directoryname)
% Anzahl der Dateien bestimmen
count = length(dir('*.txt'));
names = dir('*.txt')
for n = 1:count
    % Daten einlesen
    fid = fopen(names(n).name,'r');
    data{n} = char(fread(fid))';
    fclose(fid)
end
 


er macht mir dann ein 1x144 cell mit 3045 zeichen pro zelle, wo in selbiger zelle dann der gesamte inhalt jeweils einer txt-datei als string drinsteht. wie muss ich jetzt weiter vorgehen, damit ich den gewünschten datenbereich in eine matrix bekomme. am liebsten wäre mir am ende eine große matrix, welche in der ersten spalte die frequenzen von 100 bis 10000 hz und in den weiteren spalten dann die zugehörigen werte aus den 144 einzelnen textdateien.

für eure hilfe bin ich euch dankbar.

beste grüße

pfeili

001.TXT
 Beschreibung:

Download
 Dateiname:  001.TXT
 Dateigröße:  2.97 KB
 Heruntergeladen:  334 mal
Private Nachricht senden Benutzer-Profile anzeigen


_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 14.06.2012, 08:36     Titel:
  Antworten mit Zitat      
Hallo pfeili,
also wenn ich dein Code mit der Textdatei durchführe, ist data bei mir eine <1x1 cell> und dort steht die komplette Datei drin.

Wenn du dies so lassen willst, müsstest du dann den cellstring nach den Frequenzen durchsuchen...wobei ich mir nicht sicher bin, ob man die Zeilen zuordnen kann. (Sprich wann eine Zeile zu Ende ist)

Alternativ wäre jede Zeile einzelnd einzulesen und zu untersuchen.
Code:

% Beispiel aus der Hilfe zu fopen

fid = fopen('fgetl.m');

tline = fgetl(fid);
while ischar(tline)
    disp(tline);
    tline = fgetl(fid);
end

fclose(fid);
 


Somit kannst du jede Zeile durchsuchen. (Im ersten Schritt müsstest du nach dem Wort "Frequency" suchen, um zu wissen ab wann der interessante Bereich startet und dann die Werte untersuchen.)

Eine weitere Möglichkeit, wäre es mit textscan zu arbeiten.

Weiterhin würde ich nicht die Schallintensität auf die letzten 5 Zeichen beschränken, sondern entweder alles nach dem letzten Komma nehmen, oder wenn du textscan verwendest, dann eventuell direkt mit %f es als float einlesen.

Hoffe das hilft dir erstmal weiter.
_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 14.06.2012, 09:33     Titel:
  Antworten mit Zitat      
hallo peter,

vielen dank erstmal für deine antwort. ich hatte immer "1" gewählt, um gleich alle txt-dateien des ausgewählten ordners einzulesen, weshalb ich auf die 1x144 cell-struktur kam.

wenn ich es so mache, wie du es beschreibst, erhalte ich jedoch keine daten:

Code:

clear all
clc;
auswahlart = input('Alle Dateien eines Ordners (1) oder einzelne Datei (2) einlesen? [1 2] ');
    if auswahlart == 1
        directoryname = uigetdir('C:\Users', 'Wähle einen Ordner');
    else
    % Code checkt, ob Benutzer Dialog abbricht
    [filename, directoryname] = uigetfile('C:\Users\*.txt', 'Wähle eine Datei');
        if isequal(filename,0) || isequal(directoryname,0)
           disp('User pressed cancel')
        else
           disp(['User selected ', fullfile(directoryname, filename)])
        end
    end
% Wechseln in ausgewählten Ordner
cd (directoryname)
% Anzahl der Dateien bestimmen
count = length(dir('*.txt'));
names = dir('*.txt');
fid = fopen(names(1).name);

tline = fgetl(fid);
while ischar(tline)
    disp(tline);
    tline = fgetl(fid);
end
fclose(fid);
 


zwar zeigt er mir wegen disp() den gesamten inhalt des txt-files an, aber eigentlich müsste ich ja dann zeilenweise auf zugriff darauf haben, d. h. in einem cell-array speichern. dann müsste man es nach meinen gewünschten kriterien filtern und die zahlen als float und nicht als string haben, um sie in die gewünschte matrix zu packen. irgendwie verstehe ich noch nicht, wie ich da hingelangen kann.

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 14.06.2012, 11:03     Titel:
  Antworten mit Zitat      
wie gesagt, das war ein Beispiel aus der Hilfe und müsste angepasst werden.

Aber ich habe mal etwas rumgespielt und hier einen Vorschlag mit textscan:
Code:

fields = {'Frequenz', 'Schallintensitaet'};
count = 1;

fid = fopen('001.TXT');
data = textscan(fid, '%s %*s %*f %*s %*f %*s %*f %*s %f', 'Delimiter', ',', 'HeaderLines', 17);
data{1} = regexp(data{1}, '\d+\.\d*', 'match', 'once');
data = cell2struct(data, fields, 2);
data_filtered = nan(length(data.Frequenz), 2);

for i = 1:length(data.Frequenz)
    value = str2num(data.Frequenz{i});
    if value >= 100 & value <= 1000
       data_filtered(count, 1) = value;
       data_filtered(count, 2) = data.Schallintensitaet(i);  
        count = count + 1;
    end
end
fclose(fid);
 

_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 14.06.2012, 15:30     Titel:
  Antworten mit Zitat      
Einfach genial. Ich danke dir von ganzem Herzen.

Ich musste nur die Bedingung auf 10000 setzen, damit er nicht nur bis 1000 ausliest.

Danke und beste Grüße

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
Inferno87
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 31.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.10.2012, 22:18     Titel:
  Antworten mit Zitat      
Hallo Leute,

bin im Rahmen meines Studiums auch relativ neu im Umgang mit Matlab und bekomme es einfach nicht hin, eine Datei auszulesen.

Ich habe vor, eine txt. datei auszulesen, und diese dann wieder als txt. Datei zu speichern.

dabei sollen alle Zahlenwerte der Ursprungsdatei genommen werden, die A, B oder C entsprechen.

Als kleines Bsp meine 'Test.txt':

hier soll nichts stehen
Irgendwelches Zeugs
A = 1
B = 3
Gar nix
C = 6

mein erstes Problem ist schon das auslesen. Wie bekomme ich es hin, dass matlab nur die Zeilen mit A, B und C nimmt und die Zahlenwerte Speichert? Leider hat die Suche auch nicht geholfen Sad

Wäre sehr dankbar über Hilfe

Beste Grüße
Inferno87
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.