2

StreamReaderを使用したファイルの読み取りと書き込みの基本を知っています比較についてはわかりません!!

ここに画像の説明を入力

上の画像でわかるように、エラー ファイルとアーカイブ ファイルの 2 つのファイルがあります。たとえば、(111) の (9 から 11) までの位置に基づいて、2 番目の列をテキスト ファイルの 9 番目の位置と比較する必要があります。テキスト ファイルの同じ位置 (9 ~ 11) のアーカイブ ファイルの列。

エラー ファイルのコードがアーカイブ ファイルにある場合は、レコード全体を新しいファイルにコピーします。

C# を使用してこのアクティビティを実行する必要がありますか?

編集:ファイルは.txtですが、セパレーターは同じ番号ではありません。タブの数は時々 2 または 3 ですが、位置は現在 9 から 11 に固定されていますが、将来的には 14 から 16 のように変更される可能性があります。

4

1 に答える 1

1

形式が厳密な場合に機能する効率的で簡潔なアプローチ:

var positions1 = new[] { 9, 10, 11 };
var positions2 = new[] { 14, 15, 16 };
var f1Lines = File.ReadLines(path1)
    .Select((l, i) => new { Line = l, Cols = l.Split('\t'), Num = i + 1 })
    .Where(x => x.Cols.Length >= 2);
var f2Lines = File.ReadLines(path2)
    .Select((l, i) => new { Line = l, Cols = l.Split('\t'), Num = i + 1 })
    .Where(x => x.Cols.Length >= 2);
var toBeArchived = from i in positions1
                   join f1 in f1Lines on i equals f1.Num
                   join f2 in f2Lines on f1.Cols[1] equals f2.Cols[1]
                   where positions2.Contains(f2.Num)
                   select new { f1, f2 };
foreach (var toArchive in toBeArchived)
{ 
    // i'm not sure what you want to do with it finally
    // use File.WriteAllLines if you want to create the merged files
}

LINQ クエリは、行の両方のファイルを結合し、2 番目の列が等しい場合は行 9、10、および 11 のみを結合します。using System.IOとを追加する必要があることに注意してくださいusing System.Linq;

于 2013-02-28T12:47:33.790 に答える