我有一组要从文件中解析的字段,我在 foreach 循环中逐行进行解析,我想知道如何跳过一行并转到下一行
例如:如果遇到一个名为“ABC”的字符串,我需要在下一行抓取一个数字,
一些字符“ABC” 123
问题是我实际上在文件中有很多数字,但我需要获取一个数字,特别是字符串“ABC”之后的换行符之后的数字。
我怎样才能做到这一点 ?
我有一组要从文件中解析的字段,我在 foreach 循环中逐行进行解析,我想知道如何跳过一行并转到下一行
例如:如果遇到一个名为“ABC”的字符串,我需要在下一行抓取一个数字,
一些字符“ABC” 123
问题是我实际上在文件中有很多数字,但我需要获取一个数字,特别是字符串“ABC”之后的换行符之后的数字。
我怎样才能做到这一点 ?
你可以试试这个简单的解决方案
set trigger 0
set fh [open "your_file" "r"]
while {[gets $fh line] != -1} {
if {[regexp -- {"ABC"} $line]} {
incr trigger
continue
}
if {$trigger > 0} {
puts $line ; # or do something else
incr trigger -1
}
}
close $fh
使用循环会更容易一点,一次while
读取一行,因为当您找到触发案例时,您可以轻松地读取额外的一行(假设您没有一行行"ABC"
):
set fd [open $theFilename]
while {[gets $fd line] >= 0} {
if {
[string match *"ABC"* $line]
&& [gets $fd line] >= 0
&& [regexp {\d+} $line -> num]
} then { # I like to use 'then' after a multi-line conditional; it's optional
puts "Found number $num after \"ABC\""
}
}
close $fd
这很尴尬的原因foreach
是它每次通过循环总是会处理相同数量的元素。
foreach
如果您要处理的数据可能会出现上面提到的行数问题,那么奇怪的是,您实际上会更好:
set fd [open $theFilename]
set lines [split [read $fd] \n]
close $fd
foreach line $lines {
incr idx; # Always the index of the *next* line
if {
[string match *"ABC"* $line]
&& [regexp {\d+} [lindex $lines $idx] -> num]
} then {
puts "Found number $num after \"ABC\""
}
}
这是有效的,因为当你lindex
在结尾处做某事时,它会产生空字符串(它不会匹配那个简单的正则表达式)。