1

我正在读取多个日志文件并将这些行附加到一个StringBuilder对象。但是,有些行有时髦的字符,这会导致 StringBuilder 静默失败。我相信它会附加最后一行(带有违规字符),但之后根本不会附加任何行。没有抛出异常......要么我错误地使用 StringBuilder 要么这是一个错误。

我在操作结束时在文本框中显示 StringBuilder 的内容。这是我当前输出的末尾(是的,它已经过消毒......):

[2556 0903 141433250 ram] 8 GB of RAM
[2556 0903 141433250 cpu] wicked fast CPU!
[2556 0903 141433640 xyz] a�b��������k'�

在最后一个日志行之后应该有更多的输出。当我在 Visual Studio 中逐行调试此行时,当我到达Append()最后一个日志之后的行时,什么也没有发生 - 它被命中但字符串没有被修改(它甚至不会像变量一样在 Locals 窗口中变成红色当它们的值发生变化时)。非常奇怪的行为!

以下是我的代码的相关部分。您会看到我有两个 StringBuilder 对象:一个构建数据库字符串,我从中提取元数据 ( odbcResultsRaw),另一个使用元数据构建实际内容以查找适当的日志文件 ( odbcResultsNice)。fileReaders是自定义 StreamReaders 的字典:

OdbcDataReader dbReader = com.ExecuteReader();
while (dbReader.Read())
{
   string fileName = dbReader[1].ToString(); // source file
   int fileLineNum = int.Parse(dbReader[2].ToString());  // line number in source file

   // grab the appropriate StreamReader, not important...
   CustomStreamReader fileReader = fileReaders[fileName];
   string line = String.Empty;

   // navigate to the correct line, not important...
   while (fileReaders[fileName].currentLineNum < fileLineNum)
   {
      // read in line from log file; where the magic happens
      line = fileReaders[fileName].ReadLine();
      fileReaders[fileName].currentLineNum++;
   }
   odbcResultsRaw.AppendLine(fileName + ", " + fileLineNum.ToString());
   odbcResultsNice.AppendLine(line);
}

odbcResultsRaw 始终有效;那是微不足道的。但是 odbcResultsNice 会像上面描述的那样死掉。最后,我可能有 7,000 行用于 odbcResultsRaw,但只有几百行用于 odbcResultsNice - 这表明代码确实会继续运行,至少。

我相信我有两个选择:“修复” StringBuilder(或了解我是否以非预期的方式使用它)或弄清楚如何忽略违规行。想知道你的想法和建议。

注意:我不知道何时会遇到包含这些字符的文件或行。我不确定它们是不同的编码还是只是随机垃圾。

4

1 回答 1

0

感谢 Hans Passant 为我指明了正确的方向。我已经通过在while语句之后添加它来修复代码(在http://www.csharp411.com/cleanstripremove-binary-characters-from-c-string/上找到):

foreach (char c in line)
{
   odbcResultsNice.Append(Char.IsControl(c) ? ' ' : c);  // replace bad char with space
}

最后一行被改变只是为了添加一个换行符:

odbcResultsNice.AppendLine();

我的输出现在看起来像这样:

[2556 0903 141433250 ram] 8 GB of RAM
[2556 0903 141433250 cpu] wicked fast CPU!
[2556 0903 141433640 xyz]  a�b��������k'� 7�����H_ ���-v �L`�oƙ*=
[2556 0903 141434000 gfx] it can play crysis
...

您可以在 xyz 日志行中看到空格,这些空格替换了有问题的字符。

于 2013-10-18T18:04:16.073 回答