1

例如 txt 文件有以下条目说:

england is cold country
India is poor country
england is cold country
england is cold country
India is poor country
english county cricket season.

现在我想在这个 txt 文件中搜索一个字符串“england”并返回包含这个字符串的整行。我如何使用 C 语言来做到这一点?

4

3 回答 3

2

我会考虑两种方法,用于大文件(兆字节)和相对较小的文件。

大文件

如果文件很大并且包含兆字节的数据:使用流阅读器,读取文件直到 EndOfLine,分析刚刚读取的字符串

string pattern = "england";
IList<string> result = new List<string>();
using (var reader = new StreamReader("TestFile.txt")) 
{
    string currentLine;
    while ((currentLine= reader.ReadLine()) != null) 
    {
        if (currentLine.Contains(pattern)
        {
            // if you do not need multiple lines and just the first one
            // just break from the loop (break;)            
            result.Add(currentLine);
        }
    }
}

小文件

如果文件很小,您可以使用帮助器将所有文件内容作为字符串数组返回 - ( File.ReadAllLines() ) 每行字符串,然后使用 LINQ 搜索子字符串。如果您正在使用.NET 4或更新,您可以利用新的帮助程序(File.ReadLines()),它不会读取整个文件并作为延迟操作读取。

.NET 2.0 - 3.5:

string pattern = "england";
IEnumerable<string> result = File.ReadAllLines()
                                 .Where(l => l.Contains(pattern));

.NET4 - 4.5:

string pattern = "england";
IEnumerable<string> result = File.ReadLines()
                                 .Where(l => l.Contains(pattern));

如果您只需要第一行使用.FirstOrDefault(l => l.Contains(pattern))而不是Where(l => l.Contains(pattern))

MSDN

ReadLines 和 ReadAllLines 方法的区别如下: 使用 ReadLines 时,可以在返回整个集合之前开始枚举字符串集合;使用 ReadAllLines 时,必须等待返回整个字符串数组才能访问该数组。因此,当您处理非常大的文件时,ReadLines 会更有效率。

于 2013-02-22T11:40:38.790 回答
0

你可以这样做。如果你想返回所有带有“england”的行,你需要创建一个字符串列表并返回它。

foreach(string line in File.ReadAllLines("FILEPATH"))
    {
    if(line.contains("england"))
       return line;
    }
    return string.empty;
于 2013-02-22T11:40:41.367 回答
0

1)阅读所有行。http://msdn.microsoft.com/en-us/library/system.io.file.readalllines.aspx

2) 创建一个字符串列表以填充匹配项

3) 循环或 linq 行并使用 IndexOf(matchstring) > -1 查找匹配项

4) 返回结果

于 2013-02-22T11:41:48.063 回答