Verfasst am: 05.10.2015, 14:56
Titel: Einlesen mehrerer Dateien und Umformung in ein struct
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
%% 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
%% 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.
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 ifstrcmpi(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.
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
bitte poste den code der jetzt nicht geklappt hat mit fehlermeldungen und wie das ergebniss vom geünschten abweicht.
_________________
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.
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
_________________
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.
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
_________________
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);
pathname = uigetdir('', 'Verzeichnis wählen'); %Auswählen des einzulesenden Ordners
if pathname == 0% wenn der Benutzer 'cancel' drückt... return% ... das Programm verlassen 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.
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
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):
nein
warum geht mein vorschlag nicht? wie soll denn das gewünschte ergebniss aussehen? wie weicht das erzielte ergebniss vom gewünschten ab?
_________________
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.
Entschuldige, du hast vollkommen recht, ich hab falsch gedacht.
Es funktioniert jetzt wunderbar, vielen Dank für deine Hilfe und vor allem Geduld.
Einstellungen und Berechtigungen
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
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.