1

半構造化テキスト ファイルを取得しました。このファイルから値を抽出し、後で使用できるように保存します。このファイルには、シミュレーション環境である env の設定データが含まれています。はさまざまなサブシステムで構成されています。これらのサブシステムの 1 つについて、それらの数と特定のタイプを見つけたいと考えています。ファイルの構成はこんな感じ

<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 がファイル内でどのくらいの頻度で発生するかを知りたいのですが、実際にはすでにそれを行うことができますが、見つかった場合は、何らかの関連ファイルに保存したいと思います。前の行と、パターンが見つかった行の 3 行後のキーと値のペアを配列します。

スクリプトの後半で、次のような値にアクセスできるようにしたいと考えています。

助けてくれてありがとう

4

2 に答える 2

3

Tcl 8.5 を使用している場合は、ファイルを 1 行ずつ読んで、一連のdictオブジェクトを作成し、各サブシステムを name:item ペアのコレクションとして保持することをお勧めします。次に、そのような辞書のリストを作成して、ファイル全体または意味のあるものを表すことができます。次に、次のようなもの:

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 に答える