我想做的是在文本文件中查找字符串的所有实例,然后将包含所述字符串的完整行添加到数组中。
例如:
eng GB English
lir LR Liberian Creole English
mao NZ Maori
例如,搜索 eng 必须将前两行添加到数组中,当然包括文件中更多的“eng”实例。
使用文本文件输入和 C# 如何做到这一点?
我想做的是在文本文件中查找字符串的所有实例,然后将包含所述字符串的完整行添加到数组中。
例如:
eng GB English
lir LR Liberian Creole English
mao NZ Maori
例如,搜索 eng 必须将前两行添加到数组中,当然包括文件中更多的“eng”实例。
使用文本文件输入和 C# 如何做到这一点?
你可以使用 TextReader 读取每一行并搜索它,如果你找到你想要的,然后将该行添加到字符串数组中
List<string> found = new List<string>();
string line;
using(StreamReader file = new StreamReader("c:\\test.txt"))
{
while((line = file.ReadLine()) != null)
{
if(line.Contains("eng"))
{
found.Add(line);
}
}
}
或者你可以使用yield return
返回 enumurable
一条线:
using System.IO;
using System.Linq;
var result = File.ReadAllLines(@"c:\temp").Select(s => s.Contains("eng"));
或者,如果您想要一个内存效率更高的解决方案,您可以滚动扩展方法。您可以使用FileInfo
,FileStream
等作为基本处理程序:
public static IEnumerable<string> ReadAndFilter(this FileInfo info, Predicate<string> condition)
{
string line;
using (var reader = new StreamReader(info.FullName))
{
while ((line = reader.ReadLine()) != null)
{
if (condition(line))
{
yield return line;
}
}
}
}
用法:
var result = new FileInfo(path).ReadAndFilter(s => s.Contains("eng"));
你可以试试下面的代码,我试过了,它工作正常
string searchKeyword = "eng";
string fileName = "Some file name here";
string[] textLines = File.ReadAllLines(fileName);
List<string> results = new List<string>();
foreach (string line in textLines)
{
if (line.Contains(searchKeyword))
{
results.Add(line);
}
}
该File
对象包含一个ReadLines
逐行返回的静态方法,与之相反,ReadAllLines
它返回一个数组,因此需要将完整的文件加载到内存中。
因此,通过使用File.ReadLines
和 LINQ,一个有效且简短的解决方案可以写成:
var found = File.ReadLines().Where(line => line.Contains("eng")).ToArray();
至于原始问题,可以通过替换来进一步优化line.Contains
,line.StartsWith
因为似乎所需的术语出现在每行的开头。