【问题标题】:Parsing a text file into fields using multiple delimiter types使用多种分隔符类型将文本文件解析为字段
【发布时间】:2011-02-17 02:52:48
【问题描述】:

我正在尝试使用 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 类型加入

消息类型

用户名

房间名称

消息

如果它可以通过空格、制表符或逗号等标准分隔符分隔,那将相当简单,但我不知道如何攻击它。


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

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

我得到了预期的 5 个元素(前后各一个为空)。我该如何纠正这个问题?

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

好的,用上面的代码解决了。

【问题讨论】:

    标签: c# parsing file-io


    【解决方案1】:

    你知道那句古老的格言:“有些人在遇到问题时,会想“我知道,我会使用正则表达式。”现在他们有两个问题。”?

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

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

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

    你应该真的测试它。我只是把它放在一起,它可能无法处理你能看到的所有内容。

    【讨论】:

    • 我认为正则表达式会是答案,这只是一个我没有经验的领域。我会尝试并报告。
    • 如果你想花一些时间学习和实验,看看这个:gskinner.com/RegExr 有更好的工具,但我不知道你使用什么操作系统。另外,我建议您查看正则表达式中的“组”是什么,因为上面的表达式使用了它们,您需要了解它是如何使用它的。
    • +1 的格言 :),我在这个板上看到了不需要正则表达式的正则表达式问题的票价份额。
    【解决方案2】:

    试试这个:

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

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

    【讨论】:

    • 我喜欢你的。由于这个原因,它更易于理解/解释,并且可能更强大。
    • @Oren,谢谢。我尽量保持简单(因为我不知道你刚刚使用的所有命令嘿嘿)
    • 我最近开始使用一堆可视化工具(mac 上的 regexhibit),它让我对许多我不知道的巧妙技巧敞开了心扉。不过,简单几乎总是更好。
    • 啊,太糟糕了,我在 Windows 上,并且与在线正则表达式匹配有关。很多时候我给出简单的.* 答案,但人们似乎喜欢更有表现力的答案。我刚刚意识到如果名字中有连字符,那么你的比赛可能不会在名字中出现。根据给出的唯一示例,您的房间名称也提出了具体要求。好处是你会收到格式错误的消息。
    • 根据gskinner.com/RegExr,这个模式有问题。如果消息字段(最后一组)在其中包含一个 : ,则正则表达式会跳过第一个 : 而将 -> 之后的所有内容存储到第四组,直到消息中的最后一个 : ,将之后的所有内容存储到第五组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2010-12-15
    • 2019-07-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多