2011-06-17 57 views
3

我需要讀取兩個大文件(超過125 MB)。每個文件都包含具有相似數據的記錄。我需要找到它們兩個中的記錄,然後如果記錄的字段不匹配,我需要用文件1中的記錄中包含的字段覆蓋文件2中的記錄。處理和組合兩個大文件

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

ID, ACCT, Bal, Int, Rate 

第二文件具有以下字段:

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

因此,如果在文件1中的記錄具有相同的ACCT號碼作爲記錄在文件2中,則需要用文件1中的Bal,Int和Rate的值覆蓋文件2中的Bal,Int和Rate。

某些記錄不會位於每個文件中。我需要創建的輸出文件是文件2中的所有記錄,如果記錄不在文件1中,則它將按原樣寫入文件,但是隨後將包括需要更改的記錄。

我已經嘗試了許多不同的選項,但大多數都不足以處理大文件。解決這個問題的正確方向是什麼?預先感謝您的幫助。

回答

0

將文件1中的所有記錄加載到以ACCT爲關鍵字的hash table中。
循環遍歷文件2中的所有記錄,並在需要時進行更新。

複雜度:O(N)

HTH

+0

非常感謝。它def解決了我的問題。 – nech0401

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 
      } 

的diff將成爲選擇的4個領域的枚舉集合。現在你可以遍歷它並使用f1.LineNum從myFileOne中找到正確的行號並用f2中的值更新它。

這是否有幫助,或者你對如何訪問文件本身更感興趣?

+0

感謝您抽出時間來給我一個答案。 – nech0401