0

2 つのファイルを比較していますが、ファイルの 1 つに項目が追加または削除されている可能性があります。2 つのファイルに違いがあるかどうかを確認しています。もしそうなら、レコードが追加または削除されたかどうかにかかわらず、それらの違いは何ですか。それらのレコードを返したい (追加または削除)

私が持っているものでは、ファイルにアイテムが削除または追加されたかどうかがわかりますが、追加または削除されたアイテムは返されません。私が欠けているものへの助けをいただければ幸いです。

   foreach (ExcelRow rowA in fileA.excelRows)
    {
        if (!fileB.ContainsHash(rowA.rowHash))
        {
            MessageBox.Show("Files are NOT the same. Data was REMOVED.\n" + rowA.ToString());
        }

    }

    foreach (ExcelRow rowB in fileB.excelRows)
    {
         if (!fileA.ContainsHash(rowB.rowHash))
         {
              MessageBox.Show("Row added" + rowB.ToString());
         }
    }

public List<ExcelRow> excelRows = new List<ExcelRow>();

        public bool ContainsHash(byte[] hashToLook)
        {
            bool found;
            found = false;
            foreach (ExcelRow eRow in excelRows)
            {
                found = EqualHash(eRow.rowHash, hashToLook);

                if (found)
                {
                    break;
                }
            }

            return found;
        }

        public static bool EqualHash(byte[] hashA, byte[] hashB)
        {
            bool bEqual ;
            int i ;

            bEqual  = false;
            if (hashA.Length == hashB.Length)
            {

                i = 0;
                while ((i < hashA.Length) && (hashA[i] == hashB[i]))
                {
                    i++ ;
                }
                if (i == hashA.Length)
                {
                    bEqual = true;
                }
            }
            return bEqual ;
        }

ファイルの読み取り:

public ExcelInfo ReadExcel(OpenFileDialog openFileDialog)
        {
            var _excelFile = new ExcelQueryFactory(openFileDialog.FileName);
            var _info = from c in _excelFile.WorksheetNoHeader() select c;

            ExcelRow excelRow;
            ExcelInfo resp;

            resp = new ExcelInfo();

            foreach (var item in _info)
            {
                excelRow = new ExcelRow();
                excelRow.lstCells.Add(item.ElementAt(0));
                excelRow.lstCells.Add(item.ElementAt(1));
                excelRow.lstCells.Add(item.ElementAt(2));
                excelRow.lstCells.Add(item.ElementAt(3));
                excelRow.lstCells.Add(item.ElementAt(4));
                excelRow.lstCells.Add(item.ElementAt(5));
                excelRow.lstCells.Add(item.ElementAt(6));
                excelRow.lstCells.Add(item.ElementAt(7));
                excelRow.lstCells.Add(item.ElementAt(8));
                excelRow.lstCells.Add(item.ElementAt(9));
                excelRow.lstCells.Add(item.ElementAt(10));
                excelRow.lstCells.Add(item.ElementAt(11));
                excelRow.lstCells.Add(item.ElementAt(12));

                excelRow.CalculateHash();
                resp.excelRows.Add(excelRow);
            }
            return resp;
        }

ハッシュの計算:

public void CalculateHash()
        {
            byte[] rowBytes;
            byte[] cellBytes;
            int pos;
            int numRowBytes;

            numRowBytes = 0;
            foreach (string cellText in lstCells)
            {
                numRowBytes += NumBytes(cellText);
            }

            //Allocate space to calculate the HASH of a single row

            rowBytes = new byte[numRowBytes];
            pos = 0;

            //Concatenate the cellText of each row into a single byte array
            foreach (string cellText in lstCells)
            {
                cellBytes = GetBytes(cellText);
                System.Buffer.BlockCopy(cellBytes, 0, rowBytes, pos, cellBytes.Length);
                pos = cellBytes.Length;
            }
            rowHash = new MD5CryptoServiceProvider().ComputeHash(rowBytes);
        }

デバッグ中:

if (!fileB.ContainsHash(rowA.rowHash))

fileB には 3 つの行が含まれ、fileA には 4 つの行が含まれます。

fileB = 3、rowA = fileA の最初の行、(.rowHash) は byte[16]

私はContainHashメソッドを続けているので、byte [] hashToLook = 16 - これはrowAではないでしょうか?

excelRows = 3 (ファイル B)

次に、EqualHash(eRow.rowHash, hashToLook) は (fileA の最初の行、byte[16]) です。

私はrowAを間違って渡していますか?

4

2 に答える 2

1

2 つのリストを追加して、A にあるが B にはないアイテムと、B にあって A にはないアイテムを追跡するだけです。

var notInA = new List<ExcelRow>();
var notInB = new List<ExcelRow>();

コードで、それらを適切なリストに追加します。

foreach (ExcelRow rowA in fileA.excelRows)
{
    if (!fileB.ContainsHash(rowA.rowHash))
    {
        MessageBox.Show("Files are NOT the same. Data was REMOVED.\n" + rowA.ToString());
        notInB.Add(rowA);
    }

}

foreach (ExcelRow rowB in fileB.excelRows)
{
     if (!fileA.ContainsHash(rowB.rowHash))
     {
          MessageBox.Show("Row added" + rowB.ToString());
          notInA.Add(rowB);
     }
}
于 2013-08-27T19:15:01.460 に答える
0

に変更hashA[i] != hashB[i]するだけhashA[i] == hashB[i]です:)

于 2013-08-27T19:24:54.720 に答える