Если вы просто хотите проверить, присутствует ли строка, и вы не ищете слишком большой файл (в этом контексте 100 МБ не слишком большой, но 1 ГБ приближается), вы можете просто загрузить файл сразу и используйте режим сопоставления регулярных выражений с учетом строки.
set f [open "thefile.report"]
set data [read $f]
close $f
if {[regexp -line {\s+Test is a pass} $data]} {
puts "The test passed"
} else {
puts "The test did not pass"
}
Вам все равно нужно будет тщательно продумать, что на самом деле искать. В частности, если файл содержит цветовые коды ANSI, то ваш тест также должен соответствовать им.
Для больших файлов правильная обработка строки за раз, но тогда вам нужно правильно определить семантику , Для этого проще всего написать вспомогательную процедуру, и try
… finally
… тоже очень помогает:
proc isMatching {filename regular_expression} {
set f [open $filename]
try {
while {[gets $f line] >= 0} {
if {[regexp -- $regular_expression $line]} {
return true
}
}
return false
} finally {
close $f
}
}
if {[isMatching "thefile.report" {\s+Test is a pass}]} {
puts "The test passed"
} else {
puts "The test did not pass"
}
Если у вас есть файлы с одной строкой длиной более 1 ГБ, значит, у вас есть кое-что действительно ужасно. Возможно создать системы обработки, чтобы справиться с этим, но это противно и требует более хитрых методов. Спросите еще раз, не повезло ли вам застрять с этим ...