2016-02-15 19 views
-1

我有一個文本文件,它看起來像這樣,當我使用一個StreamReader打開它創建一個新的文件:(「刪除」,只是告訴你什麼是我想要做的)從現有文件

 
A, 1, 2, 3, 4, 5 
B, 1, 2, 2, 2, 2 
B, 1, 1, 1, 1, 1 
A, 2, 2, 3, 4, 5 -- Remove 
A, 1, 2, 3, 4, 5 
A, 2, 2, 3, 4, 5 -- Remove 
B, 1, 2, 2, 2, 2 -- Remove 
B, 1, 1, 1, 1, 1 -- Remove 
A, 1, 2, 3, 4, 5 
B, 1, 2, 2, 2, 2 

「A」是父行,「B」是直接在父行下面的子行。有些A可能沒有子行。基本上,我想要一個新的文本文件,只有A的和他們的孩子(B)A的行中的第二個字段不包含2.因此,我的新文本文件(使用Streamwriter)將如下所示:

 
A, 1, 2, 3, 4, 5 
B, 1, 2, 2, 2, 2 
B, 1, 1, 1, 1, 1 
A, 1, 2, 3, 4, 5 
A, 1, 2, 3, 4, 5 
B, 1, 2, 2, 2, 2 

我可以得到行A,沒有「2」,但是很難得到它的下面的子行...

幫助任何人嗎?

我想我懂了工作,但它不是優雅:

List<string> str = new List<string>(); 

while (!file.EndOfStream) 
      {     
       var line = file.ReadLine(); 
       str.Add(line); 
      } 

     file.Close(); 


using (var sw = new StreamWriter(file)) 
      { 
       for(int i = 0; i <= str.Count-1; i++) 
       { 
        var values = str[i].Split(','); 
        if (values[0] == "A" && values[1] != "2") 
        { 
         sw.WriteLine(str[i]); 

         int j = i+1; 

         for (int e = j; e <= str.Count - 1; e++) 
         { 
          var values2 = str[e].Split(','); 
          if (values2[0] == "B") 
          { 
           sw.WriteLine(str[e]); 
          }else if(values2[0] == "A") 
          { 
           break; 
          } 
         } 
        } 
       } 

      } 
+2

你能告訴我們你到目前爲止的代碼嗎? –

+0

您的刪除條件並不完全清楚。 – ryanyuyu

+0

我添加了我到目前爲止的代碼..這似乎是一種工作..我必須繼續測試,但它不優雅。 – EriqaBana

回答

2

我可能會做這樣的事情。請注意,這假定該文件總是看起來像你的榜樣,並沒有錯誤檢查:

using (StreamReader reader = new StreamReader(inputFile)) 
using (StreamWriter writer = new StreamWriter(outputFile)) 
{ 
    bool delete = false; 
    while (!reader.EndOfStream) 
    { 
     string line = reader.ReadLine(); 
     string[] lineItems = line.Split(','); 
     if (lineItems[0].Trim() == "A") 
      delete = lineItems[1].Trim() == "2"; 
     if (!delete) 
      writer.WriteLine(line); 
    } 
} 
+0

謝謝!!,這絕對比我的優雅多了! – EriqaBana

0

既然你已經從目前的A知道你會刪除它和所有B的下面,你可以簡單地保持狀態在一個布爾值。

static void ProcessStream(TextReader input, TextWriter output) 
{ 
    bool remove = false; 
    string line; 
    while ((line = input.ReadLine()) != null) 
    { 
     var parts = line.Split(','); 
     //for A, decide to remove this and next lines 
     if (parts[0] == "A") 
      remove = parts[1].Contains("2"); 

     if (!remove) 
      output.WriteLine(line); 
    } 
}