C# 从文件读取并解析SQL表

C# 从文件读取并解析SQL表,c#,sql-server,odbc,C#,Sql Server,Odbc,以下所有操作必须在C#中完成。将使用System.Data.Odbc中的方法分析SQL表(SQL Server) 假设我有两个.csv文件,fi1和fi2。第一个csv文件有两列id和val1,第二个csv文件也有两列id和val2 我想读取这两个文件,并将输出解析为一个包含以下列的SQL表:id、val1、val2 问题是这两个文件在id列中可能有不同的条目:换句话说,一些id可能有val1值,但没有val2值,反之亦然,或者它们可能同时有两个值 该表应包含两个文件中id列的并集 例如: 文件

以下所有操作必须在C#中完成。将使用
System.Data.Odbc
中的方法分析SQL表(SQL Server)

假设我有两个.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
val2
。将使用字典确保不包括重复项:

 Dictionary<string, string> dict1 = new Dictionary<string, string>();
 string[] header1 = new string[]{};

 using (StreamReader rdr = new StreamReader(fi1))
 {
     header1 = rdr.ReadLine().Split(',');
     while (!rdr.EndOfStream)
     {
          string ln = rdr.ReadLine();
          string[] split_ln = ln.Split(',');
          dict1.Add(split_ln[0], split_ln[1]);
     }
 }

 Dictionary<string, string> dict2 = new Dictionary<string, string>();
 string[] header2 = new string[]{};

 using (StreamReader rdr = new StreamReader(fi2))
 {
     header2 = rdr.ReadLine().Split(',');
     while (!rdr.EndOfStream)
     {
          string ln = rdr.ReadLine();
          string[] split_ln = ln.Split(',');
          dict2.Add(split_ln[0], split_ln[1]);
     }
 }
Dictionary dict1=新字典();
字符串[]头1=新字符串[]{};
使用(StreamReader rdr=新StreamReader(图1))
{
header1=rdr.ReadLine().Split(',');
而(!rdr.EndOfStream)
{
字符串ln=rdr.ReadLine();
字符串[]split_ln=ln.split(',');
添加(拆分项[0],拆分项[1]);
}
}
Dictionary dict2=新字典();
字符串[]头2=新字符串[]{};
使用(StreamReader rdr=新StreamReader(图2))
{
header2=rdr.ReadLine().Split(',');
而(!rdr.EndOfStream)
{
字符串ln=rdr.ReadLine();
字符串[]split_ln=ln.split(',');
添加(拆分项[0],拆分项[1]);
}
}
但是,在将每个文件添加到字典后,我不确定如何匹配这两个字典的id


有人能给我一个很好的提示来解决这个问题吗?

我通常会做一个元组列表来保存这里的值,而不是字典,这样所有的信息都在一个地方,而不是匹配键,每个元组对应一个表记录

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]));
                }
            }
        }
var dict=newlist();
使用(StreamReader rdr=新StreamReader(图1))
{
而(!rdr.EndOfStream)
{
字符串ln=rdr.ReadLine();
字符串[]split_ln=ln.split(',');
dict.Add(新元组(split_ln[0],split_ln[1],null));
}
}
使用(StreamReader rdr=新StreamReader(图2))
{
而(!rdr.EndOfStream)
{
字符串ln=rdr.ReadLine();
字符串[]split_ln=ln.split(',');
if(dict.Any(item=>item.Item1==split\u ln[0]))
{
var item=dict.Find(i=>i.Item1==split_ln[0]);
var newtuple=新元组(item.Item1、item.Item2、split_ln[1]);
删除(项目);
dict.Add(新元组);
}
其他的
{
dict.Add(新元组(split_ln[0],null,split_ln[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]));
                }
            }
        }
var dict=newlist();
使用(StreamReader rdr=新StreamReader(图1))
{
而(!rdr.EndOfStream)
{
字符串ln=rdr.ReadLine();
字符串[]split_ln=ln.split(',');
dict.Add(新元组(split_ln[0],split_ln[1],null));
}
}
使用(StreamReader rdr=新StreamReader(图2))
{
而(!rdr.EndOfStream)
{
字符串ln=rdr.ReadLine();
字符串[]split_ln=ln.split(',');
if(dict.Any(item=>item.Item1==split\u ln[0]))
{
var item=dict.Find(i=>i.Item1==split_ln[0]);
var newtuple=新元组(item.Item1、item.Item2、split_ln[1]);
删除(项目);
dict.Add(新元组);
}
其他的
{
dict.Add(新元组(split_ln[0],null,split_ln[1]);
}
}
}

为什么有人投票关闭此帖子?它既有一个可复制的例子,也展示了我的尝试。我不确定这里有什么问题。不是真的,我从来没有用过元组。你能告诉我你建议如何使用它吗?谢谢你知道你的数据是否干净吗?文件1中的所有键是否都与文件2中的键匹配文件之间是否存在1-1、1-many或many-many关系?如果没有匹配,该怎么办?钥匙不必匹配。我只想取键的并集,如果一个键在其中一个值中没有对应的值,只需赋值null或其他什么。为什么需要经过C#?我会将这两个CSV导入SQL Server,然后使用TSQL加入它们。为什么有人投票关闭这篇文章?它既有一个可复制的例子,也展示了我的尝试。我不确定这里有什么问题。不是真的,我从来没有用过元组。你能告诉我你建议如何使用它吗?谢谢你知道你的数据是否干净吗?文件1中的所有键是否都与文件2中的键匹配文件之间是否存在1-1、1-many或many-many关系?你应该做什么