2015-04-06 68 views
0

我存储的文件名称如下:提取值

>> 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 

回答

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 

为了提高效率,你可以考虑使用一个矩阵来存储所有的数字数据,和/或一个结构(以便您可以通过名称而不是索引来访问数据)。

+0

谢谢!完美的作品。我会考虑你的建议。再次感谢 –

-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 
1

你只需要使用strtok多次标记化(有多种方法可以解决这个问题)。有人在web上的某处有一个方便的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进行转换。

+0

谢谢!好的方法 –

+0

我很抱歉,但第一步的第二部分存在问题。当你使用'。'时为了标记文件名称,您也将浮动数字分成两部分。 – TimeString