2011-02-17 87 views
3

我试图解析登录使用C#从聊天的文件,我跑入的问题是,它不是真正的设计解析,因为它没有使用标准的分隔符。下面是从文件中的典型行的一个示例:解析文本文件到字段中使用多个分隔符类型

2010-08-09 02:07:54 [Message] Skylar Morris -> (ATL)City Waterfront: I'll be right back 
date time messageType userName -> roomName: message 

我想存储的字段有: 日期和时间加入为DateTime类型

为messageType

的userName

roomName

message

如果是可分离的像空格,制表符,或逗号分隔符的标准将是相当简单的,但我就如何攻击这个损失。


作为后续行动,使用此代码作为模板:

List<String> fileContents = new List<String>(); 
string input = @"2010-08-09 02:07:54 [Message] Skylar Morris -> (ATL)City Waterfront: I'll be right back"; 
string pattern = @"(.*)\[(.*)\](.*)->(.+?):(.*)"; 

foreach (string result in Regex.Split(input, pattern)) 
{ 
    fileContents.Add(result.Trim()); 
} 

我得到7个要素预计5(前,后一个为空)。我该如何纠正这一点?

foreach (string result in Regex.Split(input, pattern) 
     **.Where(result => !string.IsNullOrEmpty(result))**) 
{ 
    fileContents.Add(result.Trim()); 
} 

好吧,设法解决它与上述代码。

回答

5

你知道,关于“有些人,当遇到一个问题,认为‘一句古老的格言,我知道,我将使用正则表达式。’现在他们有两个问题。”?

好,在这种情况下,你真的需要正则表达式。

这应该包括你在这种情况下:

([\d]{4}-[\d]{2}-[\d]{2} [\d]{2}:[\d]{2}:[\d]{2}) \[([\w]+)\] ([a-zA-Z0-9 ]+) -> (\([\w]+\)[a-zA-Z0-9 ]+): (.*) 

你应该测试它虽然。我只是把它扔在一起,它可能无法处理你能看到的所有东西。

+0

我认为正则表达式会是答案,它只是一个我没有经验的领域。我会尝试并回报。 – Chris 2011-02-17 03:05:34

+0

如果你想花一些时间来学习和实验,检查了这一点:http://gskinner.com/RegExr/有更好的工具,但我不知道你使用什么操作系统。另外,我建议你查看正规表达式中的“组”,因为上面的表达式使用它们,你需要看看它是如何工作的。 – 2011-02-17 03:08:53

2

试试这个:

.*\[(.*)\](.*)->(.+?):(.*) 

它使用的事实,消息是在方括号[] 名介于[]和 - > 室名称之间 - >和: 和消息是一切之后。 :)

相关问题