【发布时间】:2026-01-16 03:50:02
【问题描述】:
假设我有两个查询结果存储在两个不同的 .csv 文件(1.csv、2.csv)中,数据如下所示:
- 1.csv:
- 2.csv
dim1 & dim2 将在每个查询表结果中存在,字段可以不同。
我怎样才能得到这样的结果?
- 结果
字段在结果表中唯一连接,行按键分组(dim1和dim2)
我使用List<List<string>> 来表示每个表格结果:
public static List<List<string>> R1 { get; } = new List<List<string>>
{
new List<string> {"dim1", "dim2", "field1"},
new List<string> {"2", "wwa", "3"},
new List<string> {"1", "arr", "6"}
};
public static List<List<string>> R2 { get; } = new List<List<string>>
{
new List<string> {"dim1", "dim2", "field2", "field3"},
new List<string> {"2", "jaja", "1000", "2"},
new List<string> {"3", "wwa", "1000", "3"},
new List<string> {"1", "arr", "2000", "4"}
};
我采用了以下策略:
var keys = 2;
var results = new List<List<string>>();
foreach (var r1 in R1)
{
var range = r1.GetRange(0, keys);
var hash = range.GetKey();
var found = false;
var row = new List<string>();
foreach (var r2 in R2)
{
if (r2.GetRange(0, keys).GetKey() == hash)
{
row.AddRange(range);
row.AddRange(r1.GetRange(keys, r1.Count - keys));
row.AddRange(r2.GetRange(keys, r2.Count - keys));
results.Add(row);
found = true;
}
}
if (!found)
{
row.AddRange(r1);
R2[0].GetRange(keys, R2[0].Count - keys).ForEach(e => row.Add(null));
results.Add(row);
}
}
foreach (var r2 in R2)
{
var range = r2.GetRange(0, keys);
var hash = range.GetKey();
var found = false;
var row = new List<string>();
foreach (var r in results)
{
if (r.GetRange(0, keys).GetKey() == hash)
found = true;
}
if (!found)
{
row.AddRange(range);
R1[0].GetRange(keys, R1[0].Count - keys).ForEach(e => row.Add(null));
row.AddRange(r2.GetRange(keys, r2.Count - keys));
results.Add(row);
}
}
如您所见,我的复杂度为 2xN^2,我认为应该有更好的解决方案来生成适合上述示例的新 List<List<string>>。
【问题讨论】:
-
您是否研究过一些支持连接操作的 ETL 框架?
-
这需要在内存中完成,因为列是动态的,dim1、dim2 对于其他查询可能不同,并且在某些情况下您可以将一个或多个维度作为分组键。
标签: c# .net list dictionary