2

我知道使用 StreamReader 读写文件的基础知识不知道比较!

在此处输入图像描述

正如您在上面的图片中看到的那样,我有两个文件错误文件和存档文件。我需要根据从(9 到 11)的位置比较第二列,例如(111)在文本文件中的 9 位置与第二存档文件中的列在文本文件中的相同位置(9 到 11)。

如果错误文件中的代码存在于存档文件中,则将整个记录复制到新文件。

我需要使用 C# 执行此活动吗?

编辑:文件是 .txt 但分隔符不一样。标签的数量有时是 2 或 3 但现在位置固定为 9 到 11,但将来可能会像 14 到 16 一样改变。

4

1 回答 1

1

如果格式严格,一种有效且简洁的方法应该有效:

var positions1 = new[] { 9, 10, 11 };
var positions2 = new[] { 14, 15, 16 };
var f1Lines = File.ReadLines(path1)
    .Select((l, i) => new { Line = l, Cols = l.Split('\t'), Num = i + 1 })
    .Where(x => x.Cols.Length >= 2);
var f2Lines = File.ReadLines(path2)
    .Select((l, i) => new { Line = l, Cols = l.Split('\t'), Num = i + 1 })
    .Where(x => x.Cols.Length >= 2);
var toBeArchived = from i in positions1
                   join f1 in f1Lines on i equals f1.Num
                   join f2 in f2Lines on f1.Cols[1] equals f2.Cols[1]
                   where positions2.Contains(f2.Num)
                   select new { f1, f2 };
foreach (var toArchive in toBeArchived)
{ 
    // i'm not sure what you want to do with it finally
    // use File.WriteAllLines if you want to create the merged files
}

当第二列相等时,LINQ 查询将连接行上的两个文件,并且仅连接第 9、10 和 11 行。请注意,您需要添加using System.IOusing System.Linq;

于 2013-02-28T12:47:33.790 回答