删除具有特定规则的行

时间:2013-08-07 21:32:49

标签: matlab

我有一个20 * 3的单元格数组,我需要删除包含“137”,“2”和“n:T”的行

原始数据:

'T'             ''          ''            
'NP(*)'         ''          ''            
[       137]    ''          ''            
[         2]    ''          ''            
'ARE'           'and'       'NP(FCC_A1#1)'
''              ''          '1:T'         
[      1200]    [0.7052]    ''            
[1.2051e+03]    [0.7076]    ''            
'ARE'           'and'       'NP(FCC_A1#3)'
''              ''          '2:T'         
[      1200]    [0.0673]    ''            
[1.2051e+03]    [0.0671]    ''            
'ARE'           'and'       'NP(M23C6)'   
''              ''          '3:T'         
[      1200]    [0.2275]    ''            
[1.2051e+03]    [0.2253]    ''            
[       137]    ''          ''            
[         2]    ''          ''    

我希望它像

'T'             ''          ''            
'NP(*)'         ''          ''                  
'ARE'           'and'       'NP(FCC_A1#1)'       
[      1200]    [0.7052]    ''            
[1.2051e+03]    [0.7076]    ''            
'ARE'           'and'       'NP(FCC_A1#3)'     
[      1200]    [0.0673]    ''            
[1.2051e+03]    [0.0671]    ''            
'ARE'           'and'       'NP(M23C6)'   
[      1200]    [0.2275]    ''            
[1.2051e+03]    [0.2253]    ''            

我尝试过regexp和strcmp,但效果不好。加上细胞阵列也很难处理。有人可以帮忙吗?

提前谢谢。

3 个答案:

答案 0 :(得分:1)

如果您能以某种方式读取原始数据,以便所有单元格都是字符串或空数组(非数字值),则可以使用strcmpregexprep执行此操作:

% The variable 'data' is a 2D-cell array of strings or empty arrays

datarep = regexprep(data,'^\d+:T','2'); % replace 'n:T' with '2' for convenience
remove1 = strcmp('2',datarep); % this takes care of '2' and 'n:T'
remove2 = strcmp('137',datarep); % this takes care of '137'
rows_keep = find(~sum(remove1|remove2,2)); % rows that will be kept
solution = data(rows_keep,:)

例如,使用此data

'aa'     'bb'       'cc'  
'dd'     'dd'       '2'   
'137'    'dd'       'dd'  
'dd'     'dd'       '11:T'
'1:T'    '1:137'    'dd'  
'dd'     ''             []  

变量solution中的结果是

'aa'    'bb'    'cc'
'dd'    ''        []

答案 1 :(得分:0)

我刚在桌面上尝试了以下代码,似乎可以解决问题。我将a作为您拥有的单元格数组。

L = size(a, 1);
mask = false(L, 1);
for ii = 1:L
    if isnumeric(a{ii, 1}) && (a{ii, 1} == 137 || a{ii, 1} == 2)
        mask(ii) = true;
    elseif ~isempty(a{ii, 3}) && strcmp(a{ii, 3}(end-1:end), ':T')
        mask(ii) = true;
    end
end

b = a(~mask, :)

现在,b应该是您想要的单元格数组。基本上,我创建了一个逻辑掩码,指示满足规则的行的位置,然后使用它的反转来调出行。

答案 2 :(得分:0)

这是另一个简单的选择:

%Anonymous function that checks if a cell is equal to 173 or to 2 or fits the '*:T*' pattern
Eq137or2 = @(x) sum(x == 137 | x == 2) | sum(strfind(num2str(x), ':T') > 1)

%Use the anonymous functions to find the rows you don't want
mask = = sum(cellfun(Eq137or2, a),2)

%Remove the unwanted rows
a(~mask, :)