以下所有内容必须在C#中完成。解析SQL表(SQL Server)将使用System.Data.Odbc
中的方法完成。
假设我有两个.csv文件,fi1
和fi2
。第一个csv文件有两列id
和val1
,第二个csv也有两列,id
和val2
。
我想读取这两个文件,并使用以下列将输出解析为一个SQL表:id, val1, val2
。
问题是这两个文件在id
列中可能有不同的条目:换句话说,某些ID可能具有val1
值但没有val2
值,反之亦然,或者他们可能同时拥有这两个值。
该表应包含两个文件中id
列的并集。
示例:
文件1
文件2
我希望最终SQL表看起来像这样:
请注意,每个文件可能包含重复项,我们希望在解析SQL表时排除重复项。
我的想法是创建两个词典dict1
和dict2
,其中键是id
,值为val1
和{{ 1}}。字典将用于确保不包括重复项:
val2
但是,在将每个文件添加到字典后,我不确定如何匹配两个字典的id。
有人会对如何处理这个问题有一个很好的暗示吗?
答案 0 :(得分:1)
我会做一个元组列表来保存这里的值而不是字典,以便所有信息都在一个地方而不是匹配的键,每个元组对应一个表记录
var dict = new List<Tuple<string, string, string>>();
using (StreamReader rdr = new StreamReader(fi1))
{
while (!rdr.EndOfStream)
{
string ln = rdr.ReadLine();
string[] split_ln = ln.Split(',');
dict.Add(new Tuple<string, string, string>(split_ln[0], split_ln[1],null));
}
}
using (StreamReader rdr = new StreamReader(fi2))
{
while (!rdr.EndOfStream)
{
string ln = rdr.ReadLine();
string[] split_ln = ln.Split(',');
if (dict.Any(item => item.Item1 == split_ln[0]))
{
var item = dict.Find(i => i.Item1 == split_ln[0]);
var newtuple = new Tuple<string, string, string>(item.Item1, item.Item2, split_ln[1]);
dict.Remove(item);
dict.Add(newtuple);
}
else
{
dict.Add(new Tuple<string, string, string>(split_ln[0],null,split_ln[1]));
}
}
}