CSV工具类
分享自己昨天写的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工具类的更多相关文章
- [Unity工具]CSV工具类
参考链接: https://www.cnblogs.com/lulianqi/p/6385503.html http://blog.csdn.net/paul342/article/details/2 ...
- 【转载】 C#工具类:Csv文件转换类
CSV是逗号分隔值格式的文件,其文件以纯文本形式存储表格数据(数字和文本).CSV文件由任意数目的记录组成,记录间以某种换行符分隔:每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号 ...
- 写文件的工具类,输出有格式的文件(txt、json/csv)
import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io. ...
- 支持各种特殊字符的 CSV 解析类 (.net 实现)(C#读写CSV文件)
CSV是一种十分简洁的数据结构,在DOTNET平台实际使用中发现微软官方并没有提供默认的方法,而网上好多例子发现实现并不严谨甚至一些含有明显错误,所以后面自己实现了一个读写工具类,这里发出来希望方便后 ...
- 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 ...
- 排名前 16 的 Java 工具类
在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...
- commons-lang3-3.2.jar中的常用工具类的使用
这个包中的很多工具类可以简化我们的操作,在这里简单的研究其中的几个工具类的使用. 1.StringUtils工具类 可以判断是否是空串,是否为null,默认值设置等操作: /** * StringUt ...
- 排名前16的Java工具类
原文:https://www.jianshu.com/p/9e937d178203 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法 ...
- ThinkPHP Http工具类(用于远程采集 远程下载) phpSimpleHtmlDom采集类库_Jquery筛选方式 使用phpQuery轻松采集网页内容http://www.thinkphp.cn/extend/541.html
[php]代码库 view sourceprint? <?php // +------------------------------------------------------------ ...
随机推荐
- Angular企业级开发(7)-MVC之控制器
1.MVC中的控制器 AngularJS的控制器主要为了把模型和视图连接在一起.大多数业务逻辑操作都会放在视图对应的控制器中.当然如果我们能够把业务逻辑放到后端的REST服务中,就可以开发轻量级Ang ...
- 【openstack N版】——计算服务nova
一.openstack计算服务nova 1.1nova介绍 Nova是openstack最早的两块模块之一,另一个是对象存储swift.在openstack体系中一个叫做计算节点,一个叫做控制节点.这 ...
- 不用搭环境的10分钟AngularJS指令简易入门01(含例子)
不用搭环境的10分钟AngularJS指令简易入门01(含例子) `#不用搭环境系列AngularJS教程01,前端新手也可以轻松入坑~阅读本文大概需要10分钟~` AngularJS的指令是一大特色 ...
- 2017-2-17 c#基础学习 (控制台程序的创建,输出,输入,定义变量,变量赋值,值覆盖,值拼接,值打印)
1 控制台程序的创建 > 新建项目 ,选择 c#, 框架选择4.0 , 选择控制应用台程序, 选择文件保存位置 修改名字. 2 c#输出与输入 >在main函数中编写代码 >在编 ...
- angularjs+ionic注册页面表单验证(手机号、确认密码、60s后重发验证码)
在已建立tabs和路由的注册页面html: 功能: 进行了手机号.密码格式验证,两次密码输入是否相同的判断,都正确且复选框勾选后才可点击注册,进入tabs.mypage页面. 未进行验证码真正发送.获 ...
- Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势
原创文章,同步首发自作者个人博客转载请务必在文章开头处注明出处. 摘要 本文结合实例详细阐明了Spark数据倾斜的几种场景以及对应的解决方案,包括避免数据源倾斜,调整并行度,使用自定义Partitio ...
- Selenium 切换句柄
最近用了网络上别人的一段切换窗口的code每次成功了,不错,学习 // 根据Title切换新窗口 public boolean switchToWindow_Title(WebDriver drive ...
- java实现多叉树查找
package tree; import java.util.List; import java.util.ArrayList; import java.io.Serializable; public ...
- [.net 面向对象程序设计深入](13)实战设计模式——设计模式使用场景及原则
[.net 面向对象程序设计深入](13)实战设计模式——设计模式使用场景及原则 1,什么是设计模式? 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计 ...
- 转换器3:手写PHP转Python编译器,词法部分
上周写了<ThinkPhp模板转Flask.Django模板> 一时技痒,自然而然地想搞个大家伙,把整个PHP程序转成Python.不比模板,可以用正则匹配偷懒,这次非写一个Php编译器不 ...