从字符串单元格数组的所有元素中删除后缀

时间:2014-07-03 19:09:40

标签: matlab

我有一个包含字符串的单元格数组,名为old_array。每个元素都以后缀' .dat'结尾。我想创建一个名为new_array的新单元格数组,它具有相同的元素,但没有这个后缀。

我知道存在以下功能:

[new_array] = arrayfun(func, old_array)

但是我对func使用了什么?我考虑使用strsplit(str, '.')并获取此数组的第一个元素,如:

[new_array] = arrayfun(strsplit(*, '.')[0], old_array)

但是我应该放置什么而不是*?什么是最好的解决方案?

1 个答案:

答案 0 :(得分:1)

如果数组中的每个元素以.dat结尾,为什么不简单地提取单元格数组中每个字符串的最后4个字符以外的所有字符?< / p>

new_array = cellfun(@(x) x(1:end-4), old_array, 'UniformOutput', false);

这应该返回一个存储在new_array中的新单元格数组,其中每个元素从单元格数组old_array中丢失每个字符串的最后4个字符,这是每个字符串的字符串.datold_array


但是,如果您想要使其更加强大,并且如果您想要容纳任何文件名,则可以使用strsplit,就像您在帖子中所拥有的那样。你必须像这样构造它:

%// Use to split up the strings for each cell and store in individual cells
new_array_temp = cellfun(@(x) strsplit(x, '.'), old_array, 'UniformOutput', false);
%// Extract the first cell of each nested cell
new_array = cellfun(@(x) x{1}, new_array_temp, 'UniformOutput', false);

我们需要做第一步,以便我们可以返回一个单元格的单元格。较大的单元格数组中的每个嵌套单元格将包含由嵌套单元格元素中的.分隔的字符串。然后运行下一个命令,以便我们提取每个嵌套单元格的第一个字符串,这是.之前的文件名。

以下是一个示例,向您展示如何运行此示例以及中间输出:

old_array = {'Hi.dat', 'how.dat', 'are.dat', 'you.dat'};

new_array_temp = cellfun(@(x) strsplit(x, '.'), old_array, 'UniformOutput', false);
celldisp(new_array_temp);

new_array_temp{1}{1} =

Hi


new_array_temp{1}{2} =

dat


new_array_temp{2}{1} =

how


new_array_temp{2}{2} =

dat


new_array_temp{3}{1} =

are


new_array_temp{3}{2} =

dat


new_array_temp{4}{1} =

you


new_array_temp{4}{2} =

dat

new_array = cellfun(@(x) x{1}, new_array_temp, 'UniformOutput', false);
disp(new_array);

 'Hi'    'how'    'are'    'you'

次要说明

注意:strsplit仅适用于MATLAB R2013a及更高版本。如果您希望这与以前版本的MATLAB一起使用,请使用regexp。用以下内容替换strsplit内的cellfun来电:

new_array_temp = cellfun(@(x) regexp(x, '\.', 'split'), 'UniformOutput', false);

这基本上应该与strsplit达到同样的效果。但是,如果您真的,真的,真的,真的想要使用strsplit,那么MathWorks文件交换中就会有一个实现:http://www.mathworks.com/matlabcentral/fileexchange/21710-string-toolkits/content/strings/strsplit.m