CSV 文件分析与导入数据库
1 简介
CSV全称 Comma Separated values,是一种用来存储数据的纯文本文件格式,通常用于电子表格或数据库软件。
1.1 规则
l 开头是不留空,以行为单位。
l 可含或不含列名,含列名则居文件第一行。
l 一行数据不垮行,无空行。
l 以半角符号[,]作分隔符,列为空也要表达其存在。
l 列内容如存在[,],则用双引号[””]将该字段内容包含起来。
l 列内容如存在[”],双引号[””]将该字段内容包含起来,并且在内容中用两个双引号表示一双引号[””]。
l 文件读写时引号,逗号操作规则互逆。
l 内码格式不限,可为ASCII、Unicode或者其他。
1.2 扩展
现在根据业务需求,将CSV文件数据导入数据库。
业务规则对CSV文件扩展如下。
l 文件开头可以使用符号 # 做为行注释。
l 文件必须包含列名定义,并且下一行为列的类型定义。
l 列内容如存在[换行],则用双引号[””]将该字段内容包含起来,换行符保留,使本记录跨行。
l 允许空行,程序或略。
2 程序设计
主要目标:读取CSV文件,导入数据库中指定的表。
该组件主要由3个类组成:
2.1 CSV文件读取流程
2.2 导入数据库流程
2.3 CsvRow 类
类图如下:
该类是分析CSV文件的核心类,负责分析文件结构与提取每一行数据,转换为指定的类型。
在构造函数中,要求传入一个等待读取数据的文本流和头结构定义。通过ReadRow()函数,提取每一行数据。
2.4 CsvDataReader类
类图如下:
该类实现了IDataReader接口,提供一个向前只读的流访问CSV文件数据。
根据微软建议:用户并不直接创建 DataReader 类的实例,而是通过使用Command对象的 ExecuteReader 方法获取 DataReader 实例。因此,将 DataReader 构造函数标记为内部构造函数。这里,我们通过CsvDataReader. ExecuteReader ()方法,创建该对象实例。
ExecuteReader ()方法接受文件路径或文本流参数,并在构造期间,分析CSV文件头,存入属性Head中。通过IDataReader接口的Read(),GetValue(),Close()等方法进行数据访问。
2.5 Importer类
类图如下:
该类负责将CSV数据导入数据。
根据用户提供的导入模式UseTableStruct,将CSV文件与数据库表进行不同规则的比较,并且使用SqlBulkCopy做为大容量数据导入工具。同时也限制了只能导入SQL数据库。
用户可以将设置UseStruct属性设置为UseTableStruct. RebuildStruct,实现直接由CSV创建表,也可以更新原有表结构(删除重建)。
3 事例
3.1 使用 CsvDataReader
private static void ExectureReadCsvFile(string p_filepath) { using (CsvDataReader actual = CsvDataReader.ExecuteReader(p_filepath, System.Text.ASCIIEncoding.Default)) { for (int i = 0; i < actual.FieldCount; i++) { Trace.Write(actual.GetName(i)); Trace.Write("/t"); } Trace.Write("/r/n");
while (actual.Read()) { for (int i = 0; i < actual.FieldCount; i++) { Trace.Write(actual.GetString(i)); Trace.Write("/t"); } Trace.Write("/r/n"); } } } |
3.2 使用 Importer
Importer importer = new Importer("item.csv", "item_table", "key"); importer.Import(); |
下载
http://download.csdn.net/source/592332
http://download.csdn.net/greenery
注意:样例代码使用了VS2008的部分特性