matlab group by delimiter的字符串列表

时间:2016-03-05 23:11:55

标签: string matlab cell grouping delimiter

我有一个字符串单元格。每个元素实际上是一个根据不同类别具有分界符的文件名。例如,blahblah.speaker.4.id.55等。我希望能够根据其中一个分隔值对字符串的单元格进行分组。例如,我想按扬声器编号对单元格进行分组。所以我想最终得到一个新的单元格数组,其中数组的每个元素都包含一个具有相同扬声器的文件名单元格。

所以例如:
要素1:'blah.speaker.4.doobie','blah.speaker.4.dada'要素2:'blah.speaker.5.derder','blahblah.speaker5.dodo'

谢谢。

1 个答案:

答案 0 :(得分:0)

正如@Adriaan所说,最好使用struct来存储此类数据。然后,您可以使用这些结构对其进行分组。以下代码假定您在所有文件名中具有一致数量的部件。

names = {'blahblah.speaker.4.id.55', ...
         'blahblah.speaker.4.id.66', ...
         'blah.listener.3.id.77'};

output = regexp(names, '\.', 'split');
output = cat(1, output{:});

% Fieldnames for each of the "parts"
names = {'blah_part', 'attendee_type', 'some_number', 'id', 'id_number'};

% Now convert it to a struct
data = cell2struct(output.', names);

3x1 struct array with fields:

    blah_part
    attendee_type
    some_number
    id
    id_number

现在让我们快速将id_number转换为实际数字。

id_numbers = num2cell(str2double({data.id_number}));
[data.id_number] = deal(id_numbers{:});

现在我们可以对此进行操作了。

查找第一部分是" blahblah"

的所有情况
inds = strcmp({data.blah_part}, 'blahblah');
data_with_blahblah = data(inds);

    2x1 struct array with fields:

        blah_part
        attendee_type
        some_number
        id
        id_number

您可以为任何字段执行此操作。如果您的字段包含数字(所有您当前的字符串)。你可以做类似的事情。

sub_data = data([data.id_number] == 55);

           blah_part: 'blahblah'
       attendee_type: 'speaker'
         some_number: '4'
                  id: 'id'
           id_number: 55

如果您不反对regular expressions,也可以通过该方式创建structure

data = regexp(names, '(?<blah_part>.*?)\.(?<attendee_type>.*?)\.(?<some_number>\d*)\.(?<id>.*?)\.(?<id_number>\d*)', 'names')