利用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 ...
随机推荐
- shell对文件,文件夹的操作
x=$ OUTFILENAME="output_${x}.sql" if [ -f $OUTFILENAME ];then rm $OUTFILENAME fi 如果文件存在则删除 ...
- ie浏览器下载附件中文乱码
String llq = request.getHeader( "USER-AGENT" ).toLowerCase();Boolean isIE = false;if (llq. ...
- java中 &&与& ||与| 的区别
public class Demo { public static void main(String[] args) { int i = 5; int j = 3; // || 与 | 的区别 boo ...
- vue 模版组件用法
第一种 //首先,别忘了引入vue.js <div id="user_name_01"></div> <script src="../nod ...
- springboot2 +thymeleaf
springboot 1.5. 9+ thymeleaf <!--sidebar--> <nav class="col-md-2 d-none d-md-block bg- ...
- Java基础知识(多线程和线程池)
新建状态: 一个新产生的线程从新状态开始了它的生命周期.它保持这个状态直到程序 start 这个线程. 运行状态:当一个新状态的线程被 start 以后,线程就变成可运行状态,一个线程在此状态下被认为 ...
- 洛谷P3749 [六省联考2017]寿司餐厅
传送门 题解 这几道都是上周llj讲的题,题解也写得十分好了,所以直接贴了几个链接和代码. //Achen #include<algorithm> #include<iostream ...
- leyou_02_nginx使用域名访问本地项目
1.nginx的搭建依赖环境 1.1 准备jdk环境 当前最新版本下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index. ...
- centos7如何配置yum仓库
centos7如何配置yum仓库 一.总结 一句话总结: 备份原仓库配置原件,接来下按需求 百度 是指定本地光盘作为yum仓库,还是使用网络源作为yum仓库 二.centos7如何配置yum仓库 1. ...
- thinkphp+ajax 实现点击加载更多数据
https://blog.csdn.net/a898712940/article/details/78545599?utm_source=blogxgwz8 适用范围:thinkphp3.2和thin ...