文档章节

利用Microsoft.VisualBasic中TextFieldParser解析器把CSV格式倒入数据库

 木宛城主
发布于 2015/03/02 19:43
字数 677
阅读 8
收藏 0

写了个Demo,利用Microsoft.VisualBasic这个程序集中的TextFieldParser解析器解析CSV格式的文件,然后将解析的数据插入到相关表,这样的好处是不用去用令人头疼的ODBC去操作CSV格式文件,如之前是这样去操作:

利用ODBC去操作

string strConnString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + this.dirCSV.Trim() + ";Extensions=asc,csv,tab,txt;Persist Security Info=False";
                    string sql_select;
                    OdbcConnection conn;
                    conn = new OdbcConnection(strConnString.Trim());
                    conn.Open();
                    OdbcCommand commandRowCount = new OdbcCommand("SELECT COUNT(*) FROM [" + this.FileNevCSV.Trim() + "]", conn);
                    this.rowCount = System.Convert.ToInt32(commandRowCount.ExecuteScalar());
                    sql_select = "select * from [" + this.FileNevCSV.Trim() + "]";
                    OdbcCommand commandSourceData = new OdbcCommand(sql_select, conn);
                    OdbcDataReader dataReader = commandSourceData.ExecuteReader();
                    DataTable dt;
                    dt = dataReader.GetSchemaTable();

利用TextFieldParser操作

namespace ImportCSV
{
    class Program
    {
        //连接字符串
        private static readonly string connStr = @"Data Source=BEAR\EYESSQLSERVER;Initial Catalog=Test;Integrated Security=True";
        //表明,最好做成是客配置,如Winform程序下拉框
        private static string tableName = "Customer";
        /// <summary>
        /// 执行查询,返回DataTable数据源
        /// </summary>
        /// <param name="connStr"></param>
        /// <param name="cmdText"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        static DataTable ExecuteDataTable(string connStr,string cmdText,params SqlParameter[] parameters)
        {
            using (SqlConnection conn=new SqlConnection(connStr))
            {
                using (SqlCommand cmd=conn.CreateCommand())
                {
                    cmd.CommandText = cmdText;
                    cmd.Parameters.AddRange(parameters);
                    using (SqlDataAdapter adapter=new SqlDataAdapter(cmd))
                    {
                        DataTable dataTable=new DataTable();
                        adapter.Fill(dataTable);
                        return dataTable;
                    }
                }
            }
        }
        /// <summary>
        /// 得到主键列
        /// </summary>
        /// <returns></returns>
        static List<string> GetKeyWords()
        {
            //SQL Server 系统试图得到主键列
            string sql = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME=@TABLE_NAME";
            DataTable dt=ExecuteDataTable(connStr, sql, new SqlParameter("TABLE_NAME", tableName));
            List<string> listKeyWords=new List<string>();
            foreach (DataRow row in dt.Rows)
            {
                string keyWord = Convert.ToString(row["COLUMN_NAME"]);
                listKeyWords.Add(keyWord);
            }
            return listKeyWords;
        }
        /// <summary>
        /// 得到指定表所有的列
        /// </summary>
        /// <returns></returns>
        static List<string> GetAllColumns()
        {
            //系统视图得到所有列
            string sql = "select * from  INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=@TABLE_NAME";
            DataTable dt = ExecuteDataTable(connStr, sql, new SqlParameter("TABLE_NAME", tableName));
            List<string> listCols = new List<string>();
            foreach (DataRow row in dt.Rows)
            {
                string columnName = Convert.ToString(row["COLUMN_NAME"]);
                listCols.Add(columnName);
            }
            return listCols;
        }
        /// <summary>
        /// 得到初主键外所有列
        /// </summary>
        /// <returns></returns>
        static List<string> GetAllColumnsWithoutKeyWords()
        {

            List<string> listAllColumns = GetAllColumns();
            List<string> listKeyWords= GetKeyWords();
            return listAllColumns.Except(listKeyWords).ToList();
        }
        /// <summary>
        /// 得到除Identity(标识)外所有列
        /// </summary>
        /// <returns></returns>
        static List<string> GetAllColumnsWithoutIdentity()
        {
            //得到Identity标志列
            string sql = @"select COLUMN_NAME
                                    from INFORMATION_SCHEMA.COLUMNS
                                    where TABLE_SCHEMA = 'dbo'
                                    and COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1
                                    and TABLE_NAME=@TABLE_NAME";
            DataTable dt = ExecuteDataTable(connStr, sql, new SqlParameter("TABLE_NAME", tableName));
            List<string> listColumnsWithoutIdentity = new List<string>();
            foreach (DataRow row in dt.Rows)
            {
                listColumnsWithoutIdentity.Add(Convert.ToString(row["COLUMN_NAME"]));
            }
            List<string> listAllColumns = GetAllColumns();
            //从所有列中排除
            return listAllColumns.Except(listColumnsWithoutIdentity).ToList();
        }

   

