3

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

例如,第一个文件具有以下字段:

ID, ACCT, Bal, Int, Rate 

第二个文件具有以下字段:

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

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

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

我尝试了许多不同的选项,但大多数都不足以处理大文件。解决这个问题的正确方向是什么?提前感谢您的帮助。

4

2 回答 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 中找到的值对其进行更新。

这有帮助还是您对如何访问文件本身更感兴趣?

于 2011-06-17T14:51:22.910 回答
0

将文件 1 中的所有记录加载到以 ACCT 为键的哈希表中。
循环遍历文件 2 中的所有记录并根据需要进行更新。

复杂度:O(n)

高温高压

于 2011-06-17T14:52:10.417 回答