MATLAB: разбор чисел из строки - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть массив имен файлов, полученных функцией x = dir('*.TXT'):

JFK_1_1.TXT
JFK_12_12.TXT
JFK_123_123.TXT

Имена файлов имеют 2 числа, которым предшествует символ подчеркивания. Есть ли функция анализа строк, которая может анализировать числа на основе разделителей _ и .?

Цель состоит в том, чтобы создать массив из чисел в именах файлов:

A = [1 1; 12 12; 123 123];

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Если x=dir; и y={x.name}; дают вам эти имена файлов, то:

A = regexp(y,'JFK_(\d*)_(\d*).TXT','tokens'); %general pattern would be: '.*_(\d*)_(\d*).*'

Теперь у вас есть необходимые элементы в A.Остальные оставляют их в нужной форме.

A = [A{:}];
A = str2double(vertcat(A{:}));
0 голосов
/ 11 сентября 2018

Я хотел бы рассмотреть возможность извлечения, разделения и дублирования со строковым типом данных:

function profFunc

    n = 1E4;

    str = {'JFK_1_1.TXT';
           'JFK_12_12.TXT';
           'JFK_123_123.TXT'};

    tic
    for i = 1:n
        A = cellfun(@(x) textscan(x, 'JFK_%d_%d.txt'), str,'UniformOutput', false);
        A = vertcat(A{:});
        A = cell2mat(A);
    end
    toc

    tic
    for i = 1:n
        B = regexp(str,'JFK_(\d*)_(\d*)\.TXT','tokens');
        B = [B{:}];
        B = str2double(vertcat(B{:}));
    end
    toc

    tic
    for i = 1:n
        C = string(str);
        C = extractBetween(C,'_','.');
        C = split(C,'_');
        C = double(C);
    end
    toc

    assert(isequal(A,B,C));
end

>> profFunc
Elapsed time is 1.895104 seconds.
Elapsed time is 1.655958 seconds.
Elapsed time is 0.094432 seconds.
0 голосов
/ 11 сентября 2018

Вы можете использовать textscan.

C = textscan(str, 'JFK_%d_%d.txt')  

Должен дать вам массив ячеек с числами, если вы замените str именем файла.

РЕДАКТИРОВАТЬ: Вы можете сделать это без цикла, если хотите -

l = dir('JFK*.txt');  
C = arrayfun(@(x) textscan(x.name, 'JFK_%d_%d.txt'), l)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...