Verfasst am: 25.07.2018, 09:05
Titel: Datainame als Variablenname verwenden und weiter verarbeiten
Guten Morgen,
Ich hab hier einen code geschrieben damit ich CSV-Dateien einlesen kann.
Das funktioniert auch alles tadellos.
Da ich das ganze aber umschreiben muss um mehrere Dateien laden will um evtl. Vergleiche ziehen zu können, hatte ich die Idee das ich den Namen aus dem uigetfile nehme ihn als legitimem Namen umwandle und dann als Variablenname weiter verwende.
Ich scheitere aber daran das ich den Namen "automatisiert" weiter verwenden kann.
Er steht dann im Workspace will ihn aber nutzen ohne den Namen direkt einzugeben.
Wie mache ich das? Hat da jemand eine Idee?
Danke euch vielmals im Voraus.
Code:
%% Import data from text file. % Script for importing data from the following text file:
%
% To extend the code to different selected data or a different text file, % generate a function instead of a script.
%% Read columns of data as text: % For more information, see the TEXTSCAN documentation.
formatSpec = '%*s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%[^\n\r]';
%% Open the text file.
fileID = fopen([path,file],'r');
%% Read columns of data according to the format. % 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, 'Delimiter', delimiter, 'TextType', 'string', 'ReturnOnError', false, 'EndOfLine', '\r\n');
%% Convert the contents of columns containing numeric text to numbers. % Replace non-numeric text with NaN.
raw = repmat({''},length(dataArray{1}),length(dataArray)-1);
for col=1:length(dataArray)-1
raw(1:length(dataArray{col}),col) = mat2cell(dataArray{col}, ones(length(dataArray{col}), 1));
end
numericData = NaN(size(dataArray{1},1),size(dataArray,2));
for col=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22] % Converts text in the input cell array to numbers. Replaced non-numeric % text with NaN.
rawData = dataArray{col};
for row=1:size(rawData, 1) % Create a regular expression to detect and remove non-numeric prefixes and % suffixes.
regexstr = '(?<prefix>.*?)(?<numbers>([-]*(\d+[\.]*)+[\,]{0,1}\d*[eEdD]{0,1}[-+]*\d*[i]{0,1})|([-]*(\d+[\.]*)*[\,]{1,1}\d+[eEdD]{0,1}[-+]*\d*[i]{0,1}))(?<suffix>.*)';
try
result = regexp(rawData(row), regexstr, 'names');
numbers = result.numbers;
% Detected commas in non-thousand locations.
invalidThousandsSeparator = false;
if numbers.contains('.')
thousandsRegExp = '^\d+?(\.\d{3})*\,{0,1}\d*$';
ifisempty(regexp(numbers, thousandsRegExp, 'once'))
numbers = NaN;
invalidThousandsSeparator = true;
end end % Convert numeric text to numbers. if ~invalidThousandsSeparator
numbers = strrep(numbers, '.', '');
numbers = strrep(numbers, ',', '.');
numbers = textscan(char(numbers), '%f');
numericData(row, col) = numbers{1};
raw{row, col} = numbers{1};
end catch
raw{row, col} = rawData{row};
end end end
%% Replace non-numeric cells with NaN
R = cellfun(@(x) ~isnumeric(x) && ~islogical(x),raw); % Find non-numeric cells
raw(R) = {NaN}; % Replace non-numeric cells
%% Clear temporary variables clearvars N delimiter endRow formatSpec fileID dataArray ans raw col numericData rawData row regexstr result numbers invalidThousandsSeparator thousandsRegExp R;
Verfasst am: 25.07.2018, 12:49
Titel: Re: Datainame als Variablenname verwenden und weiter verarbe
Hallo JaSoIstEs,
Zitat:
...will um evtl. Vergleiche ziehen zu können, hatte ich die Idee das ich den Namen aus dem uigetfile nehme ihn als legitimem Namen umwandle und dann als Variablenname weiter verwende.
Das ist eine ausgesprochen schlechte Idee. Ich rate dringend davon ab, den das Gefrickel mit
eval
ist bekannt dafür, dass Du Dir mehr Probleme schaffst als löst. Es gibt hunderte Threads zu diesem Thema im Forum.
Das dynamische Erzeugen von Variablen bremst Matlab enorm aus - Faktor 100 ist möglich, und es macht das Debuggen extrem viel schwieriger, wenn nicht unmöglich. Deswegen sind
eval
,
assignin
und ihre Geschwister Methoden um sich ins Knie zu bohren und es gibt immer eine bessere Lösung.
Stattdessen könntest Du die Tabellen als Felder eines Structs speichern:
Nebenbei: "path" ist ein wichtiger Matlab-Befehl. Ihn mit einer Variable zu überschreiben kann zu sehr verwirrenden Effekten führen. Besser: "pathname". Das gleiche gilt für "table".
Gruß, Jan
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.