使用多个分隔符类型将文本文件解析为字段

时间:2011-02-17 02:52:48

标签: c# parsing file-io

我正在尝试使用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

消息

如果它可以通过标准分隔符(如空格,制表符或逗号)分隔,那么它将非常简单,但我对如何攻击它感到茫然。


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

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());
}

好的,设法使用上面的代码解决它。

2 个答案:

答案 0 :(得分:5)

你知道这句古老的谚语“有些人在面对问题时会想到”我知道,我会使用正则表达式。“现在他们有两个问题。”

嗯,在这种情况下,你确实需要正则表达式。

在这种情况下,这个应该涵盖你:

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

你应该真的测试它。我只是把它扔在一起,它可能没有处理你能看到的一切。

答案 1 :(得分:2)

试试这个:

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

它使用了消息在方括号[]中的事实 名称介于[]和 - &gt;之间 房间名称介于 - &gt;之间并且: 并且消息就是事后的一切。 :)