如何从文件中读取文本,但忽略C#中的某些行?

时间:2018-03-07 22:07:42

标签: c#

我正在学习C#,我需要将文件中的文本读入数组,但忽略以某些特殊字符开头的行。我正在使用ReadAllLines来阅读文本。

我在做什么:

string file = openFileDialog1.FileName;
file_txtbx.Text = file;
try {
    test = File.ReadAllLines(file); // reads file into array
} catch (ArgumentNullException) {
}

用于阅读文本的文本文件示例:

A
D
# Next is incorrect
C

3 个答案:

答案 0 :(得分:2)

使用File.ReadLines后跟Where

var allLines = File.ReadLines(file).Where(s => !s.StartsWith("#")).ToArray();

这会生成一个不以"#"开头的所有行的数组。

注意:您不应该抓住ArgumentNullException,因为它表示编程错误。相反,您应该检查您要传递给可能抛出ArgumentNullException的方法的值,以避免进行将引发异常的调用。

答案 1 :(得分:0)

过滤数组:使用Linq

当ReadAllLines返回string数组时,您只需使用Linq方法Where过滤此数组,并使用StartsWith()测试字符串的开头:

// ...
test = file.ReadAllLines(file);
// return lines that don't start with '#'
var filteredLines = test.Where(line => !line.StartsWith("#"));

您还可以使用您需要的任何逻辑运算符和函数在谓词(line => boolean expression)中添加几个条件。

例如,要忽略以//开头的行:

// return lines that don't start with '#' and also that don't start with '//'
var filteredLines = file.ReadAllLines(file)
    .Where(line => !line.StartsWith("#") && !line.StartsWith("//"));

其他信息:

这些示例中的filteredLines类型为IEnumerable<string>,这意味着您可以在foreach(string s in filteredLines)中使用此结果。

根据您之后的操作,如果您希望拥有数组string[],只需添加.ToArray()

如果您希望拥有List<string>,只需添加.ToList()

注意:您必须将using System.Linq;添加到.cs文件的顶部,才能使用WhereToList,和ToArray方法。

答案 2 :(得分:-1)

我的解决方案是

test = file.ReadAllLines(file).Where(line => !string.Equals(line, "your string"));

这种方式你不必关心null,如果你的比较忽略大写/小写,你可以做到

test = file.ReadAllLines(file).Where(line => !string.Equals(line, "your string", StringComparison.InvariantCultureIgnoreCase));