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 ...
随机推荐
- 实体之间的关系【Entity Relationships】(EF基础系列篇9)
Here, you will learn how entity framework manages the relationships between entities. Entity framewo ...
- javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)
在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...
- 模仿36。杀毒~button
<Style x:Key="360btn" TargetType="{x:Type Button}"> <Setter Property=&q ...
- JMeter专题系列(五)检查点
JMeter也有像LR中的检查点: JMeter里面的检查点通过添加断言来完成. 检查点:我们对用户名和密码进行了参数化,那么怎样来判断jmeter有没有正确调用t.dat里面的文件呢.当然,我们可以 ...
- Https网站搭建——通过https://localhost:8443访问tomcat首页
图片大致介绍了Https浏览器与服务器握手的过程,涉及到的名词:证书.Hash算法.随机数密码.公钥加密.私钥解密.握手消息.hash验证.摘要 tomcat服务器配置可以实现https双向认证,简单 ...
- 工行ATM转账——事务操作
今儿去工行ATM给已朋友转账,遇到这么个情况: 选择对外转账后输入转入账号(输入两次),接着提示输入转入金额(输入一次金额),按确定,系统提示交易中,3秒左右,提示“输入账号无效”,系统自动中断了操作 ...
- 监听页面上的checkbox是否选中
第一种 <!DOCTYPE html> <html> <head> <meta charset='UTF-8'> <title>checke ...
- jQuery简单的手风琴菜单
查看效果:http://keleyi.com/keleyi/phtml/menu/5.htm 本菜单的HTML代码和JS代码都简洁,完整源代码: <!DOCTYPE html PUBLIC &q ...
- 怎么使用jQuery
jQuery的强大我何文启(个人主页:hovertree.com)就不用多说了,那么怎么使用jQuery呢? 首先,下载jquery.下载地址:http://hovertree.com/hvtart/ ...
- jquery.datatables中文使用说明
http://www.cnblogs.com/taizhouxiaoba/archive/2009/03/17/1414426.html 本文共四部分:官网 | 基本使用|遇到的问题|属性表 一:官方 ...