如何在另一个文本文件中搜索文本文件中的行

时间:2017-06-09 18:53:50

标签: c# text-files

我有2个文本文件,我想读取文件并确定file2中是否存在file1中的任何行。

file1中的每一行都包含file2行中信息的子集(file2中的每一行都比file1更完整)。例如,file1的行具有列(x,y,z),而file2的行具有列(x,y,z,w)。

我想读取file1,对于file2中也存在的file1的任何行,我想保存file2的那一行(x,y,z,w)

我写了这段代码,但这不给我任何答案:

class Task {

    @SerializedName("_id")
    var id: String? = null
    @SerializedName("text")
    var taskTitle: String? = null
    @SerializedName("completed")
    var isCompleted: Boolean? = null

    constructor(taskTitle: String) {
        this.taskTitle = taskTitle
    }

    constructor(taskTitle: String, completed: Boolean?) {
        this.taskTitle = taskTitle
        this.isCompleted = completed
    }

    constructor(id: String, taskTitle: String, isCompleted: Boolean?) {
        this.id = id
        this.taskTitle = taskTitle
        this.isCompleted = isCompleted
    }

}

我的文件很大(600万条记录),我想在最短的时间内取得结果。

一行text1:

var f1Lines = File.ReadAllLines(@"D:\test1.txt");
var f2LineInf1 = File.ReadLines(@"D:\test2.txt")
    .Where(line => f1Lines.Contains(line))
    .Select(line => line).ToList();

File.WriteAllLines(@"D:\result.txt", f2LineInf1);

一行text2上面有列+ title和body。

3 个答案:

答案 0 :(得分:2)

您编写的代码正在检查f1Lines中的任何行是否以f2LineInf1中的当前行开头。因为我们知道第一个文件中的每一行都包含第二个文件中的行的子集,所以这永远不会成立。

我们真正想要做的是,对于第二个文件中的每一行,查看第一个文件中是否有与第二个文件行的开头匹配的行。

这可以通过以下方式完成:

var f1Lines = File.ReadAllLines(@"f:\public\temp\temp1.txt");
var f2LineInf1 = File.ReadLines(@"f:\public\temp\temp2.txt")
    .Where(line => f1Lines.Any(line.StartsWith));

File.WriteAllLines(@"f:\public\temp\result.txt", f2LineInf1);

答案 1 :(得分:1)

另一个答案准确答案并且应该被接受,但这是另一种方式,LINQ更少。

var f1Lines = File.ReadAllLines(@"D:\test1.txt").ToList();
var f2Lines = File.ReadLines(@"D:\test2.txt").ToList();
var result = new List<string>();
foreach (var item in f1Lines)
{
    var found = f2Lines.Where((line) => line.Contains(item)).FirstOrDefault();
    if (found != null)
    {
        result.Add(found);
    }
}

File.WriteAllLines(@"D:\result.txt", result);

答案 2 :(得分:0)

我建议使用HashSet<string>(不是List<string>string[])作为临时收藏品;像这样的东西:

 // Hash set is a most efficient - O(1) - data stucture for Contains
 // When working with 1e6 records O(n)/O(1) choice does matter...
 HashSet<string> toFind = new HashSet<string>(File.ReadLines(@"D:\test1.txt"));

 File.WriteAllLines(@"D:\result.txt", File
   .ReadLines(@"D:\test2.txt") 
   .Where(line => toFind.Contains(line)));