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

Вам просто нужно tokenize использовать 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 для преобразования.

+0

Спасибо! Хороший подход –

+0

Извините, но есть проблема во второй части первого шага. Когда вы используете '.' чтобы токенизировать имя файла, вы также делите плавающее число на две части. – TimeString

Смежные вопросы