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 // +------------------------------------------------------------ ...
随机推荐
- 自己动手系列——实现一个简单的LinkedList
LinkedList与ArrayList都是List接口的具体实现类.LinkedList与ArrayList在功能上也是大体一致,但是因为两者具体的实现方式不一致,所以在进行一些相同操作的时候,其效 ...
- Linux 6.4 partprobe出现warning问题
今天在给服务器做LVM的时候(服务器的系统是CentOS 6.3),用fdisk分区之后,用w写入分区表的时候,就提示Command (m for help): wThe partition tabl ...
- Oracle instant client在windows下的安装和使用
安装 * 从oracle官方网站下载instant client文件,一般来说,有basic.sqlplus.odbc.jdbc,就足够用的了: instantclient-basic-win32-1 ...
- 纪中集训 Day 7
今天超级不爽啊啊啊啊 尼玛我三道题都想出来了就是没对一道,第一题没理负数尼玛题目没告诉我,第二题尼玛题目也没说最近的点是第(l+r)/2而不是距离为(a[l]+a[r])/2啊啊啊啊,第三题没打GCD ...
- zabbix安装详解
关于zabbix及相关服务软件版本: Linux:centos 6.6 nginx:1.9.15 MySQL:5.5.49 PHP:5.5.35 一.安装nginx: 安装依赖包: yum -y in ...
- Hello,Kubernetes
什么是Kubernetes Kubernetes(k8s)是一款开源的以容器为中心的,用于跨主机集群自动部署(automating deployment),控制容器扩展/收缩(scaling)和管理容 ...
- 通过udev创建ASM共享磁盘(RAC)
OS:RedHat EL6.0 Oracle: Oracle 11gR2 在Oracle 11gR2,构建RAC时可以通过ASM创建asm disk,但是需要安装asmlib相关软件:对于RedH ...
- python pytesser 的安装
安装包: 需要安装的包主要有两个: PIL 和 pytesser . PIL模块的安装不多说 pytesser 模块的安装: 下载后得到 "pytesser_v0.0.1.zip&quo ...
- Pascal's Triangle II leetcode
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...
- koahub.js 0.09 发布,新增钩子机制
koahubjs发布0.09 新增钩子机制添加钩子机制,控制器钩子和函数钩子修复自动加载bug,实现除自动加载导出的default外,还能自动加载其他的方法记koahubjs钩子开发过程在使用koah ...