分享自己昨天写的CSV工具类,

主要实现解析CSV格式,

直接上代码

         #region private
         /// <summary>
         /// 从sr当前位置解析一个栏位
         /// </summary>
         private void JXLW(StringReader sr)
         {
             //判断首个字符是否为"
             )
             {
                 char c = (char)sr.Read();
                 this._jxcharindex++;

                 this._lwcharstartindex = this._jxcharindex;

                 //判断此位置字符是否为特殊字符
                 if (this._teshuchar.Contains(c))
                 {
                     if (c != '"')
                     {
                         if (c == ',')
                         {
                             //表示栏位为空
                             this._lwcharendindex = this._jxcharindex;
                             return;
                         }
                         else
                         {
                             //栏位第一个不为"Name就是有异常了
                             throw new Exception(
                                 string.Format("解析异常,栏位首字符为不是\"的特殊字符,异常出现在字符:{0},索引:{1}",
                                 c.ToString(), this._jxcharindex));
                         }
                     }
                     this._lwhasyhcount++;
                     this._lwyhstart = true;
                 }
                 else
                 {
                     this._lwyhstart = false;
                 }

                 //根据栏位是否"开头查找结尾啊
                 if (this._lwyhstart)
                 {
                     JXYHStartLW(sr);
                 }
                 else
                 {
                     JXUnYHStartLW(sr);
                 }
             }
             else
             {
                 //这尼玛栏位中没有字符啊
             }
         }

         /// <summary>
         /// 解析引号开始的栏位
         /// </summary>
         /// <param name="sr"></param>
         private void JXYHStartLW(StringReader sr)
         {
             //找,
             )
             {
                 char c = (char)sr.Read();
                 this._jxcharindex++;

                 if (this._teshuchar.Contains(c))
                 {
                     if (c == ',')
                     {
                          == )
                         {
                             //则正常结束
                             this._lwcharendindex = this._jxcharindex;
                             return;
                         }
                         else
                         {
                             //继续找下一个,
                             JXYHStartLW(sr);
                             return;
                         }
                     }
                     else if (c == '"')
                     {
                         this._lwhasyhcount++;
                     }
                     else if (c == '\r')
                     {
                          == )
                         {
                             //已到栏位结尾
                             #region 栏位后一个是否为\n
                             , ).FirstOrDefault();
                             if (nextc == '\n')
                             {
                                 sr.Peek();
                                 sr.Read();
                                 this._jxcharindex++;
                             }
                             #endregion

                             //则正常结束
                             ;
                             this._lineend = true;
                             return;
                         }
                         else
                         {
                             //继续找下一个,
                             JXYHStartLW(sr);
                             return;
                         }
                     }
                     else if (c == '\n')
                     {
                          == )
                         {
                             //已到栏位结尾
                             //则正常结束
                             this._lwcharendindex = this._jxcharindex;
                             this._lineend = true;
                             return;
                         }
                         else
                         {
                             //继续找下一个,
                             JXYHStartLW(sr);
                             return;
                         }
                     }
                     else
                     {
                         //抛出异常
                         throw new Exception(
                             string.Format("解析异常,包含特殊字符的栏位,没有使用双引号括住!,异常字符:{0}索引:{1}",
                             c.ToString(), this._jxcharindex));
                     }
                 }
                 else
                 {
                     continue;
                 }
             }
         }

         /// <summary>
         /// 解析非引号开始的栏位
         /// </summary>
         /// <param name="sr"></param>
         private void JXUnYHStartLW(StringReader sr)
         {
             //找,
             )
             {
                 char c = (char)sr.Read();
                 this._jxcharindex++;

                 if (this._teshuchar.Contains(c))
                 {
                     if (c == ',')
                     {
                          == )
                         {
                             //则正常结束
                             this._lwcharendindex = this._jxcharindex;
                             return;
                         }
                         else
                         {
                             throw new Exception("解析异常,包含\"的栏位,双引号不成对!");
                         }
                     }
                     else if (c == '"')
                     {
                         throw new Exception("解析异常,栏位未使用\"包裹,但栏位中解析到\"字符!");
                     }
                     else if (c == '\r')
                     {
                         #region 栏位后一个是否为\n
                         , ).FirstOrDefault();
                         if (nextc == '\n')
                         {
                             sr.Peek();
                             sr.Read();
                             this._jxcharindex++;
                         }
                         #endregion

                         //则正常结束
                         ;
                         this._lineend = true;
                         return;
                     }
                     else if (c == '\n')
                     {
                         //则正常结束
                         this._lwcharendindex = this._jxcharindex;
                         this._lineend = true;
                         return;
                     }
                     else
                     {
                         //抛出异常
                         throw new Exception(
                             string.Format("解析异常,包含特殊字符的栏位,没有使用双引号括住!,异常字符:{0}索引:{1}",
                             c.ToString(), this._jxcharindex));
                     }
                 }
                 else
                 {
                     continue;
                 }
             }
         }
         #endregion
         /// <summary>
         /// 解析CSV文本
         /// 会补齐与解析到的最长列,以空在最后补齐
         /// </summary>
         /// <returns></returns>
         public IEnumerable<IEnumerable<string>> Parse()
         {
             if (string.IsNullOrEmpty(this._csvTxt))
             {
                 throw new Exception("传入的csv字符串不能为空!");
             }

             List<List<string>> lss = new List<List<string>>();
             using (StringReader sr = new StringReader(this._csvTxt))
             {
                 List<string> ls = new List<string>();

                 ;
                  < this._csvTxt.Length)
                 {
                     if (this._lineend)
                     {
                         #region 行结束
                         lss.Add(ls);
                         ls = new List<string>();

                         this._rownum++;
                         this._lineend = false;
                         ;
                         #endregion
                     }

                     this._lwnum++;
                     this._lwjxcomplete = false;

                     ;
                     ;

                     //开始解析
                     JXLW(sr);

                     this._lwjxcomplete = true;

                     //结束索引等于0时
                      == this._csvTxt.Length)
                     {
                         //csv字符串已到结尾

                                                 ?
                                                 : this._lwcharendindex;
                     }

                     ls.Add(this._csvTxt.Substring(this._lwcharstartindex,
                             this._lwcharendindex - this._lwcharstartindex));
                 }
                 if (ls.Any())
                 {
                     lss.Add(ls);
                 }
             }

             #region 整理,与最长的补齐,在最后补空
             var maxcount = lss.Max(d => d.Count);
             List<List<string>> lss1 = new List<List<string>>();
             ; i < lss.Count; i++)
             {
                 var item = lss[i];
                 if (item.Count != maxcount)
                 {
                     //补齐
                     ; j < maxcount - item.Count; j++)
                     {
                         item.Add("");
                     }
                 }
                 lss1.Add(item);
             }
             #endregion

             return lss1;
         }

