0

2 つのテキスト ファイル (C# を使用)、着信テキスト ファイル、および既存のテキスト ファイルを比較して、変更/相違点を確認する必要がある場合があります。両方のテキスト ファイルのレイアウトは同じで、6 列に同じ種類のデータと列ヘッダーが含まれています。したがって、これは基本的に、着信ファイルの内容に既存のデータと比較して新しいデータがあるかどうかを確認するためのチェックです。

メソッドはFile.ReadAllText本質的に私が望むことを行いますが、問題は、テキスト ファイルの最初の 2 列の値のみを比較し、他の末尾の列を無視したいことです。

テキスト ファイルのレイアウトは次のようになります。

アイテム #|合計|C3|C4|C5|C6

123|7 |0|0|0|0

そのため、最初のファイルと 2 番目のファイルでアイテム # 列または合計列のいずれかに変更がある場合、ファイルの比較はそこで停止し、ファイルの変更と見なす必要があります。

これにアプローチする簡単な方法は何ですか?どうもありがとう。

4

2 に答える 2

2

string.Splitこれは、 LINQ とTakeを使用する場合に簡単な問題ですSequenceEqual

bool AnyDifferent(string file1FullText, string file2FullText)
{
    string[] file1Lines = file1FullText.Split('\n');
    string[] file2Lines = file2FullText.Split('\n');
    if (file1Lines.Length != file2Lines.Length)
        return true;
    for (int i = 0; i < file1Lines.Length; i++)
    {
        var file1LineSplit = file1Lines[i].Split('|');
        var file2LineSplit = file2Lines[i].Split('|');
        if (!file1LineSplit.Take(2).SequenceEqual(file2LineSplit.Take(2)))
            return true;
    }
    return false;
}

パフォーマンスを向上させるために編集または使用File.ReadLinesします (比較を開始する前にファイル全体を読み込む必要はありません)。

bool AnyDifferent(string file1Path, string file2Path)
{
    using (var file1Enumerator = File.ReadLines(file1Path).GetEnumerator())
    using (var file2Enumerator = File.ReadLines(file2Path).GetEnumerator())
    {
        while (true)
        {
            bool result1 = file1Enumerator.MoveNext();
            bool result2 = file2Enumerator.MoveNext();
            if (result1 != result2)
                return true;
            else if (!result1 && !result2)
                return false;
            var file1LineSplit = file1Enumerator.Current.Split('|');
            var file2LineSplit = file2Enumerator.Current.Split('|');
            if (!file1LineSplit.Take(2).SequenceEqual(file2LineSplit.Take(2)))
               return true;
        }
    }
}
于 2013-08-26T13:48:21.587 に答える
0

Item ごとにクラスを作成します。

class Item
{
    public int ItemNumber { get; set; }
    public int Total { get; set; }
}

次に、リストを使用してデータを比較します

List<Item> items = new List<Item>();
foreach (String line in File.ReadAllLines("filepath"))
{
    Item item = new Item
    {
         ItemNumber = Convert.ToInt32(line.Split('|')[0]),
         Total = Convert.ToInt32(line.Split('|')[1])
    };
}

次に、それらを比較するためのしっかりした構造があります

于 2013-08-26T13:48:39.907 に答える