附加行时StringBuilder无提示错误

时间:2013-10-17 20:09:05

标签: c# character-encoding .net-4.5 stringbuilder

我正在读取多个日志文件并将这些行附加到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()行时没有任何反应 - 它被命中但字符串没有被修改(它甚至没有变成红色本地窗口作为变量在其值发生变化时执行)。很奇怪的行为!

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

fileReaders

odbcResultsRaw始终有效;这是微不足道的。但odbcResultsNice将如上所述死亡。最后我可能有7,000行odbcResultsRaw但只有几百行odbcResultsNice - 表明代码确实继续运行,至少。

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

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

1 个答案:

答案 0 :(得分: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日志行中看到替换有问题字符的空格。