2013-02-28 68 views
2

我知道使用StreamReader读取和写入文件的基础没有关于比较的想法!如何检查另一个文件c#中的文件内容?

enter image description here

,你可以在上面的图片看到我有两个文件,错误文件和存档文件。我需要根据位置来比较 与第2列从(9〜11)如(111)在文本文件中位于9位,档案文件中的第二列位于文本文件中的相同位置(9至11)。

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

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

编辑:文件是.txt但分隔符不是相同的。翼片有时 2或3,但位置是固定的9至11,现在,但如果格式是严格它可以在将来 像14变更为16。

+0

你现在做了什么?如果没有,你应该得到你的文件的所有行并循环它们,阅读此:http://www.dotnetperls.com/file-readalllines – 2013-02-28 12:31:10

+0

那么这些文件只有.txt文件和列的分隔符是一个选项卡? – 2013-02-28 12:33:56

+0

文件是.txt,但分隔符不同。的选项卡有时它2或3但是现在位置固定为9到11,但它可能会在14到16之后改变。 – 2013-02-28 12:34:40

回答

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;

+0

我需要将匹配的值行写入新文件,我不知道LINQ如何在这里读取输入文件? – 2013-02-28 12:51:28

+0

但在我的第二档案记录不在9,10,11位置。 – 2013-02-28 12:52:56

+0

@ViswanathanIyer:它可以在file1中的9-11和file2中的9-11中,但它们不一定必须在同一行中,这是正确的吗? – 2013-02-28 12:54:35

相关问题