比较文件与没有主键的数据库表

本文关键字:数据库 文件 比较 | 更新日期: 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);
}