2013-03-20 121 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在*前面有一个可选的白色空格。