写了个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发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名木宛城主(包含链接)

利用Microsoft.VisualBasic中TextFieldParser解析器把CSV格式倒入数据库的更多相关文章

  1. 爬虫中BeautifulSoup4解析器

    CSS 选择器:BeautifulSoup4 和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据. lxml 只会 ...

  2. SpringMVC中视图解析器

    视图解析器:固定写法直接coppy就行 1.dispatcherServlet-servlet.xml中添加 <!-- 视图解析器InternalResourceViewResolver --& ...

  3. 浏览器中“JavaScript解析器”工作原理

    浏览器在读取HTML文件的时候,只有当遇到<script>标签的时候,才会唤醒所谓的“JavaScript解析器”开始工作. JavaScript解析器工作步骤: 1.“找一些东西”: v ...

  4. spring中EL解析器的使用

    SpEL对表达式语法解析过程进行了很高的抽象,抽象出解析器.表达式.解析上下文.估值(Evaluate)上下文等对象,非常优雅的表达了解析逻辑.主要的对象如下: 类名 说明 ExpressionPar ...

  5. Bash中使用MySQL导入导出CSV格式数据[转]

    转自: http://codingstandards.iteye.com/blog/604541 MySQL中导出CSV格式数据的SQL语句样本如下:   select * from test_inf ...

  6. Elasticsearch:如何把Elasticsearch中的数据导出为CSV格式的文件

    本教程向您展示如何将数据从Elasticsearch导出到CSV文件. 想象一下,您想要在Excel中打开一些Elasticsearch中的数据,并根据这些数据创建数据透视表. 这只是一个用例,其中将 ...

  7. JAVA中RSS解析器(rome.jar和jdom.jar)范例

    1.需要 jdom.jar 和 rome.jar 这两个包.2.创建一个项目,web.xml的内容如下: 代码如下 复制代码 <?xml version="1.0" enco ...

  8. 将组策略中的内容导出至CSV格式

    #将组策略首选项中的"本地用户和组"下的所有条目导出 $xml = Get-GPOReport -ReportType Xml -Name "China Desktop ...

  9. 关于如何将html中的表格下载成csv格式的方法

    今天在网上看了很多方法,自己还是慢慢探索写出了最终效果 简单代码如下: <!DOCTYPE html> <html> <head> <meta content ...

随机推荐

  1. Python自学--part2

    概要 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 一.列表.元祖操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 na ...

  2. 如何使用Pig集成分词器来统计新闻词频?

    散仙在上篇文章中,介绍过如何使用Pig来进行词频统计,整个流程呢,也是非常简单,只有短短5行代码搞定,这是由于Pig的内置函数TOKENIZE这个UDF封装了单词分割的核心流程,当然,我们的需求是各种 ...

  3. 2019-8-31-dotnet-手动解决-json-解析中不合法字符串

    title author date CreateTime categories dotnet 手动解决 json 解析中不合法字符串 lindexi 2019-08-31 16:55:58 +0800 ...

  4. 初识css3 3d动画效果

    (先看我博客右上角的3d盒子动画效果,目前没做兼容处理,最好最新的chrome看)无意间看到网上css3写的3d动画效果,实在炫酷,以前理解为需要js去计算去写,没想到css直接可以实现.于是开始研究 ...

  5. 微信audio自动播放(ios播放问题)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. MySQL实战总结

    极客上买了<MySQL实战45讲>,用导图大致总结后,跟大家分享下

  7. PAT甲级——A1043 Is It a Binary Search Tree

    A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...

  8. hibernate 多表关联外键问题无法截断表的解决办法

    目前只有一个办法 就是手动清除其他表的外键关联,然后在做一个小swing单独去操作这个表,而不运行主控方相关的代码 当web运行后,外键会再次设置好

  9. Maven中央仓库地址大全,Maven中央仓库配置示例

    < Maven 中央仓库地址大全 > 在上一篇文章中完成了 < Maven镜像地址大全 >,后来又花了时间又去收集并整理了关于 maven 远程仓库地址,并整理于此,关于 Ma ...

  10. 代理模式(Proxy、Subject、RealSubject)(代购火车票)

    .(为其他对象提供一种代理以控制对这个对象的访问.) 在实际的软件开发中,我们经常面临着对一个对象进行访问控制的问题,由于跨越网络或安全方面等原因不能直接或不需要直接被访问,直接访问的代价会给系统带来 ...