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 ...
随机推荐
- Xamarin.Android之封装个简单的网络请求类
一.前言 回忆到上篇 <Xamarin.Android再体验之简单的登录Demo> 做登录时,用的是GET的请求,还用的是同步, 于是现在将其简单的改写,做了个简单的封装,包含基于Http ...
- 绿色简单的学校登录html页面
效果预览:http://hovertree.com/texiao/css/22/ 代码如下: <!DOCTYPE html> <html> <head> <m ...
- form表单中enctype="multipart/form-data"的作用
在我们使用php导入和导出excel表格的时候经常会见到 enctype="multipart/form-data",哪他的作用是什么呢? ENCTYPE="multip ...
- 自从升级到macOS后,整个人都不好了
电脑一直莫名的随机卡死,各种软件都出现了一些崩溃和不稳定的情况. Siri就是个笑话,启用后就开始索引本地硬盘,不管你有没有正在工作:直到你启动Siri,会暂停一下,然后就算是你开在哪不动,过两分钟, ...
- Java基础学习 -- 接口
interface是一种特殊的class 接口是纯抽象类 所有的成员函数都是抽象函数: 所有的成员变量都是public static final; 接口是为了方便类的调用 一个类如果要去实现某个接口, ...
- 《IBM BPM实战指南》读书笔记
理论 BPM不是一个IT术语,更不是因技术的发展而起源的,相反,BPM自始至终都是管理学的术语和概念.它关注的一直都是效率.成本.利润.质量等核心问题.BPM是一门学科和一种方法论,只是现代的企业管理 ...
- jquery attr()方法
在JS中设置节点的属性与属性值用到setAttribute(),获得节点的属性与属性值用到getAttribute(),而在jquery中,用一个attr()就可以全部搞定了,赞一个先 ^^ jque ...
- arcgis server10.2.2发布地图基础服务的具体步骤
1.直接打开制作好的.mxd文档,比如这里: 2.打开mxd文档之后,打开菜单:file-share as -services 弹出地图发布服务的界面: 点击publish之后,耐心的等待一段时间,地 ...
- android滚动公告栏
项目里要用到开奖公告,单行显示向上滚动的TextView,网上随便找了一个控件发现效果还不错改装一下就可以用到项目里.唯一不妥的地方就是字体大小不太好控制,不是正常的字体大小,也没有深究代码,先把工作 ...
- Watir-WebDriver关于交互式等待方法,告别一味sleep时代
有交互就有等待,等待页面加载完毕的时间怎么处理呢? 有人说sleep: sleep N #等待N秒后继续执行 怎么才能告别毫无意义的命令呢? 接下来介绍一下Watir-Webdriver为我们提供等待 ...