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

Einlesen mehrerer Dateien und Umformung in ein struct

 

ansc
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.10.2015, 14:56     Titel: Einlesen mehrerer Dateien und Umformung in ein struct
  Antworten mit Zitat      
Hallo alle zusammen,

ich bin gerade dabei zu versuchen einen Code zu entwickeln, welcher zuerst meine txt. Dateien aus einem Ordner einliest und diese dann am besten auch noch gleich in ein gewünschtes struct umwandelt.
Bisher ist es mir gelungen Dateien einzeln einzulesen und in die gewünschte Forum zu bringen, da ich aber insgesamt über 5000 txt Dateien habe ist das natürlich ein wenig umständlich. Einen kleinen Ausschnitt einer Beispieldatei füge ich gerne bei.
Für das Einlesen von einzelnen Dateien bin ich folgendermaßen vorgegangen:
Zuerst habe ich mir von Matlab folgendes Importfile erstellen lassen:

Code:
function wind = importfile(filename, startRow, endRow)
%IMPORTFILE Import numeric data from a text file as a matrix.
%   WIND = IMPORTFILE(FILENAME) Reads data from text file FILENAME for the
%   default selection.
%
%   WIND = IMPORTFILE(FILENAME, STARTROW, ENDROW) Reads data from rows
%   STARTROW through ENDROW of text file FILENAME.
%
% Example:
%   wind = importfile('Beispiel.txt', 1, 18 );

%% Initialize variables.
delimiter = ';';
if nargin<=2
    startRow = 1;
    endRow = inf;
end


formatSpec = '%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%[^\n\r]';

%% Open the text file.
fileID = fopen(filename,'r');

%% Read columns of data according to format string.
% This call is based on the structure of the file used to generate this
% code. If an error occurs for a different file, try regenerating the code
% from the Import Tool.
dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1, 'Delimiter', delimiter, 'HeaderLines', startRow(1)-1, 'ReturnOnError', false);
for block=2:length(startRow)
    frewind(fileID);
    dataArrayBlock = textscan(fileID, formatSpec, endRow(block)-startRow(block)+1, 'Delimiter', delimiter, 'HeaderLines', startRow(block)-1, 'ReturnOnError', false);
    for col=1:length(dataArray)
        dataArray{col} = [dataArray{col};dataArrayBlock{col}];
    end
end

%% Close the text file.
fclose(fileID);

%% Post processing for unimportable data.
% No unimportable data rules were applied during the import, so no post
% processing code is included. To generate code which works for
% unimportable data, select unimportable cells in a file and regenerate the
% script.

%% Create output variable
wind = [dataArray{1:end-1}];


Daraufhin habe ich mir dieses Skript geschrieben um die Daten in das gewünschte struct einzusortieren:

Code:
field1 = 'numericTime'; value1={Beispiel(:,1:1:4)};
field2 = 'azAng'; value2={Beispiel(:,5)};
field3 = 'elAng'; value3={Beispiel(:,6)};
field4 = 'range'; value4={Beispiel(:,7:4:end)};
field5 = 'radVel'; value5={Beispiel(:,8:4:end)};
field6 ='CNR'; value6={Beispiel(:,9:4:end)};
field7 = 'dev'; value7={Beispiel(:,10:4:end)};

scannerData = struct(field1, value1, field2, value2,field3, value3,field4,value4,field5,value5,field6,value6,field7,value7);


Um das ganze dann zu vereinfachen habe ich diese beiden in einem Skript zusammengefasst:

Code:
Beispiel = importfile(C:\Users\Anne\Desktop\Beispiel.txt);
createstructoffmatrix;


Ich habe mir schon mehrere Artikel durchgelesen, wie man Daten auch aus Ordnern einlesen kann und dabei den Befehl 'uigetdir' gefunden, der mir sehr hilfreich erscheint.
Bei weiterer Recherche bin ich auf den folgenden Beispielcode gestoßen:

Code:
pathname = uigetdir('', 'Verzeichnis wählen');
if pathname == 0                                         % wenn der Benutzer 'cancel' drückt...
  return                                                 %  ... das Programm verlassen
end

