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 // +------------------------------------------------------------ ...
随机推荐
- 百度云推送----iOS
前言 记录一下这几天学习的百度推送,觉得这个东西弄的还挺糟心的,好多注意的地方 正文 1.先申请一个百度开发者账号 http://push.baidu.com/fc 2.创建一个新应用,并应用配置 3 ...
- Vue.js 系列教程 4:Vuex
这是关于 JavaScript 框架 Vue.js 五个教程的第四部分.在这一部分,我们会学习使用 Vuex 进行状态管理. 这不是一个完整的指南,而是基础知识的概述,所以你可以了解 Vue.js 以 ...
- 读书笔记 effective c++ Item 15 在资源管理类中提供对原生(raw)资源的访问
1.为什么需要访问资源管理类中的原生资源 资源管理类是很奇妙的.它们是防止资源泄漏的堡垒,没有资源泄漏发生是设计良好的系统的一个基本特征.在一个完美的世界中,你需要依赖这样的类来同资源进行交互,绝不 ...
- 理解zookeeper选举机制
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- jQuery_第五章_事件和动画
Jquery中的事件与动画 一.window.onload和$(document).read()的细微差别 (1)执行时机 window.onload:所有元素(包括元素的所有关联文件)完全加载到浏览 ...
- path和classpath的用途
1 path很明显是unix shell的环境变量,比如bash shell,输入一个命令,它会先去path指定的目录下查找是不是有该命令的可执行文件. 2 -classpath 只是用在下面这种不发 ...
- BZOJ 1835: [ZJOI2010]base 基站选址(DP,线段树)
可以很容易的写出dp方程: F[i][j]=min(F[l][j-1]+w[l][i])+c[i] (w[i][j]是从l+1到i-1这些点p里,所有满足d[p]+s[p]<d[i] & ...
- TI(德州仪器) TMS320C674x逆向分析之一
一.声明 作者并不懂嵌入式开发,整个逆向流程都是根据自身逆向经验,一步一步摸索出来,有什么错误请批评指正,或者有更好的方法请不吝赐教.个人写作水平有限,文中会尽量把过程写清楚,有问题或是写的不清楚的地 ...
- 每天一个linux命令(27)--tar命令
通过SSH访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候 tar 命令就是必不可少的一个功能强大的工具.Linux 中最流行的 tar 是麻雀虽小,五脏俱全. tar 命令可以为Linux ...
- Keepalived + HAProxy 搭建【第二篇】Keepalived 安装与配置
第一步:准备 1. 简介 本文搭建的是利用 Keepalived 实现 HAProxy 的热备方案,即两台主机上的 HAProxy 实例同时运行,其中全总较高的实例为 MASTER,MASTER出现异 ...