        static void Main(string[] args)
        {
            
            using (SqlConnection connection = new SqlConnection(connStr))
            {
                using (SqlCommand cmd = connection.CreateCommand())
                {
                    //得到所有列除Identity标志列
                    string[] columnsWithoutIdentity = GetAllColumnsWithoutIdentity().ToArray();
                    //SQL参数
                    string[] columnsParameters = (from c in columnsWithoutIdentity select "@" + c).ToArray();

                    StringBuilder sb=new StringBuilder();
                    //拼接Insert SQL语句
                    sb.AppendLine("insert into " + tableName + "(" + string.Join(",", columnsWithoutIdentity) +
                                  ") output inserted.id values(" + string.Join(",",columnsParameters)+ ")");
                    cmd.CommandText = sb.ToString();
                    //从路径得到csv的文件,可以做成打开框
                    using (var myCsvFile = new TextFieldParser(@"C:\Users\eyeswang\Desktop\xxxx.csv",Encoding.Default))
                    {
                        myCsvFile.TextFieldType = FieldType.Delimited;
                        myCsvFile.SetDelimiters(",");//设置解析器分割符
                        connection.Open();
                        //循环,一行一行读
                        while (!myCsvFile.EndOfData)
                        {
                            string[] fieldArray;
                            try
                            {
                                //读取一行
                                fieldArray = myCsvFile.ReadFields();
                                for (int i = 0; i < fieldArray.Count(); i++)
                                {
                                   //给参数赋值,如果是NULL,则DBNULL.Value插入相关列
                                    cmd.Parameters.Add("@" + columnsWithoutIdentity[i], fieldArray[i].ToUpper() == "NULL" ? (object)DBNull.Value : fieldArray[i]);
                                }
                               //执行完毕后记得Parameters Clear
                                cmd.ExecuteNonQuery();
                                cmd.Parameters.Clear();
                            }
                            catch (Microsoft.VisualBasic.FileIO.MalformedLineException ex)
                            {

                                continue;

                            }

                        }
                    }

                }
            }
            Console.WriteLine("OK");
            Console.ReadKey();

        }
    }
}

 

© 著作权归作者所有

共有 人打赏支持
粉丝 2
博文 222
码字总数 199010
作品 0
黄浦
私信 提问
Spark SQL数据源

背景 Spark SQL是Spark的一个模块,用于结构化数据的处理。 使用Spark SQL的方式有2种,可以通过SQL或者Dataset API,这两种使用方式在本文都会涉及。 其中,通过SQL接口使用的方法具体又可分...

金珑
2017/10/28
0
0
Cocos数据篇[3.4](5) ——CSV文件解析

【唠叨】 在一个游戏中,通常会有很多怪物、关卡、技能等数据,这些数据不可能在代码里写死,一般都会使用配置文件保存,使用时再加载到内存。 CSV文件编辑起来十分简单,所以常常用来配置游...

shahdza
2015/02/18
0
0
使用ArcGIS Online小贴士-Excel CSV TXT文件的使用

第一手信息,来自ArcGIS_云计算新浪微博http://weibo.com/arcgiscloud Excel是一个审查和处理数据的程序,可以很容易保存为txt或者csv文件,然后上传到ArcGIS Online上。下面有一些小贴士,来...

长平狐
2012/11/28
417
0
Apache Calcite官方文档中文版-概览-1.背景

第一部分 概览 1. 背景   Apache Calcite是一个动态数据管理框架。它包含了许多组成典型数据管理系统的经典模块,但省略了一些关键×××: 数据存储,数据处理算法和元数据存储库。   C...

Lynn_Yuan
08/16
0
0
一步一步学solr:什么是solr?

简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出...

王爵nice
2014/07/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

编程价值观、原则、模式

读自《实现模式》 模式,即是针对特定问题的通用解决方案。 每个模式都承载这一点点理论,但实际编程中存在着一些更加深远的影响力,远不是孤立的模式所能概括的。 价值观是编程过程的统一支...

遥借东风
7分钟前
0
0
php分割二级域名做跳转处理方法

使用php中的全局变量 $_SERVER['HTTP_HOST'] ,可以获得用户当前访问的域名字符串,在这里面查询自己定义的各个子域名字符串,然后使用header函数重定向到不同的页面 代码如下 if( strpos($...

Mr_Azaz
8分钟前
0
0
容器之Zookeeper的使用

我们使用zookeeper时,都是在Linux上安装zookeeper,之后启动时要加入配置文件。 使用docker之后,我们可以直接使用镜像运行容器,镜像可以从docker.hub上下载,地址是https://hub.docker.co...

克虏伯
昨天
3
0
esxi 更换ssl证书

概述 就是想换一个证书而已,你可以通过下面的途径去申请一个泛解析域名的证书之后再esxi上安装上 使用阿里云域名api申请Let’s Encrypt泛域名免费ssl证书 申请完成证书之后进行下一步 操作 ...

bboysoulcn
昨天
1
0
PLC编程入门:梯形图

梯形图(LAD)是PLC编程的最佳可视化语言,它看起来非常类似于继电器电路图,因此如果 你对继电器控制和电子电路有所了解的话,那么学起来会非常容易! 在这个教程中,我们将学习关于使用梯形...

汇智网教程
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部