随笔 - 55, 评论 - 298, 引用 - 17

导航

关于

我是新人,: )

每月存档

最新留言

  • re:Last day at Microsoft
    <p><a href="http://www.moretiffany.com/">tiffany jewelry</a> Choose, buy...
    by sibat0705(注册) on 2010/3/12 20:48:58
  • bVSVKxjrysxCAx
    zKTeMu &lt;a href=&quot;http://jmvdsaxpwywz.com/&quot;&gt;jmvdsaxpwywz&lt;/a&am...
    by algkkzvif(匿名) on 2010/2/21 22:53:15
  • DLXXSrOqat
    F3OQLk &lt;a href=&quot;http://pfpvdtnczscw.com/&quot;&gt;pfpvdtnczscw&lt;/a&am...
    by sfxnoylvca(匿名) on 2010/2/21 21:28:18
  • iNOutySOJKTsFyl
    kSPmy1 &lt;a href=&quot;http://kdajmdtvcxfu.com/&quot;&gt;kdajmdtvcxfu&lt;/a&am...
    by lydyggun(匿名) on 2010/2/21 20:21:46
  • mDUfBYTmJjTiGrv
    IXumnI &lt;a href=&quot;http://lamuwgvmprtw.com/&quot;&gt;lamuwgvmprtw&lt;/a&am...
    by gacyafcvtas(匿名) on 2010/2/14 4:47:26
  • oiUMbbvrAlLbcr
    ot9Ga3 &lt;a href=&quot;http://nwawfslgnomg.com/&quot;&gt;nwawfslgnomg&lt;/a&am...
    by cvalpp(匿名) on 2010/2/14 4:46:45
  • re:Last day at Microsoft
    写的真好,看了觉得很受到启发,谢谢,
    by Zheying Zheng(匿名) on 2010/2/4 10:35:20
  • re:REST API的身份验证(Authentication)
    <p>顶</p>
    by kekesoft(注册) on 2010/1/27 20:27:43
  • re:Last day at Microsoft
    祝你好运啊
    by Eric v(匿名) on 2010/1/24 1:53:34
  • re:Last day at Microsoft
    鄙人正在打算内部调动,跨过欢德福卡海峡去西雅图呢, 以后互通有无,常联系.
    by Charlie 木匠(匿名) on 2010/1/11 4:23:23
  • re:Last day at Microsoft
    Good luck, buddy.
    by Huimiao Liu(匿名) on 2010/1/10 20:18:24
  • re:Last day at Microsoft
    &lt;p&gt;Oops,you are right. 改正了。&lt;/p&gt;
    by demonfox(匿名) on 2010/1/10 18:22:13
  • re:Last day at Microsoft
    2006年8月14日起至2009年1月8日止 是2010年吧
    by q(匿名) on 2010/1/10 14:59:53
  • re:Last day at Microsoft
    &quot;永远选择你最感兴趣的项目而不是升职空间等所谓的职业发展前景&quot; -- 说的很好!Good luck!
    by CoderZh(匿名) on 2010/1/8 20:49:26
  • re:Chrome OS和Android的背后
    Google当然不是在传统的操作系统上去跟微软计算,手机操作系统,Windows CE是公认的烂,Google在这里竞争没有什么不可以。Chrome OS更多的是Google云计算战略的一部分,人家根...
    by 啊(匿名) on 2009/12/22 13:14:12

广告

 

前些天正好需要处理一些csv文件(就是逗号分隔文件,常用excel的应该很熟悉),于是想早早.NET里是不是已经有这样的类库了。最后还真的发现了一个。不过有趣的是那个类(Microsoft.VisualBasic.FileIO.TextFieldParser)只有VB.NET的版本。

不过我们是在.NET平台上么,CLR的好处不是只拿来吹吹的。VB.NET写的类,在C#程序里一样能用:

1. 首先Add Refenece(Microsoft.VisualBasic):

2. 然后声明使用的namespace:

using Microsoft.VisualBasic;

3. 接着就可以写代码了, 我加了一些很简单的Schema的功能:

 

using Microsoft.VisualBasic.FileIO; using System; using System.Collections; using System.Collections.Generic; using System.IO; namespace MS.Live.Cumulus.Autopilot.Watchdog { public class CsvParser { /* fields */ TextFieldParser csvParser = null; Dictionary<string, int> textSchema = null; /* methods */ public CsvParser(string inputFile) { csvParser = new TextFieldParser(inputFile); csvParser.TextFieldType = FieldType.Delimited; csvParser.Delimiters = new string[] { "," }; } public CsvParser(Stream inputStream) { csvParser = new TextFieldParser(inputStream); csvParser.TextFieldType = FieldType.Delimited; csvParser.Delimiters = new string[] { "," }; } public void SetSchema(string[] schema) { textSchema = new Dictionary<string, int>(schema.Length); int index = 0; foreach (string field in schema) textSchema.Add(field, index++); // may throw an exception if duplicated field names exist in schema } public string ReadLineRaw() { return csvParser.ReadLine(); } public string[] ReadLine() { return csvParser.ReadFields(); } public string[] ReadFields(string[] filter) { if (null == textSchema) throw new Exception("The parser has no schema defined."); string[] allFields = ReadLine(); string[] result = new string[filter.Length]; for (int i = 0; filter.Length > i; i++) result[i] = allFields[textSchema[filter[i]]]; return result; } /* properties */ public bool IsEndOfData { get { return csvParser.EndOfData; } } }

4. 最后测试一下:

 

public void TestCsvParser() { CsvParser parser = new CsvParser("input.csv"); try { parser.ReadFields(new string[] { "Address" }); Assert.Fail("This line should not be reached"); } catch (Exception) { } parser.SetSchema(new string[]{ "Name", "PhoneNumber", "Address" }); string[] row = parser.ReadLine(); Assert.IsTrue("FakeID1" == row[0] && "FakePhoneNumber1" == row[1] && "FakeAddress1" == row[2]); Assert.IsTrue("FakeID2,FakePhoneNumber2,FakeAddress2" == parser.ReadLineRaw()); row = parser.ReadFields(new string[]{ "Address", "Name" }); Assert.IsTrue(2 == row.Length && "FakeAddress3" == row[0] && "FakeID3" == row[1]); row = parser.ReadFields(new string[]{ "Name", "PhoneNumber", "Address" }); row = parser.ReadFields(new string[]{ "Name", "PhoneNumber", "Address" }); Assert.IsTrue(3 == row.Length && "FakeID5" == row[0] && "hello,Fake\"PhoneNumber5" == row[1] && "FakeAddress5" == row[2]); Assert.IsTrue(true == parser.IsEndOfData); }

 

测试的输入文件如下:

FakeID1,FakePhoneNumber1,FakeAddress1
FakeID2,FakePhoneNumber2,FakeAddress2
FakeID3 , FakePhoneNumber3,FakeAddress3

FakeID4, FakePhoneNumber4 ,FakeAddress4
FakeID5, "hello,Fake""PhoneNumber5", FakeAddress5

打印 | 张贴于 2007-06-25 17:17:00 | Tag:暂无标签

留言反馈

#回复: CsvParser in C# 编辑
在数据采集用的比较多点
2007-06-26 09:24:00 | [匿名:梁广永]

发表留言

标题
姓名
邮件
主页
留言 

Powered by: Joycode.MVC引擎 0.5.2.0