2016-03-05 86 views
0

我有一个字符串单元格。每个元素实际上是一个文件名,根据不同的类别有不同的度量。例如,blahblah.speaker.4.id.55等。我希望能够根据其中一个分隔值对字符串单元格进行分组。例如,我想按发言人号码对单元格进行分组。所以我想结束一个新的单元格数组,其中阵列的每个元素都包含具有相同发言者的文件名的单元格。matlab分组字符串列表

因此,例如:
元件1: 'blah.speaker.4.doobie', 'blah.speaker.4.dada' 元素2: 'blah.speaker.5.derder',“blahblah.speaker5。 dodo'

谢谢。

+0

不要使用电池,使用['structure'(http://mathworks.com/help/matlab/ref/struct.html) – Adriaan

+0

澄清一下,我用一个结构来获取所有最初的文件名称,但我需要根据扬声器分隔符将这些文件名分组。可能会有multipel文件与相同的扬声器。所以我使用names = {filestruct {:}。name}创建了一个文件名的单元格; – user3772547

回答

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')