我的路由器支持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
有人可以给我一些提示吗? 我的第一个想法是正则表达式,但我不知道如何在这个规模上做到这一点。
答案 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>
关键是,如果你一次性解决问题,它应该变得更易于解决。