Mdir = dir(pathname);                                    % alle Verzeichniseinträge einlesen (*)
nbentries = size(Mdir, 1);                               % ihre Anzahl bestimmen
Mfiles = [];                                             % Resultatmatrix als leer vordefinieren
for entry_i = 1:nbentries                                % Schleife über alle Verzeichniseinträge
  if Mdir(entry_i).isdir == false                        % ist dies nicht ein Verzeichniseintrag?
                                                         % --> dann ist es ein Dateiname
    filename = Mdir(entry_i).name;                       % den aktuellen Dateinamen extrahieren
    if filename(1) ~= '.'                                % Einträge '.' und '..' ausschliessen (**)
      [p, n, ext] = fileparts(filename);                 % Extension des Dateinamens bestimmen
      if strcmpi(ext, '.tab')                            % mit der gewünschten Endung vergleichen
        Mfiles = char(Mfiles, filename);              % bei Übereinstimmung den Dateinamen speichern
      end
    end
  end
end
nbfiles = size(Mfiles, 1);                               % Anzahl gefundener Dateinamen bestimmen


Da ich leider noch nicht sehr erfahren mit Matlab bin schaffe ich es leider nicht diesen Code oder andere die ich bisher gefunden habe auf meine Bedürfnisse anzupassen.
Ich wäre sehr dankbar, wenn mir hier jemand helfen , oder ein paar gute Tips geben könnte.
Ich bedanke mich auf jeden Fall schon einmal, bei allen die ein wenig Zeit für mein Problem aufbringen.

Achso und ich benutze Matlab R2014a.

Viele Grüße

Beispiel.txt
 Beschreibung:

Download
 Dateiname:  Beispiel.txt
 Dateigröße:  674 Bytes
 Heruntergeladen:  492 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: 05.10.2015, 15:09     Titel:
  Antworten mit Zitat      
Zitat:
Da ich leider noch nicht sehr erfahren mit Matlab bin schaffe ich es leider nicht diesen Code oder andere die ich bisher gefunden habe auf meine Bedürfnisse anzupassen.

ich sehe garnicht den versuch. deine beiden funktionen tauchen ja garnicht auf. es ist schwer verbesserungsvorschläge zu machen wenn man den versuch nicht siht Smile
bitte poste den code der jetzt nicht geklappt hat mit fehlermeldungen und wie das ergebniss vom geünschten abweicht.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
ansc
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.10.2015, 15:49     Titel:
  Antworten mit Zitat      
Hallo Winkow,

leider fängt da mein Problem schon an, ich bin mir einfach nicht sicher wo ich was hinpacken muss. Da du von Funktionen, also Mehrzahl sprichts, gehe ich davon aus, das die Funktion importfile auch im neuen Code vorkommen muss, ich dachte aber zum Beispiel, das ich diese nicht benötige, wenn ich 'uigetdir' verwendet. Dies ist dann wohl schonmal ein grundlegender Fehler von mir. Und dann bin ich mir nicht sicher wo ich die zweite Funktion einbauen soll. Ich würde denken das es in eine for Schleife eingebaut werden muss, im Sinn von: Für jeden einzelne Datei kreiere ein struct nach folgendem Muster.
Aber ich versuch es noch mal.

Danke schonmal für den Hinweis.
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: 05.10.2015, 15:53     Titel:
  Antworten mit Zitat      
naja
1. alle dateipfade ermitteln. mit dir uigetfile etc
2. deine importfunktion in einer schleife mit den dateinamen aufrufen ( fullfile )
3. in dieser schleife auch dynamisch deinen struct anlegen. wie man structnamen dynamisch erstellt steht in der doc
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
ansc
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.10.2015, 17:05     Titel:
  Antworten mit Zitat      
Ok, dann werde ich mein Glück mal versuchen.
Danke.
Private Nachricht senden Benutzer-Profile anzeigen
 
ansc
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.10.2015, 11:19     Titel:
  Antworten mit Zitat      
Morgen,
also ich habe mich noch ein wenig durch mehrere Foren gelesen und bin derzeit bei diesem Code angelangt, ist zwar nicht der von dem ich gestern ausgehen wollte, aber ich sollte ja trotzdem auf mein Wunschergebnis kommen sollen:

