我正在读取多个日志文件并将这些行附加到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(或理解我是否以非预期的方式使用它)或弄清楚如何忽略违规行。想了解您的想法和建议。
注意:我不知道何时会遇到包含这些字符的文件或行。我不确定它们是不同的编码还是随机垃圾。
答案 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日志行中看到替换有问题字符的空格。