如何在foreach循环中插入换行符和抓取数据

时间:2012-11-22 04:12:55

标签: tcl

我有一组要从文件解析的字段,我在foreach循环中逐行进行,我想知道如何跳过一行并转到下一行

例如:如果遇到名为“ABC”的字符串,我需要在下一行中获取一个数字,

some characters "ABC" 
123

问题是我实际上在文件中有很多数字,但我需要获取一个数字,特别是在字符串“ABC”之后换行后的数字。

我该怎么办? ?

2 个答案:

答案 0 :(得分:2)

您可以尝试这个简单的解决方案

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

答案 1 :(得分:2)

使用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时,它会产生空字符串(它不会与那个简单的正则表达式匹配)。