TCL文件解析(找到模式后循环读取后续行)?
下面是我将使用TCL读取的文件中重复多次的序列TCL文件解析(找到模式后循环读取后续行)?,tcl,file-pointer,Tcl,File Pointer,下面是我将使用TCL读取的文件中重复多次的序列 Startpoint: FF1 (rising edge-triggered flip-flop clocked by Clk) Endpoint: FF2 (rising edge-triggered flip-flop clocked by Clk) Path Group: Clk Path Type: max Point Incr Path ------
Startpoint: FF1 (rising edge-triggered flip-flop clocked by Clk)
Endpoint: FF2 (rising edge-triggered flip-flop clocked by Clk)
Path Group: Clk
Path Type: max
Point Incr Path
-----------------------------------------------------------
clock Clk (rise edge) 0.00 0.00
clock network delay (propagated) 1.10 * 1.10
FF1/CLK (fdef1a15) 0.00 1.10 r
FF1/Q (fdef1a15) 0.50 * 1.60 r
U2/Y (buf1a27) 0.11 * 1.71 r
U3/Y (buf1a27) 0.11 * 1.82 r
FF2/D (fdef1a15) 0.05 * 1.87 r
data arrival time 1.87
clock Clk (rise edge) 4.00 4.00
clock network delay (propagated) 1.00 * 5.00
FF2/CLK (fdef1a15) 5.00 r
library setup time -0.21 * 4.79
data required time 4.79
------------------------------------------------------------
data required time 4.79
data arrival time -1.87
------------------------------------------------------------
slack (MET) 2.92
起点由起点表示,终点由松弛表示
我正在寻找一种方法来编写一个循环,它将读取第一行起始点
然后文件指针指向后面的行,我读取它们并对它们进行后处理
一旦遇到松弛线,循环将转到文件中的下一个起始点,并重复相同的操作
只有找到startpoint line,我才能进一步进行所有处理
一旦遇到Startpoint行,就很难找到文件指针移动到下一行的方法。同样,当遇到松弛线时,文件指针应该移到下一个起始点行
我是TCL的新手,正在尝试想象这将如何工作
我想要实现的Python等价物是:
用指针fp打开文件进行读取
for line in fp:
if startpoint found
for next_line_in_file in fp:
do post processing until slack line found and then continue from outer for loop
一般的模式是:
while {[gets $channel line] >= 0} {
# Skip lines until the start point
if {![string match "Startpoint: *" $line]} continue
set lines [list $line]
# Accumulate lines until we have a whole section
while {[gets $channel line] >= 0} {
lappend lines $line
if {[string match "slack *" $line]} break
}
# You'll need to provide a command — most likely a procedure — for this...
postProcess $lines
}
伪代码的主要变化是,这会立即将一整列行(表示从
起始点:
到松弛
,包括在内)输入到后处理命令中。凭借丰富的经验,这类事情使得复杂的分块数据流处理变得更加容易,而不是试图单独处理每一行(使用复杂的状态机等;这是可能的,但相当困难且非常容易出错)。一般模式如下:
while {[gets $channel line] >= 0} {
# Skip lines until the start point
if {![string match "Startpoint: *" $line]} continue
set lines [list $line]
# Accumulate lines until we have a whole section
while {[gets $channel line] >= 0} {
lappend lines $line
if {[string match "slack *" $line]} break
}
# You'll need to provide a command — most likely a procedure — for this...
postProcess $lines
}
伪代码的主要变化是,这会立即将一整列行(表示从
起始点:
到松弛
,包括在内)输入到后处理命令中。凭借丰富的经验,这使得复杂的数据流处理变得更加容易,而不是试图单独处理每一行(使用复杂的状态机等;这是可能的,但相当困难,而且非常容易出错)。我不确定您在这里要问什么,但是你可以让它以与你那里的python伪代码相同的方式工作。我不确定你在这里要求什么,但是你可以让它以与你那里的python伪代码相同的方式工作。FWIW,如果你用python编写代码,我仍然建议你使用这个算法;当你知道你一次只处理一个完整的数据块时,一切都变得容易多了。第二个[get]
忽略了结束括号。@Calvin Oops先生!FixedFWIW,如果您是用Python编写代码,我仍然建议您使用此算法;当你知道你一次只处理一个完整的数据块时,一切都变得容易多了。第二个[get]
忽略了结束括号。@Calvin Oops先生!固定的