MATLAB:从字符串中解析数字

时间:2018-09-11 04:32:59

标签: matlab parsing

我有一个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 :(得分:4)

如果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{:}));

答案 1 :(得分:3)

您可以使用user guide here

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

如果将str替换为文件名,则应为您提供带有数字的单元格数组。

编辑: 如果愿意,您可以不使用for循环-

l = dir('JFK*.txt');  
C = arrayfun(@(x) textscan(x.name, 'JFK_%d_%d.txt'), l)

答案 2 :(得分:2)

我会考虑对字符串数据类型使用extractBetween,split和double:

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.