Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 在MATLAB中搜索文本文件,以获取开始进程的字符串_String_Matlab_Search - Fatal编程技术网

String 在MATLAB中搜索文本文件,以获取开始进程的字符串

String 在MATLAB中搜索文本文件,以获取开始进程的字符串,string,matlab,search,String,Matlab,Search,我有一个相当大的文本文件,正在尝试搜索一个特定的术语,以便在该点之后开始一个过程,但这似乎对我不起作用: fileID = fopen(resfile,'r'); line = 0; while 1 tline = fgetl(fileID); line = line + 1; if ischar(tline) startRow = strfind(tline, 'OptimetricsResult'); if isfinit

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

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行

有什么建议吗


谢谢

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

另一种方法(在我看来要简单得多)是使用
textscan
一次读取所有行(每个行存储为单独的字符串),然后应用
regexp
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));

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

另一种方法(在我看来要简单得多)是使用
textscan
一次读取所有行(每个行存储为单独的字符串),然后应用
regexp
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));

我无法重现你的问题

您确定在重新运行此脚本之前已正确关闭该文件吗?否则,
fgetl
中的内部行计数器不会重置,因此会得到错误的结果。只需在MATLAB命令提示符下发出一个
fclose all
,并添加一个
fclose(fileID)并再次测试

在任何情况下,我建议将您的无限循环(带有各种陷阱)修改为以下有限循环:

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
中提取行号,您需要进行更多的解析,但我相信这不会有问题

我无法重现你的问题

您确定在重新运行此脚本之前已正确关闭该文件吗?否则,
fgetl
中的内部行计数器不会重置,因此会得到错误的结果。只需在MATLAB命令提示符下发出一个
fclose all
,并添加一个
fclose(fileID)并再次测试

在任何情况下,我建议将您的无限循环(带有各种陷阱)修改为以下有限循环:

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
中提取行号,您需要进行更多的解析,但我相信这不会有问题

+1,虽然通常我在将整个文本文件读入内存时有点厌倦(如果出现279 TB的文本文件怎么办?@RodyOldenhuis,我听到了:),但我一开始不会在MATLAB中解析279 TB(不久前我确实尝试过类似的方法)+1,尽管通常我在将整个文本文件读入内存时有点厌倦(如果出现一个279 TB的文本文件怎么办?@RodyOldenhuis我听到了:)但是我一开始不会在MATLAB中解析279 TB(不久前我确实尝试过类似的方法)如果我可以用另一个+1表示变量名,我会:)如果我可以用另一个+1表示变量名,我会:)