如何使用tcl读取文件的每个部分?

如何使用tcl读取文件的每个部分?,tcl,Tcl,我刚刚开始学习tcl,我在阅读大文件时遇到了问题。 我有一个如下所示的数据文件: 420 360 360 360 3434.01913 P 6.9022 0.781399 -0.86106 C 4.36397 -0.627479 3.83363 P 6.90481 5.42772 3.08491 .... 结果是这样的: P -7.21325 1.71285 -0.127325 C -4.14243 0.41123 4.67585 420 360 360 360 3210.69667 whi

我刚刚开始学习tcl,我在阅读大文件时遇到了问题。 我有一个如下所示的数据文件:

420
360 360 360 3434.01913
P 6.9022 0.781399 -0.86106
C 4.36397 -0.627479 3.83363
P 6.90481 5.42772 3.08491
....
结果是这样的:

P -7.21325 1.71285 -0.127325
C -4.14243 0.41123 4.67585
420
360 360 360 3210.69667
while { ...condition... } {
    if {[gets $fp line] < 0} break

    lassign $line name x y z
    if {$name eq "420"} {
        incr section_counter
    } elseif {$name in {P C}} {
        # do something with the data
    }
}
所以C是一个部分的最后一行,420是下一个部分的开始。所以每420行构成整个文件的一个部分。 我怎样才能阅读这个文件的每一部分,让它像说“frame1”一样,一直读到文件的末尾(有frame2、frame3和…)。
我想出了一个简单的脚本,只是为了逐行阅读整个文件,但我不知道如何做到这一点。谢谢你的问题“如何使用tcl阅读文件的每一部分?”的答案很简单:“继续阅读,直到你的行数用完”

“如何计算节数和跳过标题行”问题的答案如下:

P -7.21325 1.71285 -0.127325
C -4.14243 0.41123 4.67585
420
360 360 360 3210.69667
while { ...condition... } {
    if {[gets $fp line] < 0} break

    lassign $line name x y z
    if {$name eq "420"} {
        incr section_counter
    } elseif {$name in {P C}} {
        # do something with the data
    }
}
而{…条件…}{
如果{[get$fp line]<0}中断
lassign$行名称x y z
如果{$name eq“420”}{
增量段计数器
}elseif{{P C}}中的$name{
#对数据做点什么
}
}
while
循环的条件将针对每一行读取测试一次。读取整个文件后,第一个
if
命令中断循环。您不需要拆分所读的行,除非您希望其中一行包含的字符串不是正确的列表。将行的字段分配到变量中后,可以查看
name
中的行类型。第二个
if
命令表示,如果
$name
是字符串“420”,则节计数器增加。另一方面,如果
$name
包含“P”或“C”,则需要处理数据行。如果这两个条件都未满足,则在“420”行之后有一行,该行将被忽略


文档:,,,

向我们展示您解决问题的尝试。好的。这就是我提出的。proc read_xyz_frame{fp n_bp}{set I 0而{$I<[expr$n_bp*4]}{if{[get$fp line]>0}{set fields[split$line”“]lassign$fields name x y z然后我使用get$fp line并将其传递给set n_atoms$line1。我主要想做的是完成,但现在我的问题是每个部分开头的两个标题行。因此我想跳过它们(我不知道正确的术语,如果没有意义,很抱歉)然后开始读取文件的另一帧或部分。