【发布时间】:2013-03-28 12:30:16
【问题描述】:
我已经编写了一个脚本,可以省去在 Matlab 中手动导入测试期间记录的数据。
每次测试运行在 .csv 文件中保存大约 2600 个变量,每个文件有 2 个标题行,两列数据,; 是分隔符。
文件名来自监控程序使用的内部 C 结构,因此属于这种类型:foo.bar.another.foo.bar.local_varname#VALUE.csv,我想用它在 Matlab 中重新创建结构,以便仅将其保存在 @ 987654324@文件。
很多时候local_varname 的长度超过 63 个字符,所以我有一些替换规则来缩短名称而不用 Matlab 截断名称(因此尽量避免命名冲突)。
这是代码
clear all
clc
% Main names
path_self = pwd;
backslash_indices = strfind(path_self,'\');
test_name = path_self(backslash_indices(end)+1:end); % the directory name gives me the test_name
% Preallocation
filenames = cell(1,2600);
addresses = cell(1,2600);
i=0;
% Full list
MyFiles = dir(path_self);
% Discard subdirectories and non interesting files
for k=1:length(MyFiles)
if ~MyFiles(k).isdir,
if ~isempty(strfind(MyFiles(k).name,'#VALUE.csv'))
i=i+1;
% Too many files
if i > length(filenames)
filenames = [filenames cell(1,100)];
addresses = [addresses cell(1,100)];
end
% Naming Substitution Rules
%%% INSERT HERE BUNCH OF RULES
% Addresses and names
filenames{i} = strrep(filename,'#VALUE.csv','');
addresses{i} = fullfile(path_self, MyFiles(k).name);
end
end
end
filenames = filenames(1:i);
addresses = addresses(1:i);
% Check that no conflicts are created
if length(filenames) ~= length(unique(filenames))
error('filenames not unique')
end
% Housekeeping #1
clear MyFiles backslash_indices i k path_self
% Import data
for j=1:length(filenames)
% Read data
Data = importdata(addresses{j}, ';', 2);
% Assign data
eval([filenames{j}, '.time = Data.data(:,1)./1000000;']); % Converted in seconds
eval([filenames{j}, '.values = Data.data(:,2);']);
% Let's avoid data corruption
clear Data
end
% Housekeeping #2
clear filenames addresses j
% Save data struct
save(test_name, '-regexp', '^((?!name).)*$')
现在我的问题
在研究资料和帮助编写上述代码时,我经常发现人们不喜欢使用eval():为什么会这样?上述情况,我能避免吗?
谢谢
编辑
正如@wakjah 所建议的,我测试了containers.Map() 方法。不幸的是不适合我们的需求,因为此时需要一个键列表并且访问数据并不完全友好(请记住,我有大约 2600 个变量,这意味着至少有相同数量的键)
至于@Dennis Jaheruddin 提出的问题,数据结构是可用的并且不会产生任何类型的冲突,即使使用这些长变量名(假设两个连续的. 之间的每个名称* 小于 63 个字符长)
*我很抱歉没有使用更好的技术术语
【问题讨论】: