1

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

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))但我不确定。

4

2 回答 2

3

您正在使用strcmp(),它比较两个字符串的相等性。那不是你所追求的;您想检查某个字符串是否是另一个字符串的子字符串。您可以为此目的使用strfindorfindstrregexpor 。regexprep

另外,您没有关闭文本文件。这可能会导致各种问题。养成一种习惯,总是把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);
于 2013-07-05T14:04:25.813 回答
1

如果性能是一个问题,您可以尝试直接从 Matlab 中调用 Unix 的 sed :

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

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

system('awk ''!/omit/'' text.txt > output.txt');
于 2013-07-05T16:41:41.777 回答