我有一个已从文本文件填充的Stringbuilder对象。 如何检查StringBuilder对象并删除连续的“空白”行。
即
Line 1: This is my text
Line 2:
Line 3: Another line after the 1st blank one
Line 4:
Line 5:
Line 6: Next line after 2 blank lines
(行号仅供参考)
第2行的空白行很好,但我想在第5行删除重复的空白行,依此类推。
如果为了论证,第6行也是一个空白行,并且第7行有一个值,我想删除空白行5和空白行6,这样第3行之间只有1个空白行和第7行。
提前致谢。
答案 0 :(得分:3)
你必须已经在StringBuilder中拥有文件内容吗?
能够逐行阅读会更好。类似的东西:
private IEnumerable<string> GetLinesFromFile(string fileName)
{
using (var streamReader = new StreamReader(fileName))
{
string line = null;
bool previousLineWasBlank = false;
while ((line = streamReader.ReadLine()) != null)
{
if (!previousLineWasBlank && string.IsNullOrEmpty(line))
{
yield return line;
}
previousLineWasBlank = string.IsNullOrEmpty(line);
}
}
}
现在,你可以阅读你的文字(已删除了重叠空白行),如下所示:
foreach (var line in GetLinesFromFile("myFile.txt"))
{
Console.WriteLine(line);
}
注意:我只是在这里说明一种技巧。还有其他考虑因素:例如我的迭代器方法在消费者处理foreach时保持文件打开。这很好并且内存效率高(例如,比读取字符串更多),因为您一次只处理一行,但不适合需要很长时间处理的文件。
答案 1 :(得分:3)
可能效率不高,但很容易。
while(sb.ToString().Contains(Environment.NewLine + Environment.NewLine))
{
sb = sb.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine);
}
答案 2 :(得分:2)
StringBuilder
在搜索和搜索方面不够灵活。从中删除。它被用作帮助加速连接,因为"string" + "another string"
是一项非常昂贵的操作。
我建议使用.ToString()
然后Regex.Replace
使用已编译的正则表达式,并将标志设置为允许多行。
你可能想要一个搜索模式:
(\n[\w-\n]*\n)
然后用空字符串替换它。
查看Expresso以获得出色的.NET正则表达式工具。