1

我有一个相当大的文本文件,并且正在尝试搜索特定术语,以便在那之后我可以开始一个过程,但这似乎对我不起作用:

fileID = fopen(resfile,'r');


line  = 0;
    while 1
    tline = fgetl(fileID);
    line = line + 1;
    if ischar(tline)
        startRow = strfind(tline, 'OptimetricsResult');
        if isfinite(startRow) == 1;
            break
        end
    end
end

我得到的答案是 9,但我的文本文件:

$begin '$base_index$'
$begin 'properties'
all_levels=000000000000
time(year=000000002013, month=000000000006, day=000000000020, hour=000000000008, min=000000000033, sec=000000000033)
version=000000000000
$end 'properties'
$begin '$base_index$'
$index$(pos=000000492036, lin=000000009689, lvl=000000000000)
$end '$base_index$'

前9行肯定没有?

如果我 ctrl+F 文件,我知道 OptimetricsResult 只出现一次,并且它是 6792 行

有什么建议么?

谢谢

4

2 回答 2

9

我认为您的脚本以某种方式起作用,而您只是查看了错误的变量。我假设你得到的答案是startRow = 9而不是line = 9。检查变量line。顺便说一句,请注意您没有检查文件结尾,因此您的while循环可能会无限期地运行该文件不包含您的搜索字符串。

另一种方法(在我看来要简单得多)是一次读取所有行(每行存储为单独的字符串)textscan,然后应用regexpor strfind

%// Read lines from input file
fid = fopen(filename, 'r');
C = textscan(fid, '%s', 'Delimiter', '\n');
fclose(fid);

%// Search a specific string and find all rows containing matches
C = strfind(C{1}, 'OptimetricsResult');
rows = find(~cellfun('isempty', C));
于 2013-06-20T09:11:12.623 回答
2

我无法重现您的问题。

您确定在重新运行此脚本之前已正确关闭文件吗?如果没有,内部线路计数器fgetl不会被重置,因此您会得到错误的结果。fclose all只需在 MATLAB 命令提示符下发出 a ,并fclose(fileID);在循环后添加 a ,然后再次测试。

无论如何,我建议将您的无限循环(有各种陷阱)修改为以下有限循环:

haystack = fopen(resfile,'r');
needle   = 'OptimetricsResult';

line  = 0;
found = false;
while ~feof(haystack)

    tline = fgetl(haystack);
    line = line + 1;

    if ischar(tline) && ~isempty(strfind(tline, needle))
        found = true;
        break;
    end

end

if ~found
    line = NaN; end

fclose(fileID);


line

当然,您也可以将搜索留给更专业的工具,这些工具随大多数操作系统免费提供:

haystack = 'resfile.txt';
needle   = 'OptimetricsResult';

if ispc % Windows
    [~,lines] = system(['find /n "' needle '" ' haystack]);
elseif isunix % Mac, Linux
    [~,lines] = system(['grep -n "' needle '" ' haystack]);
else 
    error('Unknown operating system!');
end

您必须做更多的解析才能从中提取行号C,但我相信这不会有问题。

于 2013-06-20T09:37:44.650 回答