处理和组合两个大文件
本文关键字:两个 文件 组合 处理 | 更新日期: 2023-09-27 17:59:20
我需要读入两个大文件(超过125 MB)。每个文件都包含具有相似数据的记录。我需要找到它们中的记录,然后如果记录的字段不匹配,我需要用文件一中的记录中包含的字段覆盖文件二中的记录。
例如,第一个文件具有以下字段:
ID, ACCT, Bal, Int, Rate
第二个文件包含以下字段:
TYPE, ID, ACCT, Bal, Int, Rate.
因此,如果文件1中的记录与文件2中的记录具有相同的ACCT编号,则文件2中的Bal、Int和Rate需要用文件1中Bal、Int和Rates的值覆盖。
有些记录不会出现在每个文件中。我需要创建的输出文件是文件二中的所有记录,如果记录不在文件一中,那么它将按原样写入文件,但随后需要更改的记录将被包括在内。
我尝试了很多不同的选项,但大多数都不够有效,无法处理大文件。解决这个问题的正确方向是什么?提前感谢您的帮助。
定义两个类型特定的类,每个文件一个。
class FileOne
{
public int LineNumber {get;set};
public int Id{get;set;};
public double Bal {get;set;};
...
}
class FileTwo
{
public int LineNumber {get;set};
public string TranType{get;set;}; // type = reserved word
public int Id{get;set;};
public double Bal {get;set;};
...
}
将文件加载到IList<>对于每个文件,这样您就有了IList myFileOne和IList myFileTwo,并捕获每个条目的行号,这样您就能知道它们在文件中的位置。
现在使用linq来查询两者之间的差异:
var diffs = from f1 in myFileOne
join f2 in myFileTwo on f1.Id = f2.Id
where f1.Bal != f2.Bal // add whatever conditions you need here
select new {
f1.Id, f2.Bal, f2.Int, f2.Rate, f1.LineNum
}
Diffs将成为select中4个字段的可枚举集合。现在,您可以遍历它,并使用f1.LineNum从myFileOne中找到正确的行号,并用f2中的值更新它。
这有帮助吗?或者你对如何访问文件本身更感兴趣吗?
将文件1中的所有记录加载到以ACCT为键的哈希表中
循环遍历文件2中的所有记录,并在需要时进行更新。
复杂性:O(n)
HTH