簡體   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