2013-03-20 115 views
-1

我有一個文本文件是這樣的:刪除行的特殊字符

 
hello 
this is text file 
* Can you Tell me what is 
* Dnt Care 
* List item 

我想刪除所有線路上有星號標記(*),這樣的結果在刪除後的文件是:

 
hello 
this is text file 

回答

5

LINQ讓一切變得簡單:

using System.IO; 
using System.Linq; 

... 

File.WriteAllLines("output.txt", 
        File.ReadLines("input.txt") 
         .Where(line => !line.Contains("*"))); 

或者作爲兩種說法 - 它仍然是懶惰的,只有一次讀取一行:

var query = File.ReadLines("input.txt").Where(line => !line.Contains("*")); 
File.WriteAllLines("output.txt", query); 

如果你一定要更換原來的文件,你可以要麼使用上面,然後刪除原始文件並移至新文件到位,(如果該文件是小夠)讀取整個文件開始:

var lines = File.ReadAllLines("file.txt").Where(line => !line.Contains("*")); 
File.WriteAllLines("file.txt", lines); 

注意,因爲這裏採用ReadAllLines而不是ReadLines,它將讀取整個一次性將文件存入內存。

這假設您使用的是.NET 4或更高版本。如果你只使用.NET 3.5,您仍然可以使用第二種形式,但你需要將結果轉換成一個數組寫出來之前:

var lines = File.ReadAllLines("file.txt") 
       .Where(line => !line.Contains("*")) 
       .ToArray(); 
File.WriteAllLines("file.txt", lines); 
+0

你在哪裏得到Where函數顯示字符串數組? – JeremyK 2013-03-20 19:37:54

+1

@JeremyK:你需要''using'指令來指定'System.Linq'。將這個添加到答案中。 – 2013-03-20 19:38:21

+0

很高興我決定瀏覽今天,學到了新的東西:)謝謝先生。 – JeremyK 2013-03-20 19:39:05

1

讀取文件中的行:

string[] lines = File.ReadAllLines(filename); 

篩選出線路用星號:

string[] filtered = lines.Where(s => !s.Trim().StartsWith("*")).ToArray(); 

寫其餘線路的文件:

File.WriteAllLines(filename, filtered); 
0

一行剛去行,看看字符串包含*

while(Reader.CanRead()) 
{ 
    string currLine = reader.ReadLine(); 
    if(currLine.Contains("*") == false) 
     list.Add(currLine); 
} 
+1

顯然上面的答案好得多:) – JeremyK 2013-03-20 19:35:27

2

假設你知道如何讀取和文件寫入內容,你可以使用一個Regex刪除線你不想。這具有的優點是它要求*在行的開頭,而不是在其上的任何地方。

Regex.Replace(fileContents, "(?m)(^\s*\*.*$)", ""); 

這個Regex在*前面有一個可選的白色空格。