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

本文关键字:删除 日期 时间 字符串 文件 日志 | 更新日期: 2023-09-27 18:29:51

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

[2016 01 10 11:10:44]操作3''r''n

[2016 01 10 11:10:40]操作2''r''n

[2016 01 10 11:10:36]操作1''r''n

在上面,我执行readAlllines操作,这样在字符串中我就有:

[2016 01 10 11:10:44]操作3''r''n[2016 01 11 11:10:40]操作2''r''n 2016 01 10 11:10:36]操作1''r''n

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

作为一个新手,为了安全起见,我会把它分开,在每个项目上搜索start=indexOf("[")和indexOf。

我想知道一个更聪明的方法。

--编辑--好吧,我没有考虑所有的事情。附加约束:

  1. 我不能确定所有行都有时间戳的事实,所以我必须检查每行是否有"时间戳";["开始"和a"]";在中间
  2. 我甚至不能确定[XXXX]的长度,因为我可以用[2016 1 1 11:1:4]而不是[2016 01 01 11:01:04]。所以检查它的长度很重要

感谢

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

您不需要剪切/粘贴行,可以使用字符串替换。这考虑了Environment.NewLine.的长度

 while(true)
 {
  int start; 
  if (lines.Substring(0,1) == "[")
    start = 0;
  else
    start = lines.IndexOf(Environment.NewLine + "[") + Environment.NewLine.Length;
  int end = lines.IndexOf("] ");
  if (start == -1 || end == -1)
    break;
  string subString = lines.Substring(start, end + 2 - start);
  lines = lines.Replace(subString, "");
 }
ReadAllLines返回一个行数组,因此不需要查找每个项的开头。如果您的时间戳格式是一致的,您可以修剪字符串的开头。
string[] lines = File.ReadAllLines("log.txt");
foreach (string line in lines) 
{
    string logContents = line.SubString("[XXXX XX XX XX:XX:XX] ".Length);
}

或者将其与linq Select结合起来,一步完成

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

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

由于您的代码可以工作,并且您可以搜索一些不同的方式:

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

对于每个项目

说明:由于每个时间戳的长度相等,所以不需要搜索开始或结束。通常情况下,您必须进行长度检查(空行等),但这甚至适用于较小的字符串-如果大小为<22.如果你的文件真的只包含时间戳,那就另选一种方式。