我的文件名存储如下:
>> allFiles.name
ans =
k-120_knt-500_threshold-0.3_percent-34.57.csv
ans =
k-216_knt-22625_threshold-0.3_percent-33.33.csv
我希望从中提取4个值并存储在单元格中。
data={};
for k =1:numel(allFiles)
data{k,1}=csvread(allFiles(k).name,1,0);
data{k,2}= %kvalue
data{k,3}= %kntvalue
data{k,4}=%threshold
data{k,5}=%percent
...
end
答案 0 :(得分:1)
你只需要多次使用strtok进行标记(有多种方法可以解决这个问题)。有人在网络上的某处有一个方便的matlab脚本,可以将字符串标记为单元格数组。
(1)从:
开始filename = 'k-216_knt-22625_threshold-0.3_percent-33.33.csv'
使用strfind删除扩展名
r = strfind(filename, '.csv')
filenameWithoutExtension = filename(1:r-1)
这给我们留下了:
'k-216_knt-22625_threshold-0.3_percent-33.33'
(2)然后将其标记为:
'k-216_knt-22625_threshold-0.3_percent-33.33'
使用'_'。你得到了令牌:
'k-216'
'knt-22625'
'threshold-0.3'
'percent-33.33'
(3)最后,对于每个字符串,使用' - '标记。每个第二个字符串将是:
'216'
'22625'
'0.3'
'33.33'
并使用str2num进行转换。
答案 1 :(得分:1)
可能有一个正则表达式可以用来做这个,但是一段简单的代码就是
data={numel(allFiles),5};
for k =1:numel(allFiles)
data{k,1}=csvread(allFiles(k).name,1,0);
[~,name] = fileparts(allFiles(k).name);
dashIdx = strfind(name,'-'); % find location of dashes
usIdx = strfind(name,'_'); % find location of underscores
data{k,2}= str2double(name(dashIdx(1)+1:usIdx(1)-1)); %kvalue
data{k,3}= str2double(name(dashIdx(2)+1:usIdx(2)-1)); %kntvalue
data{k,4}= str2double(name(dashIdx(3)+1:usIdx(3)-1)); %threshold
data{k,5}= str2double(name(dashIdx(4)+1:end)); %percent
...
end
为了提高效率,您可以考虑使用单个矩阵来存储所有数字数据和/或结构(以便您可以按名称而不是索引访问数据)。
答案 2 :(得分:-1)
策略:strsplit()
+ str2num()
。
data={};
for k =1:numel(allFiles)
data{k,1}=csvread(allFiles(k).name,1,0);
words = strsplit( allFiles(k).name(1:(end-4)), '_' );
data{k,2} = str2num(words{1}(2:end));
data{k,3} = str2num(words{2}(4:end));
data{k,4} = str2num(words{3}(10:end));
data{k,5} = str2num(words{4}(8:end));
end