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表示变量名,我会:)