利用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(); }
}
}

利用Microsoft.VisualBasic中TextFieldParser解析器把CSV格式倒入数据库的更多相关文章
- 爬虫中BeautifulSoup4解析器
CSS 选择器:BeautifulSoup4 和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据. lxml 只会 ...
- SpringMVC中视图解析器
视图解析器:固定写法直接coppy就行 1.dispatcherServlet-servlet.xml中添加 <!-- 视图解析器InternalResourceViewResolver --& ...
- 浏览器中“JavaScript解析器”工作原理
浏览器在读取HTML文件的时候,只有当遇到<script>标签的时候,才会唤醒所谓的“JavaScript解析器”开始工作. JavaScript解析器工作步骤: 1.“找一些东西”: v ...
- spring中EL解析器的使用
SpEL对表达式语法解析过程进行了很高的抽象,抽象出解析器.表达式.解析上下文.估值(Evaluate)上下文等对象,非常优雅的表达了解析逻辑.主要的对象如下: 类名 说明 ExpressionPar ...
- Bash中使用MySQL导入导出CSV格式数据[转]
转自: http://codingstandards.iteye.com/blog/604541 MySQL中导出CSV格式数据的SQL语句样本如下: select * from test_inf ...
- Elasticsearch:如何把Elasticsearch中的数据导出为CSV格式的文件
本教程向您展示如何将数据从Elasticsearch导出到CSV文件. 想象一下,您想要在Excel中打开一些Elasticsearch中的数据,并根据这些数据创建数据透视表. 这只是一个用例,其中将 ...
- JAVA中RSS解析器(rome.jar和jdom.jar)范例
1.需要 jdom.jar 和 rome.jar 这两个包.2.创建一个项目,web.xml的内容如下: 代码如下 复制代码 <?xml version="1.0" enco ...
- 将组策略中的内容导出至CSV格式
#将组策略首选项中的"本地用户和组"下的所有条目导出 $xml = Get-GPOReport -ReportType Xml -Name "China Desktop ...
- 关于如何将html中的表格下载成csv格式的方法
今天在网上看了很多方法,自己还是慢慢探索写出了最终效果 简单代码如下: <!DOCTYPE html> <html> <head> <meta content ...
随机推荐
- 关于Collection接口和Map
Iterable才是Collection的父接口.不是Iterator. Map,SortedMap属于接口类型,不可以new的方式创建对象. HashMap基于哈希表实现Map接口的类,并允许nul ...
- python3-常用模块之序列化
序列化 : 把其他的数据类型转换成 字符串或者bytes 序列 : 列表.元组.字符串.bytes 为什么要把其他数据类型转换成字符串? 能够在网络上传输的只能是bytes,能够存储在文件里的只有by ...
- HDU--2602(0-1背包)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2602 分析:一个0-1背包问题.记得<背包九讲>的方法. dp[j]=max{dp[j],d ...
- Ubuntu下U盘能看见盘符但打不开
查看U盘状态 sudo fdisk -l 格式化 sudo mkfs -t vfat -I /dev/sdb1 sudo mkfs -t ntfs -I /dev/sdb1 sudo mkfs -t ...
- adb命令总结
- vue 实现单选框
参考:https://blog.csdn.net/qq_42221334/article/details/81630634 效果: vue: <template> <div> ...
- QInotifyFileSystemWatcherEngine::addPaths: inotify_add_watch failed: 设备上没有空间
解决办法: 添加最大监控文件数量 临时解决:(重启之后恢复) 命令设置:sudo sysctl fs.inotify.max_user_watches=524288 生效: sudo sysctl - ...
- main函数执行前后还会发生什么
问题分析 首先main()函数只不过是提供了一个函数入口,在main()函数中的显示代码执行之前,会由编译器生成_main函数,其中会进行所有全局对象的构造以及初始化工作.简单来说对静态变量.全局变量 ...
- Django项目:CRM(客户关系管理系统)--72--62PerfectCRM实现CRM讲师讲课记录
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- Hibernate命名策略
hibernate的命名策略,可以减少对数据库标识符命名的维护,进一步减少这部份命名的重复性代码量,以提高维护. hibernate的命名方式,有两类,一类是显式命名,一类是隐式命名. 显式命名:在映 ...