从StringBuilder中删除连续的空白行

问题描述:

我有一个已经从文本文件填充的Stringbuilder对象。 如何检查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,以便行间只有1个空行3和7号线。

在此先感谢。

+0

只是不要将它们附加到StringBuilder当你读取文件。 – 2010-07-08 17:33:27

+0

谢谢,但它是另一个读取具有.GetStringBuilder()方法的文本文件的组件。 对不起,忘了提。 – Riaan 2010-07-08 18:59:13

您是否必须在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的同时保持文件打开。这是很好的,高效的内存(比读入字符串更有效),因为您一次只处理一行,但对于需要很长时间处理的文件并不理想。

+0

是的,它会,但它是另一个读取具有.GetStringBuilder()方法的文本文件的组件。 对不起,忘了提。当我自己阅读文本文件时,我会记住这一点。 – Riaan 2010-07-08 18:59:41

+0

+1使用收益率。@Riaan,我建议你忽略/重写其他组件。在迄今为止输入的答案中,这是迄今为止效率最高的一个答案,它为大文件使用缓冲区打开了大门。 StringBuilder方法的执行速度比流式传输慢得多。 – 2010-07-09 08:32:39

+0

@Daniel。同意。 – Riaan 2010-07-10 05:46:29

StringBuilder在搜索&从中删除时灵活性大大降低。它被用作加速串联的助手,因为"string" + "another string"是一个非常昂贵的操作。

我会建议使用.ToString()然后Regex.Replace编译的正则表达式与标志设置为允许多行。

你可能想的搜索模式:

(\n[\w-\n]*\n) 

你用空字符串替换它。

检出Expresso为一个伟大的.NET正则表达式工具。

+0

我会试试看,并感谢RegEx工具上的提示。 – Riaan 2010-07-08 19:06:05

可能效率不高,但很容易。

while(sb.ToString().Contains(Environment.NewLine + Environment.NewLine)) 
{ 
    sb = sb.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); 
} 
+1

“效率不高”是一个相当大的轻描淡写。 – 2010-07-08 17:32:50

+1

@Hans:这是所有相对的,在我重写的最近一个项目中,以前的开发人员使用Excel自动化来分析csv文件(在Excel中打开文件,将32,000行第一行* 12列,逐个单元格复制到在C#应用程序中使用multidim数组),需要大约12分钟才能将平均300行文件加载到内存中。所以相对而言,我不认为这太糟糕:) – 2010-07-08 18:20:40

+0

Hmya,*所有*都与我想的相关。 – 2010-07-08 18:58:39