如何从日志文件字符串中删除日期时间

时间:2016-01-11 11:14:58

标签: c# substring

我有一个这样的日志文件:

  

[2016 01 10 11:10:44] Operation3 \ r \ n

     

[2016 01 10 11:10:40] Operation2 \ r \ n

     

[2016 01 10 11:10:36] Operation1 \ r \ n

在那里我执行readAlllines操作,以便在字符串中我有:

[2016 01 10 11:10:44] Operation3 \r\n[2016 01 10 11:10:40] Operation2 \r\n[2016 01 10 11:10:36] Operation1 \r\n

现在我必须删除所有这些时间戳。

作为一个新手,为了安全起见,我将它拆分并在每个项目上搜索start = indexOf(" [")和indexOf("]& #34;)并通过剪切每个删除subString,然后加入所有这些。

我想知道更聪明的方法。

- EDIT-- 好吧,为了贬低我,我没有考虑到一切。 附加限制:

  1. 我无法确定所有线路都有时间戳,所以我必须检查每一条线路是否为" ["开始和"]"在中间
  2. 我甚至无法确定[XXXX]长度,因为我可以[2016 1 01 11:1:4]而不是[2016 01 01 11:01:04]。因此,检查其长度非常重要。
  3. 由于

3 个答案:

答案 0 :(得分:1)

ReadAllLines返回一行数组,因此您无需查找每个项目的开头。如果您的时间戳格式是一致的,您可以修剪字符串的开头。

string[] lines = File.ReadAllLines("log.txt");
foreach (string line in lines) 
{
    string logContents = line.SubString("[XXXX XX XX XX:XX:XX] ".Length);
}

或者将它与linq组合选择一步完成

var logContentsWithoutTimestamps = File.ReadAllLines("log.txt")
    .Select(x => x.SubString("[XXXX XX XX XX:XX:XX] ".Length);

如果没有一致的格式,您需要确定您要查找的内容。我会写一个正则表达式来删除你想要的东西,否则你可能会被你没想到的东西所抓住(例如,你提到某些行可能没有时间戳 - 他们可能在方括号中有其他东西而不是你不想删除。)

示例:

Regex rxTimeStamp = new Regex("^\[\d{4} \d{2} \d{2} \d{1,2}:\d{1,2}:\d{1,2}\]\s*");
string[] lines = File.ReadAllLines("log.txt");
foreach (string line in lines) 
{
    string logContents = rxTimeStamp.Replace(line, String.Empty);
}

// or
var logContentsWithoutTimestamps = File.ReadAllLines("log.txt")
    .Select(x => rxTimeStamp.Replace(x, String.Empty));

你需要根据它是否遗漏任何东西来调整正则表达式,但这超出了这个问题的范围。

答案 1 :(得分:1)

您不需要剪切/粘贴线条,您可以使用string.replace。 这考虑了Environment.NewLine的长度。

[cell.myImageView setImageWithURL:news.urlImage];

答案 2 :(得分:0)

由于您的代码有效并且您搜索了一些不同的方式:

 string result = string.Join(string.Empty, str.Skip(22));

每个项目

说明: 由于每个时间戳长度相等,因此您无需搜索开头或结尾。通常你必须进行长度检查(空行等),但这对于较小的字符串也适用 - 如果大小为<你将只返回一个空字符串。 22.如果您的文件实际上只包含时间戳,则另一种方法。