Csharp--Read Csv file to DataTable
在网上找的资料都不怎么好使,许多代码一看就知道根本没有考虑全面。
最后找到一个好用的,在codeproject上,这位老兄写成了一个framework,太重了。
http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader
确实挺好用的。
我没耐下性子看他的实现,自己尝试写了如下的代码来完成了阅读csv.
参照:http://msdn.microsoft.com/en-us/library/ae5bf541%28v=vs.90%29.aspx
只写了两个方法,组织得不是特别优雅。
使用的时候只需要调用ReadCsv2DT即可,传入参数是文件路径和第一行是否是Header的布尔值。
第二个方法是替换CSVWriter封装的多余的双引号。
public static DataTable ReadCsv2DT(string filename,bool isFirstLineHeader)
{
DataTable dt = new DataTable();
int quotecount = ;
int lastbyte = ;
int b = ;
DataRow dr = null;
bool isfirstline = true;
int colindex = ;
List<string> firstlinefields = new List<string>();
StringBuilder sb = new StringBuilder();
using (FileStream fs = File.OpenRead(filename))
{
while ((b = fs.ReadByte()) != -)
{
if (!isfirstline && dr == null)
dr = dt.NewRow();
if (b == && lastbyte == && quotecount % == ) //one row finished
{
if (!isfirstline)
{
dr[colindex] = removeTextQualifier(sb.ToString());
dt.Rows.Add(dr);
}
else
{
if (isFirstLineHeader)
dt.Columns.Add(removeTextQualifier(sb.ToString()));
else firstlinefields.Add(removeTextQualifier(sb.ToString()));
//build the table strucure
if (isfirstline && !isFirstLineHeader)
{
for (int i = ; i <= firstlinefields.Count; i++)
{
dt.Columns.Add("col" + i);
}
dr = dt.NewRow();
for (int j = ; j < firstlinefields.Count; j++)
{
dr[j] = firstlinefields[j];
}
dt.Rows.Add(dr);
}
isfirstline = false;
}
sb.Clear();
quotecount = ;
b = ;
dr = null;
colindex = ;
lastbyte = ;
}
else if (b == && quotecount % == ) //one filed found 44 stand for comma
{
if (isfirstline)
{ if (isFirstLineHeader)
dt.Columns.Add(removeTextQualifier(sb.ToString()));
else
firstlinefields.Add(removeTextQualifier(sb.ToString()));
}
else dr[colindex] =removeTextQualifier(sb.ToString());
sb.Clear();
colindex++;
}
else
{
if (b == ) quotecount++; //"
lastbyte = b;
sb.Append(UnicodeEncoding.ASCII.GetString(new byte[] { byte.Parse(b.ToString()) }));
}
}
};
return dt;
} public static string removeTextQualifier(string text) {
string pattern = "^\"(?<word>[\\s\\S]*?)\"[\r\n]*$";
Regex rgx = new Regex(pattern,RegexOptions.Multiline);
Match m = rgx.Match(text);
if (m.Success)
//return m.Result("($1)").Replace("\"\"", "\"");
return m.Groups["word"].Value.Replace("\"\"", "\"");
else
return text.Replace("\"\"", "\"");
} }
效果图:测试了一个文件,效果还可以,和Excel打开显示的无差异。

