【问题标题】:Parse router configuration output解析路由器配置输出
【发布时间】:2009-04-25 20:00:37
【问题描述】:

我的路由器支持 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

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

【问题讨论】:

  • 如果我们知道您是否需要这些信息的全部或部分信息,将会有所帮助。
  • 同一行中的项目之间的分隔符是什么——制表符、多个空格、一个或多个空格?
  • 大多数脚本语言都附有简单的解析器;看看 Perl、Python 和 PHP 甚至可以找到一些。或者如果你想用 C 语言来做,也许是 flex-bison 组合?

标签: c# regex stream


【解决方案1】:

“进入有用的东西”对我来说意味着您的第一步是创建代表您的数据的类、结构和枚举:

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...,您只需考虑每个值将是令牌数组中的单独字符串这一事实。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2018-02-28
    相关资源
    最近更新 更多