Code:
pathname = uigetdir('', 'Verzeichnis wählen');
list     = dir(fullfile(pathname, '*.txt'));
files    = {list.name};
format   = '%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%[^\n\r]';
daten    = cell(1,numel(files));
for k=1:numel(files)
    % einlesen der Dateien
    NN = importfile(fullfile(pathname, files{k}),'r');
    format = '%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%[^\n\r]';
    daten {k} = textscan(NN,format,'Delimiter','');
    fclose(NN);
end

 


Soweit lässt mich dieser Code einen Ordner auswählen, aber im Endeffekt liest er für NN nur meine erste Textdatei ein und nicht alle.
Kann das mit diesem Fehler zusammenhängen? :

Error using textscan
Invalid file identifier. Use fopen to generate a valid file identifier.

Error in test2 (line 10)
daten {k} = textscan(NN,format,'Delimiter','');

Wenn ich es allerdings mit fopen versuche passiert folgendes:

Error using fopen
File identifier must be an integer-valued scalar of type double.

Error in test2 (line 10)
daten {k} = fopen (NN,format,'Delimiter','');

Ich würde mich freuen, wenn mir nochmal jemand helfen könnte.

Viele Grüße.
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: 06.10.2015, 11:27     Titel:
  Antworten mit Zitat      
du vermischt da irgendwie zwei sachen miteinander da seh ich noch nicht ganz durch.
du liest doch in importfile die daten schon mit textscan ein und willst diese bereits eingelesenen daten nochmal mit textscan bearbeiten?
und wozu das fclose(NN)? NN ist doch kein identifier der mit fopen erstellt wurde sondern dein array aus importfile. das siht sehr wirr aus
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
ansc
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.10.2015, 11:40     Titel:
  Antworten mit Zitat      
Naja ich habe halt versucht einen ähnlichen Code auf mein Problem anzuwenden, daher dann auch das fclose.
Also brauche ich eigentlich diese Zeilen alle nicht?
Code:
format = '%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%[^\n\r]';
    daten {k} = textscan(NN,format,'Delimiter','');
    fclose(NN);

Tut mir wirklich leid wenn es alles etwas wirr ist.
Private Nachricht senden Benutzer-Profile anzeigen
 
ansc
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2015, 10:43     Titel:
  Antworten mit Zitat      
Hallo nochmal,
also ich habe nochmal ganz von vorne angefangen und mittlerweile klappt das einlesen mit diesem Code
Code:
clc;
clear all;

pathname = uigetdir('', 'Verzeichnis wählen');   %Auswählen des einzulesenden Ordners
if pathname == 0                                         % wenn der Benutzer 'cancel' drückt...
  return                                                 %  ... das Programm verlassen
end

list = dir(fullfile(pathname,'*.txt'));

files = {list.name};

for k=1:numel(files)
% einlesen der Dateien
     Beispiel{k} = load(fullfile(pathname,files{k}));  % Laden aller Dateien aus dem ausgewählten Ordner
 
end
 



Ich habe allerdings noch eine Frage und wäre sehr glücklich, wenn mir jemand helfen könnte.

Ich würde jetzt wie oben beschrieben gerne meine eingelesenen Dateien in ein struct einsortieren und habe bisher folgenden Code
Code:

for k = 1:length(Beispiel)
   
field1 = 'numericTime'; value1={Beispiel{:,k}(:,1:1:4)};
field2 = 'azAng'; value2={Beispiel{:,k}(:,5)};
field3 = 'elAng'; value3={Beispiel{:,k}(:,6)};
field4 = 'range'; value4={Beispiel{:,k}(:,7:4:end)};
field5 = 'radVel'; value5={Beispiel{:,k}(:,8:4:end)};
field6 ='CNR'; value6={Beispiel{:,k}(:,9:4:end)};
field7 = 'dev'; value7={Beispiel{:,k}(:,10:4:end)};


scannerData = struct(field1, value1, field2, value2,field3, value3,field4,value4,field5,value5,field6,value6,field7,value7);

end;


Dieser liest mir leider nur die k-te Schleife in das gewünschte struct ein.
Ich gehe davon aus, dass ich noch eine Schleife brauche, aber irgendwie hänge ich fest.

Danke schonmal an alle die sich drüber Gedanken machen.
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: 08.10.2015, 11:09     Titel:
  Antworten mit Zitat      