如果你需要测试的话,请确保自己写的文件是有效的csv文件,否则请使用excel另存为,自己写的文件改后缀不是真正的csv.
Csharp--Read Csv file to DataTable的更多相关文章
- ogr2ogr: Export Well Known Text (WKT) for one feature to a CSV file
Perhaps you’re looking for this? ogr2ogr -f “CSV” “E:\4_GIS\NorthArkCartoData\UnitedStates\MO_wkt” “ ...
- C# - CSV file reader
// ------------------------------------------------------------------------------------------------- ...
- SQL SERVER – Import CSV File Into SQL Server Using Bulk Insert – Load Comma Delimited File Into SQL Server
CSV stands for Comma Separated Values, sometimes also called Comma Delimited Values. Create TestTabl ...
- [PowerShell Utils] Create a list of virtual machines based on configuration read from a CSV file in Hyper-V
Hello everyone, this is the third post of the series. . Background =============== In my solution, ...
- Qt Read and Write Csv File
This page discusses various available options for working with csv documents in your Qt application. ...
- Python: Write UTF-8 characters to csv file
To use codecs, we can write UTF-8 characters into csv file import codecs with open('ExcelUtf8.csv', ...
- save tracking results into csv file for oxuva long-term tracking dataset (from txt to csv)
save tracking results into csv file for oxuva long-term tracking dataset (from txt to csv) 2019-10-2 ...
- Powercli随笔 - PowerCLI script to sequentially Storage vMotion VMs from a CSV File
PowerCLI script to sequentially Storage vMotion VMs from a CSV File This is a PowerCLI script that I ...
- csharp: datagridview Convert csv file
/// <summary> /// 保存文件 /// 涂聚文 /// 2014-08-29 /// Geovin Du /// </summary> /// <param ...
随机推荐
- 初入网络系列笔记(4)HTTP请求和响应
一.借鉴说明,本博文借鉴以下博文 1.starok,HTTP必知必会,http://www.cnblogs.com/starstone/p/4890409.html 2.CareySon,HTTP协议 ...
- Asp.net 面向接口可扩展框架之类型转化基础服务
新框架正在逐步完善,可喜可贺的是基础服务部分初具模样了,给大家分享一下 由于基础服务涉及面太广,也没开发完,这篇只介绍其中的类型转化部分,命名为类型转化基础服务,其实就是基础服务模块的类型转化子模块 ...
- 各种JS模板引擎对比数据(高性能JavaScript模板引擎)
最近做了JS模板引擎测试,拿各个JS模板引擎在不同浏览器上去运行同一程序,下面是模板引擎测试数据:通过测试artTemplate.juicer与doT引擎模板整体性能要有绝对优势: js模板引擎 Ja ...
- nodejs:连接数据库SqlServer,mssql模块
现在的数据库越来越多,如mgdb,我比较常用的是mysql,但有一天做项目需要连接SqlServer,就去找了个方法.找了很多无非就mssql模块和node-sqlserver模块,但node-sql ...
- CSS3与页面布局学习笔记(八)——浏览器兼容性问题与前端性能优化方案
一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...
- 标准BST二叉搜索树写法
本人最近被各种数据结构的实验折磨的不要不要的,特别是代码部分,对数据结构有严格的要求,比如写个BST要分成两个类,一个节点类,要给树类,关键是所以操作都要用函数完成,也就是在树类中不能直接操作节点,需 ...
- 获取WIFI密码
在十年前,我还在上初中,班上只有极少数的富二代用得起手机:几年后诺基亚.摩托罗拉.三星手机开始盛行:近些年,安卓.苹果系统手机占据了基本整个市场,WIFI出变得越来越重要. Wifi万能钥匙数据库存储 ...
- 网站已迁移至:https://tasaid.com/
个人网站:http://tasaid.com/ 主要文章在 个人网站 更新,尽可能在博客园同步更新. github:https://github.com/linkFly6 或者可以参与到我目前正在开发 ...
- Linux系统实战项目——sudo日志审计
Linux系统实战项目——sudo日志审计 由于企业内部权限管理启用了sudo权限管理,但是还是有一定的风险因素,毕竟运维.开发等各个人员技术水平.操作习惯都不相同,也会因一时失误造成误操作,从而 ...
- 转载 Android 多线程处理之多线程用法大集合
handler.post(r)其实这样并不会新起线程,只是执行的runnable里的run()方法,却没有执行start()方法,所以runnable走的还是UI线程. 1.如果像这样,是可以操作ui ...