2010-07-08 30 views
5

我有一個已經從文本文件填充的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

回答

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的同時保持文件打開。這是很好的,高效的內存(比讀入字符串更有效),因爲您一次只處理一行,但對於需要很長時間處理的文件並不理想。

+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

2

StringBuilder在搜索&從中刪除時靈活性大大降低。它被用作加速串聯的助手,因爲"string" + "another string"是一個非常昂貴的操作。

我會建議使用.ToString()然後Regex.Replace編譯的正則表達式與標誌設置爲允許多行。

你可能想的搜索模式:

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

你用空字符串替換它。

檢出Expresso爲一個偉大的.NET正則表達式工具。

+0

我會試試看,並感謝RegEx工具上的提示。 – Riaan 2010-07-08 19:06:05

3

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

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