比较文件与没有主键的数据库表
本文关键字:数据库 文件 比较 | 更新日期: 2023-09-27 18:15:00
我有平面文件…它有管道分隔的值…此外,我们还为每个文件提供了相应的表。
表/文件没有唯一的/主列
为了比较数据,我们将文件转换为数据表(c#,.net)
取DB_Datatable的第一行…将它与file_DataTable
中的每一行进行比较如果我们在file_dataTable中找不到匹配…
在这种情况下,如果两个表都匹配…如果每个表有10条记录……将有100行比较。
这个逻辑是有效的,但是对于大于20K的文件,它需要花费大量的时间。
谁能给我建议一个更好的方法?注意:我们可以为每一行做一个哈希(使用每一行的内容)…在此基础上排序?
使用DataRowComparer<TRow>
和Dictionary
。
示例用法(不是比较两个数据表,但是,这应该让您入门):
var dt = new DataTable();
dt.Columns.Add("Foo", typeof(string));
dt.Columns.Add("Bar", typeof(int));
dt.Rows.Add("Test", 1);
dt.Rows.Add("Test", 2);
dt.Rows.Add("Testing",1);
dt.Rows.Add("Testing",1);
var dictionary = new Dictionary<DataRow, int>(DataRowComparer<DataRow>.Default);
foreach(var row in dt.AsEnumerable())
{
if (!dictionary.ContainsKey(row)) dictionary[row] = 1;
else dictionary[row]++;
}
输出如预期的那样:它显示了3项,第三项("Testing", 1)的值为2。
或者,您可以使用具有相同自定义比较器的HashSet
。查找至少应该是O(1)而不是O(n)
无论哪种方法,复杂度都应从O(n1 * n2)降低到O(n)
var dt = new DataTable();
dt.Columns.Add("Foo", typeof(string));
dt.Columns.Add("Bar", typeof(int));
dt.Rows.Add("Test", 1);
dt.Rows.Add("Test", 2);
dt.Rows.Add("Testing",1);
dt.Rows.Add("Testing",1);
var hash = new HashSet<DataRow>(DataRowComparer<DataRow>.Default);
foreach(var row in dt.AsEnumerable())
{
if (hash.Contains(row)) Console.WriteLine("Already in data set");
hash.Add(row);
}