da das so nicht lauffähig ist musst du beschreiben was denn jetzt nicht klappt?
Beispiel hat doch nur die dimenson nx1 Beispiel{:,k} ist mir darum nicht ganz klar. und wie soll das dann in den stuckt? soll sich der filedname ändern oder was?
Code:
for k=1:10
scannerData(k) = struct('name',20);
end

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
ansc
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2015, 11:22     Titel:
  Antworten mit Zitat      
Also ich habe ja mehrere 1000 Text Dateien, die habe ich alle eingelesen und die liegen danach in einem 1x1000 cell, heißt das ich in der ersten Zeile in jeder Spalte sowas stehen habe wie 400x50 double und diesen Inhalt möchte ich gerne in das beschriebene struct umformen.
Ich hoffe du verstehst was ich meine.

Wenn ich k per Hand ändere, dann klappt es so wie ich es gerne hätte mit diesem Code (als Beipiel wen nich zwei Dateien zum einlesen hätte, das steigt natürlich mit der Anzahl der Dateien):
Code:
field1 = 'numericTime'; value1={Beispiel{1,1}(:,1:1:4),Beispie{1,2}(:,1:1:4)};
field2 = 'azAng'; value2={Beispie{1,1}(:,5),Beispie{1,2}(:,5)};
field3 = 'elAng'; value3={Beispie{1,1}(:,6),Beispie{1,2}(:,6)};
field4 = 'range'; value4={Beispie{1,1}(:,7:4:end),Beispie{1,2}(:,7:4:end)};
field5 = 'radVel'; value5={Beispie{1,1}(:,8:4:end),Beispie{1,2}(:,8:4:end)};
field6 ='CNR'; value6={Beispie{1,1}(:,9:4:end),Beispie{1,2}(:,9:4:end)};
field7 = 'dev'; value7={Beispie{1,1}(:,10:4:end),Beispie{1,2}(:,10:4:end)};


scannerData = struct(field1, value1, field2, value2,field3, value3,field4,value4,field5,value5,field6,value6,field7,value7);


da ich das aber nicht für alle 1000 Dateien schreiben will dachte ich, dass es sicher einen schnelleren Weg geben wird.
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: 08.10.2015, 11:38     Titel:
  Antworten mit Zitat      
Zitat:
Ich hoffe du verstehst was ich meine.

nein
warum geht mein vorschlag nicht? wie soll denn das gewünschte ergebniss aussehen? wie weicht das erzielte ergebniss vom gewünschten ab?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
ansc
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2015, 11:58     Titel:
  Antworten mit Zitat      
Also, wenn ich für Beispiel 4 meiner Textdateien einlese sieht Beispiel aus, wie das erste Bild, was ich im Endeffekt gerne haben möchte ist quasi so wie das zweite Bild, nur ist hier jetzt halt viermal Beispiel {1,4} eingelesen, anstatt alle Spalten aus Beispiel.

Dok1.pdf
 Beschreibung:

Download
 Dateiname:  Dok1.pdf
 Dateigröße:  91.98 KB
 Heruntergeladen:  407 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: 08.10.2015, 12:09     Titel:
  Antworten mit Zitat      
aber das ist doch das was ich geschrieben habe oder?
Code:
for k = 1:length(Beispiel)
   
field1 = 'numericTime'; value1={Beispiel{:,k}(:,1:1:4)};
field2 = 'azAng'; value2={Beispiel{:,k}(:,5)};
field3 = 'elAng'; value3={Beispiel{:,k}(:,6)};
field4 = 'range'; value4={Beispiel{:,k}(:,7:4:end)};
field5 = 'radVel'; value5={Beispiel{:,k}(:,8:4:end)};
field6 ='CNR'; value6={Beispiel{:,k}(:,9:4:end)};
field7 = 'dev'; value7={Beispiel{:,k}(:,10:4:end)};


scannerData(k) = struct(field1, value1, field2, value2,field3, value3,field4,value4,field5,value5,field6,value6,field7,value7);

end;
 

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
ansc
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2015, 12:12     Titel:
  Antworten mit Zitat      
Entschuldige, du hast vollkommen recht, ich hab falsch gedacht.
Es funktioniert jetzt wunderbar, vielen Dank für deine Hilfe und vor allem Geduld.
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.