利用Microsoft Text Driver 加载CSV

这一段时间,接触了不少CSV 文件。都是通过TextDriver 来处理的。有两种方式 :第一种是在数据库中建立一个表,然后一次性地将数据从CSV文件导入到表中;第二种方式是直接讲CSV文件所在的文件夹作为数据库,而将CSV文件作为数据库表来使用。

第一种方式: 先入库后使用

我们假设现在有有一个CSV文件Contacts.CSV 文件的内容是联系人信息。首先我们需要在数据库中建一个对应的表TC_Contacts,然后利用下面的SQL代码将CSV文件导入到这个表里面:

 

将CSV导入到数据库表

 

其中:1.TC_Contacts为目标表的名字。

          对于目标表,要求对应的字段能够接收CSV文件中对象列的数据,这里特别需要注意的是字符串的长度,日期时间格式和整数浮点数的处理;由于CSV文件中实际上都是字符串,那么在导入的过程中就有可能出现不能转换的情况。例如:日期格式不符合数据库的要求,或者字符串不能转化为整数或者浮点数等。

         对于目标表,字段数目和顺序可以和CSV文件中的不一样。其实在整个的SQL语句中只有OPENROWSET是用来处理CSV文件的。其它部分都是普通的T-SQL,在T-SQL中能做的事情在这里都可以做。例如:如果你的TC_Contacts比CSV多一个字段gid uniqueidentifier ,那么就可以把SQL语句修改为:

 

目标表的字段比较多

    这样就可以给每条记录增加一个id了。

    2.SQL代码中的DefaultDir 也就是D:\Data 是指存在于SQL Server服务器上的位置,而不是在提交该代码的客户机上。这一点对于初次接触的人来说很关键。SQL Server如果在服务器上找不到文件会报告错误。但是这个错误的消息不是那么直接了当。

    3.有的CSV文件中第一行不是列标题,而是和其它行一样是普通的数据行。这个时候就需要一个Schema.ini来定义CSV文件的格式。Schema.ini的格式我会专门写一篇来介绍一下。在Schema.ini文件中会指定CSV文件的一些特性,这样有助于Microsoft Text Driver来处理数据.

 

第二种:直接使用

这种方式,目前我只知道在代码里面如何使用:下面是一段C#的代码,用来实现下面几个操作:

1.连接到CSV文件夹

2.从一张表中按条件读取数据

 1public DataTable LoadCSV(){
 2 //E:\CSV是CSV文件所在的文件夹
 3string aConnStr="Driver={Microsoft Text Driver (*.txt;*.csv)};Dbq=E:\\CSV; Extensions=asc,csv,tab,txt; Persist Security Info=False";
 4      using (OdbcConnection aCon = new OdbcConnection(aConnStr))
 5      {
 6        aCon.Open();
 7        //Leads.CSV是我们要读取的CSV文件
 8        string aSQL = "select * from Leads.CSV";
 9        OdbcDataAdapter aDataAdapter = new OdbcDataAdapter(aSQL, aCon);
10        DataTable aTable = new DataTable();
11        aDataAdapter.Fill(aTable);
12        return aTable;
13      }

14}

        和第一种方法一样,如果CSV文件中没有列标题,那么也需要提供schema.ini文件来确定表结构。

第一种方法的优点在于:可以一次将大量的数据写入到SQL Server表里面去,这样就可以利用数据库的能力在做下一步的处理操作.

第二种方法的优点在于: 可以在代码中直接使用CSV的数据,不需要先载入到数据库这样一个过程。但是毫无疑问Text Driver提供的操作是有限的。所以一般来说现将数据全部导入到一个中间表,然后再处理的方式比较好。

posted @ 2008-08-25 13:23 朱良雄 阅读(1671) 评论(10)  编辑 收藏 网摘 所属分类: SQL 数据库

  回复  引用  查看    
#1楼 2008-08-25 13:26 | Tony Zhou      
用xml定义csv中列和datatable中列的对应
  回复  引用    
#2楼 2008-08-25 13:32 | abe [未注册用户]
用xml是如何定义的?我没有接触过,可以举个简单的例子吗?
  回复  引用  查看    
#3楼 2008-08-25 13:53 | Tony Zhou      
@abe
其实就是自己写一个程序咯,呵呵。
  回复  引用    
#4楼 2008-08-25 14:17 | vrizha [未注册用户]
用微软SSIS写个小程序就能加载CSV,插入到数据库表中很容易,你这怎么这么麻烦?
  回复  引用    
#5楼 2008-08-25 14:21 | abe [未注册用户]
#4的大侠
SSIS 中的小程序是如何写的呢?可以介绍一下。我以前没有用过CSV,也没有用过SQL Server.
  回复  引用  查看    
#6楼 2008-08-25 15:49 | Cheney Shue      
--引用--------------------------------------------------
vrizha: 用微软SSIS写个小程序就能加载CSV,插入到数据库表中很容易,你这怎么这么麻烦?
--------------------------------------------------------

SSIS读取平面文件问题很多,如果字段中出现分割符就会出问题。

最简单的方法就是外部表,不用将数据导入数据库,可以加索引
  回复  引用  查看    
#7楼 2008-08-25 16:22 | Wuya      
使用关键词“csv site:codeproject.com”到GOOGLE搜索了一下,有好几篇很不错的文章,例如:
快速读取CSV文件:http://www.codeproject.com/KB/database/CsvReader.aspx
LINQ TO CSV库:http://www.codeproject.com/KB/linq/LINQtoCSV.aspx
读、写、导入、导出CSV文件的库:
http://www.codeproject.com/KB/database/filehelpers.aspx
  回复  引用  查看    
#8楼 [楼主]2008-08-25 17:03 | 朱良雄      
这个库 很好很强大
  回复  引用  查看    
#9楼 2008-08-26 13:24 | Phantaci.com      
我们这边是做了一个后台程序.能在后台配置 建表,字段,验证规则 和生成CSV导入模板.

当用户导入数据时,后台会将导入的csv转换为一个DataTable.然后跟据配置项逐个字段验证,验证完后调用bluk insert 批量导入到 数据库中。



  回复  引用  查看    
#10楼 2008-11-10 09:58 | AlexLiu      
怎么看着这么眼熟呢?

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

相关文章:

相关链接: