1

我有一个半结构化文本文件,我想从中提取值并将它们保存以备后用。该文件包含一些模拟环境的配置数据,即 env。由不同的子系统组成,对于这些子系统之一,我想找到它们的数量,以及它们的具体类型。这就是文件的结构

<Begin_Subsystem_Configuration>
Subsystem_Name:"PLC1_ARR":
Subsystem_Identifier:0x01B1B000:
Subsystem_Type:PLC_BERGHOF:
IP_Address:"10.70.9.11":
Port_Numbers:3500:3500:
Alive_Message_Period:10:
Max_Communication_Latency:5:
Switch_Over_Timeout:15:
Member_Count:6:
Subsystem_Member_1:77:77:       # PS SR1
Subsystem_Member_2:106:106:     # SZ PTHA
Subsystem_Member_3:110:110:     # SZ PTH1
Subsystem_Member_4:310:310:     # SZ YL1
Subsystem_Member_5:311:311:     # SZ DOOR1
Subsystem_Member_6:312:312:     # SZ FIRE1
<End_Subsystem_Configuration>

现在我想知道,模式 PLC_BERGHOF 多久在文件中出现一次,我实际上已经可以这样做了,但是现在如果找到它,我想保存在某种 assoc 中。数组之前行的键值对,以及找到模式的行之后的 3 行。

稍后在我的脚本中,我希望能够访问这样的值:设置 plc1_IP_Address 数组 ['plc1_IP_Address'],访问的确切 sysntax 并不重要,代码只需进入 Tcl 脚本

谢谢您的帮助

4

2 回答 2

3

如果您使用的是 Tcl 8.5,那么我建议您逐行阅读文件,构建一组dict对象以将每个子系统保存为 name:item 对的集合。然后,您可以创建一个此类 dicts 的列表来表示整个文件或对您有意义的任何内容。然后是这样的:

foreach config $list_of_dicts {
    if {[dict get $config Subsystem_Type] eq "PLC_BERGHOF"} {
        puts "[dict get $config IP_Address]\n[dict get $config Port_Numbers]"
    }
}

虽然从你描述的声音来看:grep -A 3 PLC_BERGHOF就足够了。

如果不使用 8.5,那么您没有,dict但可以以几乎相同的方式管理名称项对的列表。您最终只是使用lsearch更多或将对列表转换为数组只是为了查找。

于 2012-08-14T12:05:58.977 回答
0
set fh [open "file.data" r]
array set data []
while {[gets $fh line] != -1} {
    switch -exact -- $line {
        "<Begin_Subsystem_Configuration>" -
        "<End_Subsystem_Configuration>"   {continue}
        default {
            set fields [split $line ":"]
            set values [list]
            foreach value [lrange $fields 1 end-1] {
                if {[string match {"*"} $value]} {
                    lappend values [string range $value 1 end-1]
                } else {
                    lappend values $value 
                }
            }
            set data([lindex $fields 0]) $values
        }
    }
}
close $fh

然后你可以使用

if {$data(Subsystem_Type eq "PLC_BERGHOF"} {
    puts "IP address is: $data(IP_Address)"
}

我假设您的文件实际上格式如下,并且您无法正确格式化您的问题:

<Begin_Subsystem_Configuration>
Subsystem_Name:"PLC1_ARR":
...
<End_Subsystem_Configuration>
于 2012-08-14T17:36:11.433 回答