我有一个x = dir('*.TXT')
函数获取的文件名数组:
JFK_1_1.TXT
JFK_12_12.TXT
JFK_123_123.TXT
文件名有2个数字,后跟下划线字符。是否有一个字符串解析函数可以根据_
和.
分隔符来解析数字?
目标是根据文件名中的数字创建一个数组:
A = [1 1; 12 12; 123 123];
答案 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.