public static ReconcileResult QuickReconcile(DataTable tbl1, DataTable tbl2, string table1_header, string table2_header, List <string> lstKey, List <string> lstIgnore, List <string> lstAmbiguousSortKey) { ReconcileResult result = new ReconcileResult(table1_header, table2_header); if (tbl1.Rows.Count != tbl2.Rows.Count) { result.Add("Data Count is differnt Tbl1:" + tbl1.Rows.Count.ToString() + " tbl2:" + tbl2.Rows.Count.ToString(), null, null, null, null); } else { string strSortKey = GetSortString(lstKey); DataView dv1 = new DataView(tbl1, null, strSortKey, DataViewRowState.CurrentRows); DataView dv2 = new DataView(tbl2, null, strSortKey, DataViewRowState.CurrentRows); for (int i = 0; i < dv1.Count; i++) { DataRow r1 = dv1[i].Row; DataRow r2 = dv2[i].Row; string key = GetFilterString(r1, lstKey); foreach (DataColumn c in tbl1.Columns) { if (lstIgnore.Contains(c.ColumnName)) { continue; } object obj1 = r1[c.ColumnName]; object obj2 = r2[c.ColumnName]; if (r1[c.ColumnName] != r2[c.ColumnName]) { if (Convert.IsDBNull(obj1) == false && Convert.IsDBNull(obj2) == false) { if (c.DataType == typeof(decimal)) { decimal dec1 = Convert.ToDecimal(obj1); decimal dec2 = Convert.ToDecimal(obj2); if (dec1 == dec2) { continue; } } else { if (obj1.ToString().Trim().Equals(obj2.ToString().Trim())) { continue; } } } result.Add(key, c, r1, r2, null); } } } } return(result); }
private static void reconcileDuplicates(string key, ReconcileResult result, List <string> lstIgnore, List <string> lstAmbiguousSortKey, DataTable tbl1, DataTable tbl2) { StringBuilder strBuf = new StringBuilder(); foreach (string i in lstAmbiguousSortKey) { if (strBuf.Length > 0) { strBuf.Append(" , "); } strBuf.Append(i); } DataView dv1 = new DataView(tbl1, key, strBuf.ToString(), DataViewRowState.CurrentRows); DataView dv2 = new DataView(tbl2, key, strBuf.ToString(), DataViewRowState.CurrentRows); if (dv1.Count != dv2.Count) { Console.WriteLine("Count mismatch in" + key); Console.WriteLine("Table1:" + dv1.Count + "\tTable2:" + dv2.Count); result.AddCountMismatch(key, new DataColumn("Different Count"), dv1.Count, dv2.Count); } else { for (int i = 0; i < dv1.Count; i++) { DataRow r1 = dv1[i].Row; DataRow r2 = dv2[i].Row; foreach (DataColumn c in tbl1.Columns) { if (lstIgnore.Contains(c.ColumnName)) { continue; } object obj1 = r1[c.ColumnName]; object obj2 = r2[c.ColumnName]; if (r1[c.ColumnName] != r2[c.ColumnName]) { if (Convert.IsDBNull(obj1) == false && Convert.IsDBNull(obj2) == false) { //if (c.DataType == typeof(string)) { if (obj1.ToString().Trim().Equals(obj2.ToString().Trim())) { continue; } } } string subKey = GetFilterString(r1, lstAmbiguousSortKey); //Console.WriteLine(key + ":" + subKey); result.Add(key + ":" + subKey, c, r1, r2, null); } } } } }
internal void simpleMatching(ReconcileResult result, DataRow r1, DataRow r2, string col1, string col2, string key) { object obj1 = r1[col1]; object obj2 = r2[col2]; if (obj1 != obj2) { if (Convert.IsDBNull(obj1) == false && Convert.IsDBNull(obj2) == false) { //if (c.DataType == typeof(string)) { if (obj1.ToString().Trim().Equals(obj2.ToString().Trim())) { return; } } } result.Add(key, r1.Table.Columns[col1], r1, r2, null); } }
public static ReconcileResult Reconcile(DataTable tbl1, DataTable tbl2, string table1_header, string table2_header, List <string> lstKey, List <string> lstIgnore, List <string> lstAmbiguousSortKey) { ReconcileResult result = new ReconcileResult(table1_header, table2_header); List <string> lstDuplicatesKey = new List <string>(); string strSortKey = GetSortString(lstKey); tbl1.DefaultView.Sort = strSortKey; tbl2.DefaultView.Sort = strSortKey; foreach (DataRow r1 in tbl1.Rows) { string key = GetFilterString(r1, lstKey); DataRow[] rows = tbl2.Select(key); if (rows == null || rows.Length == 0) { result.Add(key, null, r1, null, null); } else { if (rows.Length > 1) { lock (lstDuplicatesKey) { if (lstDuplicatesKey.Contains(key) == false) { lstDuplicatesKey.Add(key); } } } else { DataRow r2 = rows[0]; foreach (DataColumn c in tbl1.Columns) { if (lstIgnore.Contains(c.ColumnName)) { continue; } object obj1 = r1[c.ColumnName]; object obj2 = r2[c.ColumnName]; if (r1[c.ColumnName] != r2[c.ColumnName]) { if (Convert.IsDBNull(obj1) == false && Convert.IsDBNull(obj2) == false) { //if (c.DataType == typeof(string)) { if (obj1.ToString().Trim().Equals(obj2.ToString().Trim())) { continue; } } } result.Add(key, c, r1, r2, null); } } } } } foreach (DataRow r2 in tbl2.Rows) { string key = GetFilterString(r2, lstKey); DataRow[] rows = tbl1.Select(key); if (rows == null || rows.Length == 0) { result.Add(key, null, null, r2, null); } else if (rows.Length > 1) { lock (lstDuplicatesKey) { if (lstDuplicatesKey.Contains(key) == false) { lstDuplicatesKey.Add(key); } } } } foreach (string key in lstDuplicatesKey) { reconcileDuplicates(key, result, lstIgnore, lstAmbiguousSortKey, tbl1, tbl2); } return(result); }
/* * This reconciliation is done between different schema table */ public static ReconcileResult CustomReconcile(DataTable tbl1, DataTable tbl2, string table1_header, string table2_header, Dictionary <string, string> dictKey, Dictionary <string, string> dictCompareColumns, Dictionary <string, string> dictAmbigousSortKey, BaseReconcile reconcileMethod = null) { ReconcileResult result = new ReconcileResult(table1_header, table2_header); if (reconcileMethod == null) { reconcileMethod = new BaseReconcile(); } Dictionary <string, string> dictDuplicatesKey = new Dictionary <string, string>(Math.Max(tbl1.Rows.Count, tbl2.Rows.Count)); string strSortKeyTbl1 = GetSortString(dictKey.Keys.ToList()); List <string> lstKey2 = new List <string>(); foreach (string k in dictKey.Keys) { lstKey2.Add(dictKey[k]); } string strSortKeyTbl2 = GetSortString(lstKey2); tbl1.DefaultView.Sort = strSortKeyTbl1; tbl2.DefaultView.Sort = strSortKeyTbl2; foreach (DataRow r1 in tbl1.Rows) { string tbl1_key = GetFilterString(r1, dictKey.Keys.ToList()); if (dictDuplicatesKey.ContainsKey(tbl1_key)) { continue; } string tbl2_key = GetCounterpartFilterString(r1, dictKey, true); DataRow[] rows = tbl2.Select(tbl2_key); if (rows == null || rows.Length == 0) { result.Add(tbl1_key, null, r1, null, null); } else { if (rows.Length > 1) { lock (dictDuplicatesKey) { if (dictDuplicatesKey.ContainsKey(tbl1_key) == false) { dictDuplicatesKey.Add(tbl1_key, tbl2_key); } } } else { DataRow r2 = rows[0]; reconcileMethod.Reconcile(result, r1, r2, tbl1_key, table1_header, table2_header, dictKey, dictCompareColumns); } } } int i = 0; foreach (DataRow r2 in tbl2.Rows) { i++; string tbl1_key = GetCounterpartFilterString(r2, dictKey, false); if (dictDuplicatesKey.ContainsKey(tbl1_key)) { continue; } string tbl2_key = GetFilterString(r2, dictKey.Values.ToList()); DataRow[] rows = tbl1.Select(tbl1_key); if (rows == null || rows.Length == 0) { result.Add(tbl1_key, null, null, r2, null); } else if (rows.Length > 1) { lock (dictDuplicatesKey) { if (dictDuplicatesKey.ContainsKey(tbl1_key) == false) { dictDuplicatesKey.Add(tbl1_key, tbl2_key); } } } } foreach (string key in dictDuplicatesKey.Keys) { Console.WriteLine("Duplicate in " + key); reconcileCustomDuplicates(key, dictDuplicatesKey[key], result, dictCompareColumns, dictAmbigousSortKey, tbl1, tbl2, reconcileMethod); } return(result); }