直接调用Parse方法即可将csv文本解析为IEnumerable<IEnumerable<string>>类型。

剩下的结合C#神器-Linq就ok了。

完整代码请访问:https://coding.net/u/huawu/p/HXXCommonLibrary/git/blob/master/HXXTools/Tools/CSVTools.cs

代码昨天写的,只测试了简单的解析,不保证能用于生产环境,

测试项目:https://coding.net/u/huawu/p/HXXCommonLibrary/git/tree/master/TestProject/CSVTestProject

如有问题,请联系我,邮箱:h_xuxu@sina.com

Q:245112656

CSV工具类的更多相关文章

  1. [Unity工具]CSV工具类

    参考链接: https://www.cnblogs.com/lulianqi/p/6385503.html http://blog.csdn.net/paul342/article/details/2 ...

  2. 【转载】 C#工具类:Csv文件转换类

    CSV是逗号分隔值格式的文件,其文件以纯文本形式存储表格数据(数字和文本).CSV文件由任意数目的记录组成,记录间以某种换行符分隔:每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号 ...

  3. 写文件的工具类,输出有格式的文件(txt、json/csv)

    import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io. ...

  4. 支持各种特殊字符的 CSV 解析类 (.net 实现)(C#读写CSV文件)

    CSV是一种十分简洁的数据结构,在DOTNET平台实际使用中发现微软官方并没有提供默认的方法,而网上好多例子发现实现并不严谨甚至一些含有明显错误,所以后面自己实现了一个读写工具类,这里发出来希望方便后 ...

  5. Jacob工具类使用文件互转服务 word转html html转excel word转pdf excel转pdf ppt转pdf

    前提条件  必须安装MS office 1.jdk使用jdk1.8 2.jacob.dll放在..\jdk1.8\jre\bin目录下 3.eclipse的jre版本要和jdk一致,window-&g ...

  6. 排名前 16 的 Java 工具类

    在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...

  7. commons-lang3-3.2.jar中的常用工具类的使用

    这个包中的很多工具类可以简化我们的操作,在这里简单的研究其中的几个工具类的使用. 1.StringUtils工具类 可以判断是否是空串,是否为null,默认值设置等操作: /** * StringUt ...

  8. 排名前16的Java工具类

    原文:https://www.jianshu.com/p/9e937d178203 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法 ...

  9. ThinkPHP Http工具类(用于远程采集 远程下载) phpSimpleHtmlDom采集类库_Jquery筛选方式 使用phpQuery轻松采集网页内容http://www.thinkphp.cn/extend/541.html

    [php]代码库 view sourceprint? <?php // +------------------------------------------------------------ ...

随机推荐

  1. Angular企业级开发(7)-MVC之控制器

    1.MVC中的控制器 AngularJS的控制器主要为了把模型和视图连接在一起.大多数业务逻辑操作都会放在视图对应的控制器中.当然如果我们能够把业务逻辑放到后端的REST服务中,就可以开发轻量级Ang ...

  2. 【openstack N版】——计算服务nova

    一.openstack计算服务nova 1.1nova介绍 Nova是openstack最早的两块模块之一,另一个是对象存储swift.在openstack体系中一个叫做计算节点,一个叫做控制节点.这 ...

  3. 不用搭环境的10分钟AngularJS指令简易入门01(含例子)

    不用搭环境的10分钟AngularJS指令简易入门01(含例子) `#不用搭环境系列AngularJS教程01,前端新手也可以轻松入坑~阅读本文大概需要10分钟~` AngularJS的指令是一大特色 ...

  4. 2017-2-17 c#基础学习 (控制台程序的创建,输出,输入,定义变量,变量赋值,值覆盖,值拼接,值打印)

    1 控制台程序的创建 > 新建项目  ,选择 c#,  框架选择4.0 , 选择控制应用台程序, 选择文件保存位置 修改名字. 2 c#输出与输入 >在main函数中编写代码 >在编 ...

  5. angularjs+ionic注册页面表单验证(手机号、确认密码、60s后重发验证码)

    在已建立tabs和路由的注册页面html: 功能: 进行了手机号.密码格式验证,两次密码输入是否相同的判断,都正确且复选框勾选后才可点击注册,进入tabs.mypage页面. 未进行验证码真正发送.获 ...

  6. Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势

    原创文章,同步首发自作者个人博客转载请务必在文章开头处注明出处. 摘要 本文结合实例详细阐明了Spark数据倾斜的几种场景以及对应的解决方案,包括避免数据源倾斜,调整并行度,使用自定义Partitio ...

  7. Selenium 切换句柄

    最近用了网络上别人的一段切换窗口的code每次成功了,不错,学习 // 根据Title切换新窗口 public boolean switchToWindow_Title(WebDriver drive ...

  8. java实现多叉树查找

    package tree; import java.util.List; import java.util.ArrayList; import java.io.Serializable; public ...

  9. [.net 面向对象程序设计深入](13)实战设计模式——设计模式使用场景及原则

    [.net 面向对象程序设计深入](13)实战设计模式——设计模式使用场景及原则 1,什么是设计模式? 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计 ...

  10. 转换器3:手写PHP转Python编译器,词法部分

    上周写了<ThinkPhp模板转Flask.Django模板> 一时技痒,自然而然地想搞个大家伙,把整个PHP程序转成Python.不比模板,可以用正则匹配偷懒,这次非写一个Php编译器不 ...