2015-04-06 60 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