解析路由器配置输出

时间:2009-04-25 20:00:37

标签: c# regex stream

我的路由器支持telnet会话来配置我的路由器,我想在c#中创建一个将控制台输出解析为有用的应用程序。

编辑:这些行用“\ n \ r”分隔,并且没有使用\ t字符,一切都是间隔的

实施例

 bridge configuration for "bridge" :
OBC       : dest : Internal
            Connection State: connected   Retry: 10
            Priority Tagging: Disabled
            Port: OBC            PortNr: 0          PortState: forwarding  Interface: up
            Multicast filter: disabled              Dynamic VLAN    : disabled
            IGMP snooping   : enabled
            VLAN: Default VLAN: default  Ingressfiltering: disabled  Acceptvlanonly: disabled
            VLAN: Priority: disabled  IP Prec: disabled  Priority: 0  Regeneration table: 0 1 2 3 4 5 6 7
            RX bytes: 1978767922 frames: 21288686
            TX bytes: 481256491  frames: 16224065     dropframes: 13671

ethport1  : dest : ethif1
            Connection State: connected   Retry: 10
            Priority Tagging: NA (destination switch interface)
            Port: ethport1       PortNr: 1          PortState: forwarding  Interface: up
            Multicast filter: disabled              Dynamic VLAN    : disabled
            IGMP snooping   : enabled
            VLAN: Default VLAN: default  Ingressfiltering: disabled  Acceptvlanonly: disabled
            VLAN: Priority: disabled  IP Prec: disabled  Priority: 0  Regeneration table: 0 1 2 3 4 5 6 7
            RX bytes: 44045      frames: 0
            TX bytes: 12618      frames: 0            dropframes: 0

有人可以给我一些提示吗? 我的第一个想法是正则表达式,但我不知道如何在这个规模上做到这一点。

1 个答案:

答案 0 :(得分:2)

“变成有用的东西”对我来说意味着你的第一步是创建代表你的数据的类,结构和枚举:

public class RouterEntry
{
    public ConnectionState ConnectionState { get; }
    public int Retry { get; }
    ...
    public long BytesTX { get; }
}

然后,开始考虑如何解析结果字符串。我可能会写一个Deserialize(StringReader)方法(或沿着这些方向的东西),以便您的对象逐行解析数据。

您还可以将string.Split与SplitOptions重载一起使用,以帮助您忽略任何空格。

例如,如果您使用

Port: OBC            PortNr: 0        PortState: forwarding  Interface: up

作为输入行,

char[] delims = new char[] { ':', ' ' };

作为你的分隔符,然后像这样称呼它

string[] tokens = line.Split(delims, StringSplitOptions.RemoveEmptyEntries);

会导致tokens包含

[Port, OBC, PortNr, 0, PortState, forwarding, Interface, up]

对于键具有多个“值”的行(例如Regeneration table: 0 1 2 3...,您只需要考虑这些值中的每一个将是标记数组中的单独字符串的事实。)< / p>

关键是,如果你一次性解决问题,它应该变得更易于解决。