这个我应该是看Scott的博客,看他介绍的经典小工具的时候看到的,感谢。
我经常接触到一些csv格式存储的数据文件,把这些文件导入数据库,或者把数据库的数据导出成为excel文件或者csv文件。
自己写功能解析自然好,但是需要处理的地方太多,如果是标准文件还好,但是如果文本文件里含有保留分隔符,或者数据格式有一些小错误,都需要自己处理。而且如果数据格式变化了,每次还要修改自己的代码。所以,我一直没写这个代码。
偷懒,一直用Excel的Text to Data 功能凑合,或者用SQL的导入导出功能,再就是用从网页上拷贝粘贴数据到excel,然后清除格式的方法。
这些方法其实都有弊端,典型的就是大量的手工才做,重复劳动,这些到还能忍受了,当涉及到数据库,用的最多的自然就是SQL自带的导入导出功能。这个功能大体上好用,可是如果文本文件里面有一点错误,他就罢工。这倒还可以忍受,后来我在64位机器上装了64位的SQL,这样微软居然不支持直接由Excel导入,说64位版本不需要这个功能,我在网上看到了许多类似需求,微软都坚持说不提供这个64位的flat文件驱动!一等就是3年,SQL2005年发布,现在已经2008年了。可怕。
终于看到了这个阿根廷人编写的开源文本文件导入导出帮助类库!
本来以为还挺难使用,谁知,人家的帮助写得好,类库做的也好。我稍微调试了一下,就上手了!
最基本的用法可以看他主页的教程。
根据自己的文本文件格式,建立类库模板,定义好接受字段之类的。
增加引用类库文件到自己的项目。
一次性读取文本文件到内存。
最后是写入到其他的数据库或者转换格式保存。
我的问题是,我的文本文件比较大,大于50M,一次性读入的时候总是内存溢出,看了一下发现这个类库居然还提供了异步导入方式,就是读取一行,写一行!
略微看了一下,也好解决。
语法上,本类库兼容.net 1.0 和 .net 2.0,所以可以直接用.net 2.0的最新的语法写。写起来很方便!读取出来的数据可以直接赋给列表对象!
当然,类库本身也提供了对写入SQL,到处Excel的支持!由于作者的写入SQL的方式需要把SQL密码写道代码中,我就没有采用,而是自己用SQL数据连接写入SQL库的。
当然那个导出到EXcel的方式用起来还是很方便的。
总之这个工具最到的好处是,相当于你自己写了一个导入导出的功能,用法强大,容错性高,方便包含在自己的项目中,对文本进行自动化处理,完全省掉了自己编写功能的辛苦!强烈推荐!
The FileHelpers are a free and easy to use .NET library to import/exportdata from fixedlength or delimited records in files, strings orstreams.
The idea is pretty simple:
The Library also has support for import/export data from differents storages like Excel,Access, SqlServer, etc.
最新版下载地址(RC1的原因是因为作者最近在陪老婆生孩子,没时间发布最终版,恭喜!这个链接可能被国内拦住了,所以你可能需要代理访问下载!):
http://www.devoo.net/FileHelpers_2.2_RC1.rar
应要求,我把作者主页上的文件转到rapidshare上去,这个站点国内可以访问(本来想转到博客园控件,看了一下,才30M,这也太小了点吧???)需要的同学可以从rapidshare下载。
2.0编译版
http://rapidshare.com/files/127794302/FileHelpers_2_0_0_bin_docs_wizard.zip.html
2.0带源代码版
http://rapidshare.com/files/127794795/FileHelpers_2_0_0_source_2003_2005.zip.html
2.2更新
http://rapidshare.com/files/127795043/FileHelpers_2.2_RC1.rar.html
主页在这里,这个国内可以访问,有十分详细的帮助文档,一看就会,不要担心!!!
http://www.filehelpers.com/
下面是我做实验的代码,加了注释,你可以看一下,十分简单。
1using System;
2using System.Configuration;
3using System.Data.SqlClient;
4//在此处增加对这个类库的引用就可以了
5using FileHelpers;
6
7
8namespace FileHelpersSample
9{
10 public partial class _Default : System.Web.UI.Page
11 {
12 protected void Page_Load(object sender, EventArgs e)
13 {
14
15 }
16
17 protected void btImportFLFtoSQLbyLINQ_Click(object sender, EventArgs e)
18 {
19
20 //清空所有已存在记录,
21 string SQLCommand = "TRUNCATE TABLE dbo.prm";
22 int sqlresult = RunSQLStatement(SQLCommand);
23 Response.Write(sqlresult);
24 Response.Write("<hr />");
25
26 string strCSVFile = System.Web.HttpContext.Current.Server.MapPath("./") + "Data//rrr.csv";
27
28 //一次性读入整个文本文件
29 //FileHelperEngine<FLFRecordClass> engine = new FileHelperEngine<FLFRecordClass>();
30 //FLFRecordClass[] res = engine.ReadFile(strCSVFile);
31
32 //异步方式,一次读入一行,处理一行
33 FileHelperAsyncEngine<FLFRecordClass> engine = new FileHelperAsyncEngine<FLFRecordClass>();
34 engine.BeginReadFile(strCSVFile);
35
36 int i = 0;
37 while (engine.ReadNext() != null)
38 {
39 FLFRecordClass f = engine.LastRecord;
40
41 string Command;
42 #region
43 Command = "INSERT INTO dbo.prm VALUES(";
44 //用两个连着的单引号替换单引号,不然,这个SQL语句会报错
45 Command += "'" + f.Field1.Replace("'", "''") + "', ";
46 Command += "'" + f.Field2.Replace("'", "''") + "', ";
47 Command += "'" + f.Field3.Replace("'", "''") + "', ";
48 Command += "'" + f.Field4.Replace("'", "''") + "', ";
49 Command += "'" + f.Field5.Replace("'", "''") + "', ";
50 Command += "'" + f.Field6.Replace("'", "''") + "', ";
51 Command += "'" + f.Field7.Replace("'", "''") + "', ";
52 Command += "'" + f.Field8.Replace("'", "''") + "', ";
53 Command += "'" + f.Field9.Replace("'", "''") + "', ";
54 Command += "'" + f.Field10.Replace("'", "''") + "', ";
55
56 //.Other fields
57
58 Command += "'" + f.Field111.Replace("'", "''") + "')";
59 #endregion
60
61 int j = RunSQLStatement(Command);
62 Response.Write(j);
63 Response.Write("<br />");
64 //if (i > 2) break;
65 i++;
66 }
67 engine.Close;
Response.Write("<hr />");
68 Response.Write(i);
69
70
71 }
72
73
74 public static SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["FLFConnectionString"].ConnectionString);
75
76 //自定义函数,用于实现对SQL数据库的更新操作
77 public int RunSQLStatement(string Command)
78 {
79 SqlCommand DataCommand = new SqlCommand(Command, conn);
80 DataCommand.Connection.Open();
81 int i = DataCommand.ExecuteNonQuery();
82 DataCommand.Connection.Close();
83 return i;
84 }
85
86 }
87}
88
读取文本文件时,需要实现定义一个类,这个类的语法也十分简单,而且作者还提供了一个帮助向导,帮助你自动生成这个类文件(真是体贴周到!)
我这里为了偷懒,读入的时候就都都成了字符型,而且也没加什么处理,其实这个类库还只是纠错,按格式读取,读取的时候转换格式等功能!你自己慢慢看,需要的时候再用。我是一次性转到SQL临时表里,自己用程序再处理的,当然你可以用作者提供的类库在读入的时候一次性处理,究竟哪种方式好,我还没研究,感觉自己的方式比较省事(你说的?愿意听你的看法。)
模板类
1using System;
2using FileHelpers;
3
4namespace FileHelpersSample
5{
6
7 [IgnoreFirst(1)]
8 [IgnoreEmptyLines()]
9 [DelimitedRecord(",")]
10 public sealed class FLFRecordClass
11 {
12
13 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
14 public String Field1;
15
16 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
17 public String Field2;
18
19 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
20 public String Field3;
21
22 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
23 public String Field4;
24
25 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
26 public String Field5;
27
28 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
29 public String Field6;
30
31 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
32 public String Field7;
33
34 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
35 public String Field8;
36
37 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
38 public String Field9;
39
40 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
41 public String Field10;
42
43 //.
44
45 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
46 public String Field111;
47
48 }
49
50
51}
52
原文出处: http://www.cnblogs.com/xblues
我经常接触到一些csv格式存储的数据文件,把这些文件导入数据库,或者把数据库的数据导出成为excel文件或者csv文件。
自己写功能解析自然好,但是需要处理的地方太多,如果是标准文件还好,但是如果文本文件里含有保留分隔符,或者数据格式有一些小错误,都需要自己处理。而且如果数据格式变化了,每次还要修改自己的代码。所以,我一直没写这个代码。
偷懒,一直用Excel的Text to Data 功能凑合,或者用SQL的导入导出功能,再就是用从网页上拷贝粘贴数据到excel,然后清除格式的方法。
这些方法其实都有弊端,典型的就是大量的手工才做,重复劳动,这些到还能忍受了,当涉及到数据库,用的最多的自然就是SQL自带的导入导出功能。这个功能大体上好用,可是如果文本文件里面有一点错误,他就罢工。这倒还可以忍受,后来我在64位机器上装了64位的SQL,这样微软居然不支持直接由Excel导入,说64位版本不需要这个功能,我在网上看到了许多类似需求,微软都坚持说不提供这个64位的flat文件驱动!一等就是3年,SQL2005年发布,现在已经2008年了。可怕。
终于看到了这个阿根廷人编写的开源文本文件导入导出帮助类库!
本来以为还挺难使用,谁知,人家的帮助写得好,类库做的也好。我稍微调试了一下,就上手了!
最基本的用法可以看他主页的教程。
根据自己的文本文件格式,建立类库模板,定义好接受字段之类的。
增加引用类库文件到自己的项目。
一次性读取文本文件到内存。
最后是写入到其他的数据库或者转换格式保存。
我的问题是,我的文本文件比较大,大于50M,一次性读入的时候总是内存溢出,看了一下发现这个类库居然还提供了异步导入方式,就是读取一行,写一行!
略微看了一下,也好解决。
语法上,本类库兼容.net 1.0 和 .net 2.0,所以可以直接用.net 2.0的最新的语法写。写起来很方便!读取出来的数据可以直接赋给列表对象!
当然,类库本身也提供了对写入SQL,到处Excel的支持!由于作者的写入SQL的方式需要把SQL密码写道代码中,我就没有采用,而是自己用SQL数据连接写入SQL库的。
当然那个导出到EXcel的方式用起来还是很方便的。
总之这个工具最到的好处是,相当于你自己写了一个导入导出的功能,用法强大,容错性高,方便包含在自己的项目中,对文本进行自动化处理,完全省掉了自己编写功能的辛苦!强烈推荐!
The FileHelpers are a free and easy to use .NET library to import/exportdata from fixedlength or delimited records in files, strings orstreams.
The idea is pretty simple:
You can strong type your flat file (fixed or delimited) simply describing a class that maps to each record and later read/write your file as an strong typed .NET array |
The Library also has support for import/export data from differents storages like Excel,Access, SqlServer, etc.
![](http://www.filehelpers.com/use_case1.png)
![](http://www.filehelpers.com/use_case2.png)
最新版下载地址(RC1的原因是因为作者最近在陪老婆生孩子,没时间发布最终版,恭喜!这个链接可能被国内拦住了,所以你可能需要代理访问下载!):
http://www.devoo.net/FileHelpers_2.2_RC1.rar
应要求,我把作者主页上的文件转到rapidshare上去,这个站点国内可以访问(本来想转到博客园控件,看了一下,才30M,这也太小了点吧???)需要的同学可以从rapidshare下载。
2.0编译版
http://rapidshare.com/files/127794302/FileHelpers_2_0_0_bin_docs_wizard.zip.html
2.0带源代码版
http://rapidshare.com/files/127794795/FileHelpers_2_0_0_source_2003_2005.zip.html
2.2更新
http://rapidshare.com/files/127795043/FileHelpers_2.2_RC1.rar.html
主页在这里,这个国内可以访问,有十分详细的帮助文档,一看就会,不要担心!!!
http://www.filehelpers.com/
下面是我做实验的代码,加了注释,你可以看一下,十分简单。
1using System;
2using System.Configuration;
3using System.Data.SqlClient;
4//在此处增加对这个类库的引用就可以了
5using FileHelpers;
6
7
8namespace FileHelpersSample
9{
10 public partial class _Default : System.Web.UI.Page
11 {
12 protected void Page_Load(object sender, EventArgs e)
13 {
14
15 }
16
17 protected void btImportFLFtoSQLbyLINQ_Click(object sender, EventArgs e)
18 {
19
20 //清空所有已存在记录,
21 string SQLCommand = "TRUNCATE TABLE dbo.prm";
22 int sqlresult = RunSQLStatement(SQLCommand);
23 Response.Write(sqlresult);
24 Response.Write("<hr />");
25
26 string strCSVFile = System.Web.HttpContext.Current.Server.MapPath("./") + "Data//rrr.csv";
27
28 //一次性读入整个文本文件
29 //FileHelperEngine<FLFRecordClass> engine = new FileHelperEngine<FLFRecordClass>();
30 //FLFRecordClass[] res = engine.ReadFile(strCSVFile);
31
32 //异步方式,一次读入一行,处理一行
33 FileHelperAsyncEngine<FLFRecordClass> engine = new FileHelperAsyncEngine<FLFRecordClass>();
34 engine.BeginReadFile(strCSVFile);
35
36 int i = 0;
37 while (engine.ReadNext() != null)
38 {
39 FLFRecordClass f = engine.LastRecord;
40
41 string Command;
42 #region
43 Command = "INSERT INTO dbo.prm VALUES(";
44 //用两个连着的单引号替换单引号,不然,这个SQL语句会报错
45 Command += "'" + f.Field1.Replace("'", "''") + "', ";
46 Command += "'" + f.Field2.Replace("'", "''") + "', ";
47 Command += "'" + f.Field3.Replace("'", "''") + "', ";
48 Command += "'" + f.Field4.Replace("'", "''") + "', ";
49 Command += "'" + f.Field5.Replace("'", "''") + "', ";
50 Command += "'" + f.Field6.Replace("'", "''") + "', ";
51 Command += "'" + f.Field7.Replace("'", "''") + "', ";
52 Command += "'" + f.Field8.Replace("'", "''") + "', ";
53 Command += "'" + f.Field9.Replace("'", "''") + "', ";
54 Command += "'" + f.Field10.Replace("'", "''") + "', ";
55
56 //.Other fields
57
58 Command += "'" + f.Field111.Replace("'", "''") + "')";
59 #endregion
60
61 int j = RunSQLStatement(Command);
62 Response.Write(j);
63 Response.Write("<br />");
64 //if (i > 2) break;
65 i++;
66 }
67 engine.Close;
Response.Write("<hr />");
68 Response.Write(i);
69
70
71 }
72
73
74 public static SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["FLFConnectionString"].ConnectionString);
75
76 //自定义函数,用于实现对SQL数据库的更新操作
77 public int RunSQLStatement(string Command)
78 {
79 SqlCommand DataCommand = new SqlCommand(Command, conn);
80 DataCommand.Connection.Open();
81 int i = DataCommand.ExecuteNonQuery();
82 DataCommand.Connection.Close();
83 return i;
84 }
85
86 }
87}
88
读取文本文件时,需要实现定义一个类,这个类的语法也十分简单,而且作者还提供了一个帮助向导,帮助你自动生成这个类文件(真是体贴周到!)
我这里为了偷懒,读入的时候就都都成了字符型,而且也没加什么处理,其实这个类库还只是纠错,按格式读取,读取的时候转换格式等功能!你自己慢慢看,需要的时候再用。我是一次性转到SQL临时表里,自己用程序再处理的,当然你可以用作者提供的类库在读入的时候一次性处理,究竟哪种方式好,我还没研究,感觉自己的方式比较省事(你说的?愿意听你的看法。)
模板类
1using System;
2using FileHelpers;
3
4namespace FileHelpersSample
5{
6
7 [IgnoreFirst(1)]
8 [IgnoreEmptyLines()]
9 [DelimitedRecord(",")]
10 public sealed class FLFRecordClass
11 {
12
13 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
14 public String Field1;
15
16 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
17 public String Field2;
18
19 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
20 public String Field3;
21
22 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
23 public String Field4;
24
25 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
26 public String Field5;
27
28 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
29 public String Field6;
30
31 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
32 public String Field7;
33
34 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
35 public String Field8;
36
37 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
38 public String Field9;
39
40 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
41 public String Field10;
42
43 //.
44
45 [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
46 public String Field111;
47
48 }
49
50
51}
52
原文出处: http://www.cnblogs.com/xblues