从文件名中提取值

时间:2015-04-06 17:50:46

标签: matlab

我的文件名存储如下:

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

3 个答案:

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