首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Tcl解析结构化文件并选取一些值?

使用Tcl解析结构化文件并选取一些值?
EN

Stack Overflow用户
提问于 2012-08-14 19:50:59
回答 2查看 848关注 0票数 1

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

代码语言:javascript
复制
<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中。数组前一行的键值对,以及在patter找到的行之后的3行。

在稍后的脚本中,我希望能够像这样访问这些值:设置plc1_IP_Address数组‘plc1_IP_Address’,访问的确切sysntax实际上并不重要,代码只需进入Tcl脚本即可

谢谢你的帮助

EN

回答 2

Stack Overflow用户

发布于 2012-08-14 20:05:59

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

代码语言:javascript
复制
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 more或将对列表转换为数组来查找内容。

票数 3
EN

Stack Overflow用户

发布于 2012-08-15 01:36:11

代码语言:javascript
复制
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

然后你就可以使用

代码语言:javascript
复制
if {$data(Subsystem_Type eq "PLC_BERGHOF"} {
    puts "IP address is: $data(IP_Address)"
}

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

代码语言:javascript
复制
<Begin_Subsystem_Configuration>
Subsystem_Name:"PLC1_ARR":
...
<End_Subsystem_Configuration>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11951670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档