3

2 つの大きなファイル (125 MB 以上) を読み込む必要があります。各ファイルには、同様のデータを持つレコードが含まれています。両方にあるレコードを見つける必要があり、レコードのフィールドが一致しない場合は、ファイル 2 のレコードをファイル 1 のレコードに含まれるフィールドで上書きする必要があります。

たとえば、最初のファイルには次のフィールドがあります。

ID, ACCT, Bal, Int, Rate 

2 番目のファイルには、次のフィールドがあります。

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

したがって、ファイル 1 のレコードがファイル 2 のレコードと同じ ACCT 番号を持っている場合、ファイル 2 の Bal、Int、および Rate は、ファイル 1 の Bal、Int、および Rate の値で上書きする必要があります。

一部のレコードは各ファイルに含まれません。作成する必要がある出力ファイルは、ファイル 2 のすべてのレコードです。レコードがファイル 1 にもない場合は、そのままファイルに書き込みますが、変更が必要なレコードが含まれます。

さまざまなオプションを試しましたが、ほとんどは大きなファイルを処理するのに十分効率的ではありません. この問題で取るべき適切な方向は何ですか? 助けてくれてありがとう。

4

2 に答える 2

1

ファイルごとに1つずつ、2つのタイプ固有のクラスを定義します。

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<>にロードして、IListmyFileOneとIListmyFileTwoを作成し、各エントリの行番号をキャプチャして、ファイルのどこに表示されるかを確認します。

次に、linqを使用して、2つの違いをクエリします。

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
            }

差分は、選択内の4つのフィールドの列挙可能なコレクションになります。これで、それを繰り返し、f1.LineNumを使用して、myFileOneから正しい行番号を見つけ、f2で見つかった値で更新できます。

それは役に立ちますか、それともファイル自体にアクセスする方法にもっと興味がありましたか?

于 2011-06-17T14:51:22.910 に答える
0

ファイル1のすべてのレコードを、ACCTをキーとしてハッシュテーブルにロードします。
ファイル2のすべてのレコードをループし、必要に応じて更新します。

複雑さ:O(n)

HTH

于 2011-06-17T14:52:10.417 に答える