写了个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. sed awk 练习

    #定位到某一行 添加内容 lower_case_flag=`cat /etc/my.cnf|grep "^lower_case_table_names"` if [ "X ...

  2. 如何妥善处理WebBrowser对Javascript的错误问题,阻止JS弹出框,提高用户体验

    由于项目需求,最近转战客户端,开始搞浏览器开发.众所周知,现在在微软平台上开发浏览器,最常用的方法就是扩展Webbrowser,但是首先要清楚的是,WebBrowser控件仅仅是对WebBrowser ...

  3. 给java mongodb 官方driver 增加bean 操作

      mongodb官方的java driver不支持直接插入java bean,只能使用DbObject的Key,Value形式进行insert,update,(c# mongodb官方driver类 ...

  4. dd- Linux必学的60个命令

    1.作用 dd命令用来复制文件,并根据参数将数据转换和格式化. 2.格式 dd [options] 3.[opitions]主要参数 bs=字节:强迫 ibs=<字节>及obs=<字 ...

  5. CGLayer和CALayer区别

    CGLayer是一种很好的缓存常绘内容的方法.注意,不要与CALayer混淆.CALayer是Core Animation中更加强大.复杂的图层对象,而CGLayer是Core Graphics中优化 ...

  6. java 用户注册登陆Demo

    一个用户注册登陆的系统,用到了MD5加密处理密码,实现了一个简单的数据库连接池connectionPool, 实现了注册,登陆,登陆之后修改用户信息等功能,非常适合初学者 一.准备工作 数据库:MyS ...

  7. 用 vue 脚手架 vue-cli 初始化(新建)项目

    前提:已经安装 node.js 和 git 1.在需要创建的文件夹中,右击 -> Git  Bush Here ,然后输入命令 vue init webpack "文件名"( ...

  8. Python-新手爬取安居客新房房源

    新手,整个程序还有很多瑕疵. 1.房源访问的网址为城市的拼音+后面统一的地址.需要用到xpinyin库 2.用了2种解析网页数据的库bs4和xpath(先学习的bs4,学了xpath后部分代码改成xp ...

  9. 切片 及 range 点睛回炉

    print(list(range(-1,-5,-1))) # [-1, -2, -3, -4] # range(x,y,z) ''' 首先把 x的数值放在 数轴上 z 的正负决定 x 向前搜索(为正) ...

  10. jmeter-监听器介绍与使用

    12.jmeter-监听器介绍与使用 jmeter-监听器介绍与使用 察看结果树 Summary Report 聚合报告 Backend Listener Aggregate Graph 断言结果 C ...