删除具有指定字符串的行(MatLab)

时间:2013-07-05 13:51:22

标签: matlab

要删除具有指定字符串的行,请阅读

http://www.mathworks.com/matlabcentral/answers/34567-remove-row-with-matching-string

我做了但失败了。

text.txt看起来像

123     A omit B
2323    C omit D
333         oh

我编码了

fid = fopen('text.txt');
tttt = textscan(fid, '%s %s','delimiter','\t','HeaderLines',0)
tttt(strcmp(tttt{2}, 'omit'), :) = []
strcmp(tttt{2}, 'omit')

但MatLab向我展示了“空单元阵列:0乘3”和

ans =

     0
     0
     0

我猜文件“tttt”的类型是错误的(因为我必须写“tttt {2}”而不是tttt(:,2))但是我不确定。

2 个答案:

答案 0 :(得分:3)

您正在使用strcmp(),它会比较两个字符串的相等性。那不是你想要的;你想检查一些字符串是否是另一个字符串的子字符串。您可以使用strfindfindstrregexpregexprep来实现此目的。

另外,您没有关闭文本文件。这可能会导致各种各样的问题。习惯于始终将fid = fopen(...); fclose(fid);写成一个命令,然后继续编码。

一个小例子:

fid = fopen('text.txt');

    tttt = textscan(fid, '%s %s','delimiter','\t');
    tttt{2}(~cellfun('isempty', strfind(tttt{2}, 'omit'))) = [];

fclose(fid);

编辑:根据您的评论,我认为您希望这样做:

fid = fopen('text.txt');

% Modified importcommand
tttt = textscan(fid, '%s%s',...
    'delimiter','\t',....
    'CollectOutput', true);
tttt = tttt{1};

% Find rows for deletion 
inds = ~cellfun('isempty', strfind(tttt(:,2), 'omit'));

% aaaand...kill them!    
tttt(inds,:) = [];


fclose(fid);

答案 1 :(得分:1)

如果需要考虑性能,可以直接在Matlab中尝试invoking Unix's sed

system('sed ''/omit/d'' text.txt > output.txt');

这是类似的命令,在Matlab中调用AWK:

system('awk ''!/omit/'' text.txt > output.txt');