C# 从文件读取并解析SQL表
以下所有操作必须在C#中完成。将使用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列的并集 例如: 文件
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关系?你应该做什么