【问题标题】:How to check for file contents in another file c#?如何检查另一个文件c#中的文件内容?
【发布时间】:2013-02-14 15:30:05
【问题描述】:

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

如上图所示,我有两个文件错误文件和存档文件.. 我需要比较 第 2 列基于从(9 到 11)的位置,例如(111) 位于文本文件中的第 9 位,存档文件中的第 2 列位于文本文件中的相同位置(9 到 11)。

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

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

编辑:文件是 .txt,但分隔符不同。有时它的标签 2 或 3 但位置现​​在固定为 9 到 11,但可能会在 14 到 16 岁的未来。

【问题讨论】:

  • 你现在做了什么?如果没有,您应该获取文件的所有行并循环它们,请阅读:dotnetperls.com/file-readalllines
  • 那么这些文件是否只有.txt文件,并且列的分隔符是制表符?
  • 文件是 .txt 但分隔符不一样。标签的数量有时是 2 或 3 但现在位置固定为 9 到 11,但将来可能会像 14 到 16 一样改变。

标签: c# .net visual-studio-2010 file io


【解决方案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;

【讨论】:

  • 我需要将匹配的值行写入新文件,我不知道 LINQ 你将如何在这里读取输入文件?
  • 但是在我的第二个文件中记录不在 9、10、11 的位置。
  • @ViswanathanIyer:它可以在 file1 的 9-11 和 file2 的 9-11 行,但它们不一定在同一行,对吗?
  • 在第一个文件中它有固定位置9-11,但在第二个文件中它有固定位置(当前)14-16 同一行没关系,如果找到两次,我需要写两行到新文件。
  • @ViswanathanIyer:编辑了我的答案。请注意,新方法更容易出错。我省略了对列数的检查。
猜你喜欢
  • 2021-08-31
  • 2013-02-10
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 2011-04-24
  • 1970-01-01
相关资源
最近更新 更多