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

简介:

写了个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();

        }
    }
}
复制代码

 

本博客为 木宛城主原创,基于 Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 木宛城主(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
分类: 杂谈

本文转自木宛城主博客园博客,原文链接:http://www.cnblogs.com/OceanEyes/archive/2013/06/04/TextFieldParser.html,如需转载请自行联系原作者
目录
相关文章
|
9月前
|
存储 缓存 自然语言处理
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
268 8
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
|
SQL 数据挖掘 测试技术
南大通用GBase8s数据库:LISTAGG函数的解析
南大通用GBase8s数据库:LISTAGG函数的解析
|
数据库 索引
深入探索数据库索引技术:回表与索引下推解析
【10月更文挑战第15天】在数据库查询优化的领域中,回表和索引下推是两个核心概念,它们对于提高查询性能至关重要。本文将详细解释这两个术语,并探讨它们在数据库操作中的作用和影响。
306 3
|
8月前
|
存储 关系型数据库 数据库
高性能云盘:一文解析RDS数据库存储架构升级
性能、成本、弹性,是客户实际使用数据库过程中关注的三个重要方面。RDS业界率先推出的高性能云盘(原通用云盘),是PaaS层和IaaS层的深度融合的技术最佳实践,通过使用不同的存储介质,为客户提供同时满足低成本、低延迟、高持久性的体验。
|
数据采集 数据库 Python
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
709 174
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
人工智能 搜索推荐 API
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
cobalt 是一款开源的流媒体下载工具,支持全平台视频、音频和图片下载,提供纯净、简洁无广告的体验
2121 9
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
|
存储 负载均衡 监控
数据库多实例的深入解析
【10月更文挑战第24天】数据库多实例是一种重要的数据库架构方式,它为数据库的高效运行和灵活管理提供了多种优势。在实际应用中,需要根据具体的业务需求和技术环境,合理选择和配置多实例,以充分发挥其优势,提高数据库系统的性能和可靠性。随着技术的不断发展和进步,数据库多实例技术也将不断完善和创新,为数据库管理带来更多的可能性和便利。
593 57
|
存储 数据采集 数据挖掘
CSV vs 数据库:数据存储的最佳选择是什么
本文介绍了爬虫数据存储中CSV和数据库的优缺点,分析了两者在不同场景下的适用性。CSV简单易用、资源消耗低,适合小量数据;数据库则在处理大量数据和复杂查询时表现出色,支持并发操作。通过Python代码示例,展示了如何使用多线程和爬虫代理IP技术将百度搜索数据存储到MySQL数据库中,适用于大型项目和复杂数据分析需求。
797 2
|
存储 关系型数据库 MySQL
double ,FLOAT还是double(m,n)--深入解析MySQL数据库中双精度浮点数的使用
本文探讨了在MySQL中使用`float`和`double`时指定精度和刻度的影响。对于`float`,指定精度会影响存储大小:0-23位使用4字节单精度存储,24-53位使用8字节双精度存储。而对于`double`,指定精度和刻度对存储空间没有影响,但可以限制数值的输入范围,提高数据的规范性和业务意义。从性能角度看,`float`和`double`的区别不大,但在存储空间和数据输入方面,指定精度和刻度有助于优化和约束。
1936 5

推荐镜像

更多
  • DNS