繁体   English   中英

处理和组合两个大文件

[英]Processing and combining two large files

我需要读取两个大文件(超过125 MB)。 每个文件都包含具有类似数据的记录。 我需要找到它们中的记录,然后如果记录的字段不匹配,我需要用文件1中的记录中的字段覆盖文件2中的记录。

例如,第一个文件包含以下字段:

ID, ACCT, Bal, Int, Rate 

第二个文件包含以下字段:

TYPE, ID, ACCT, Bal, Int, Rate.  

因此,如果文件1中的记录具有与文件2中的记录相同的ACCT编号,则文件2中的Bal,Int和Rate需要用文件1中的Bal,Int和Rate的值覆盖。

某些记录不在每个文件中。 我需要创建的输出文件是来自文件2的所有记录,如果记录不在文件1中,那么它将按原样写入文件,但随后将包括需要更改的记录。

我尝试了很多不同的选项,但大多数都没有足够的效率来处理大文件。 这个问题的正确方向是什么? 在此先感谢您的帮助。

定义两个特定于类型的类,每个文件对应一个类。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM