拆分日志文件行C#

时间:2018-10-27 13:00:30

标签: c# string parsing logging

有问题的日志文件行:

[2018-10-25 19:40:34] [Output] : (CHAT-Type) User: message

那么日期和输出可以按字符数分割吗?

然后我可以从[]中解析日期。

那会留给我

(CHAT-Type) User: message

现在,我想将其分为聊天类型,用户名和消息。

这真的伤害了我的头,在C#中如何做所有这些事情。

基本上我需要像这样出来: 约会时间 聊天类型 用户 信息 所有单独的变量

2 个答案:

答案 0 :(得分:3)

这看起来像RegEx那样的问题:)

这是一个匹配单行(带有命名捕获组)的正则表达式

^\[(?'dateTime'.+)\] \[(?'output'.+)\] : \((?'type'.+)\) (?'user'.+): (?'message'.+)$

Regexr链接以尝试在线https://regexr.com/421p4

由于我在所有区域都使用了.+,所以没有字符限制。它可能会中断(例如,:之前和之后如果没有空间。)但是可以对其进行进一步改进以使其更加灵活。如果您愿意,我可以写一封。

此外,如果您使用的是类似file.ReadAllText()的方法,则需要使用多行标志来匹配所有行。 (Regex.Match(input, pattern, RegexOptions.Multiline)

否则(例如,如果要遍历各行)没关系,因为字符串中没有\n

C#代码

using System.Text.RegularExpressions;
// ...

string pattern = @"^\[(?<dateTime>.+)\] \[(?<output>.+)\] : \((?<type>.+)\) (?<user>.+): (?<message>.+)$";
string message = "[2018-10-25 19:40:34] [Output] : (CHAT-Type) User: message";

var match = Regex.Match(message, pattern);

您可以通过match变量访问匹配项,如下所示:

match.Groups["dateTime"].Value; // "2018-10-25 19:40:34"
match.Groups["user"].Value; // "User"
match.Groups["message"].Value; // "message"

答案 1 :(得分:0)

这是拆分所有值的方式:

string inputValue = "(CHAT-Type) User: message";

            int braceCloseIndex = inputValue.IndexOf(')');
            int colonIndex = inputValue.IndexOf(':');

            string chatType = inputValue.Substring(1, braceCloseIndex - 1).Trim();
            string userName = inputValue.Substring(braceCloseIndex + 1, colonIndex - braceCloseIndex - 1).Trim();
            string message = inputValue.Substring(colonIndex + 1).Trim();

            Console.WriteLine($"chatType: {chatType}, userName: {userName}, msg: {message}");