您的位置:首页 > 数据库

如何读取CSV文件到DataTable中,然后存到数据库

2013-12-17 10:12 369 查看
public void FileToDB()
{
string line = "";//将文件中的一行数据读出,赋值给line
int i = 0;//计数文件中的行数
int linenumber = 0;//文件中的总行数
string sql = "select top 1 * from 表";//从数据库读取某一张表,主要是为了获取表的结构
DataSet dt = DataSelectMyTest(sql, "table");//执行sql语句,返回DataSet
dt.Clear();//清空数据
string fileName = @"csv文件的绝对路径";
FileStream fs = new FileStream(fileName, FileMode.Open);
System.Text.Encoding iso_8859_1 = System.Text.Encoding.GetEncoding("iso-8859-1");//西欧语言里的iso 8859-1
StreamReader m_streamReader = new StreamReader(fs, iso_8859_1);
linenumber = m_streamReader.ReadToEnd().Split('\n').Length;
//Console.WriteLine("文件一共有{0}行!",linenumber);
fs.Seek(0, SeekOrigin.Begin);//回转到文件开头
DataTable Table = new DataTable("table");
while (((line = m_streamReader.ReadLine()) != null))
{
i++;
if (i == 1)//第一行是列名
{
string[] str = CutComma(line);//去除列名之间的所有空格
for (int k = 0; k < str.Length; k++)
{
str[k] = CutSpace(str[k]);//去除列名中的空格
DataColumn Column = new DataColumn();
Column.DataType = System.Type.GetType("System.String");
Column.ColumnName = str[k].ToString();
Table.Columns.Add(Column);
}
}
if (i <= linenumber - 1 && i > 1)//(文件的第一行就是列名,文件结尾多出来一行空白的)
{
int i1 = 0;
string str = "";
DataRow temprow = Table.NewRow();
bool flag = true;
for (int j = 0; j < line.Length; j++)
{
if (flag == true)
{
if (line[j] == '\"')
{
flag = false;
continue;
}
else if (line[j] != ',')
{
str = str + line[j];
if (j == line.Length - 1)
{
temprow[i1] = str;//最后一列不为空的时候
}
}
else if (line[j] == ',' && line[j - 1] != '\"')
{
//赋值
temprow[i1] = str;
str = "";
i1 = i1 + 1;
if (j == line.Length - 1)
{
temprow[i1] = str;//最后一列为空的时候
}
}
}
else
{
if (line[j] != '\"')
{
str = str + line[j];
}
else
{
flag = true;
//赋值
temprow[i1] = str;
str = "";
i1 = i1 + 1;
continue;
}
}
}
Table.Rows.Add(temprow);
}
}
}

string strConnection = "数据库的配置";
SqlConnection conn = new SqlConnection(strConnection);
SqlBulkCopy bcp = new SqlBulkCopy(conn);
conn.Open();
bcp.DestinationTableName = "数据库中对应的表";
bcp.WriteToServer(dt.Tables["table"]); //把数据写入到一张表中
conn.Close();
dt.Clear();
}
//代码还可以进一步的优化,比如,有可能数据库中的表结构,和CSV中的并不对应,届时,就需要自己对列进行一一对应了
//需要注意的是csv文件的编码,以及使用那个notepad++打开文件,列与列之间怎么分隔开的
//在数据库配置之前,需要把之前创建的Table放到dt中名为"table"的表中,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: