2016-03-05 5 views
0

У меня есть ячейка строк. Каждый элемент на самом деле является именем файла, имеющим разделители в соответствии с различными категориями. Например, blahblah.speaker.4.id.55 и т. Д. Я хочу иметь возможность группировать ячейку строк в соответствии с одним из разделимых значений. Например, я хотел бы сгруппировать ячейку по номеру динамика. Поэтому я хотел бы получить новый массив ячеек, в котором каждый элемент массива содержит ячейку имен файлов, имеющих один и тот же динамик.matlab group список строк по разделителю

Так, например:
элемент 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

уточнить, я использовал, чтобы получить-структуру всех сначала имена файлов, но мне нужно сгруппировать эти имена файлов в соответствии с разделителем динамиков. могут быть многострочные файлы с одним и тем же динамиком. поэтому я создал ячейку имен файлов, используя имена = {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') 
Смежные вопросы