在网上找的资料都不怎么好使,许多代码一看就知道根本没有考虑全面。

最后找到一个好用的,在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的更多相关文章

  1. 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” “ ...

  2. C# - CSV file reader

    // ------------------------------------------------------------------------------------------------- ...

  3. 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 ...

  4. [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, ...

  5. Qt Read and Write Csv File

    This page discusses various available options for working with csv documents in your Qt application. ...

  6. 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', ...

  7. 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 ...

  8. 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 ...

  9. csharp: datagridview Convert csv file

    /// <summary> /// 保存文件 /// 涂聚文 /// 2014-08-29 /// Geovin Du /// </summary> /// <param ...

随机推荐

  1. 使用VS Code开发调试.NET Core 多项目

    使用Visual Studio Code(VS Code)开发调试.NET Core和ASP.NET Core 多项目multiple project. 之前讲解过如果使用Visual Studio ...

  2. Extjs Panel

    刚学习Extjs @{ Layout = "~/_SiteLayout.cshtml"; Page.Title = "欢迎访问我的网站!"; } @{ stri ...

  3. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...

  4. python基础之正则表达式

    正则表达式语法 正则表达式 (或 RE) 指定一组字符串匹配它;在此模块中的功能让您检查一下,如果一个特定的字符串匹配给定的正则表达式 (或给定的正则表达式匹配特定的字符串,可归结为同一件事). 正则 ...

  5. hibernate缓存(一级缓存、二级缓存)

    一.一级缓存(Session缓存)      意义:提高hibernate查询效率.      缺点:可能会因并发,产生数据不一致.      基于session的缓存,利用hibernate执行查询 ...

  6. 基于 Angularjs&Node.js 云编辑器架构设计及开发实践

    基于 Angularjs&Node.js 云编辑器架构设计及开发实践 一.产品背景 二.总体架构 1. 前端架构 a.前端层次 b.核心基础模块设计 c.业务模块设计 2. Node.js端设 ...

  7. 实用CSS3的transform实现多种动画效果

    查看效果:http://keleyi.com/a/bjad/b6x9q8gs.htm 以下是代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4. ...

  8. MySQL外键与外键关系说明(简单易懂)

    MySQL主键和外键使用及说明 一.外键约束 MySQL通过外键约束来保证表与表之间的数据的完整性和准确性. 外键的使用条件:  1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后 ...

  9. JavaScript区分click事件和mousedown(mouseup、mousemove)方法

    在前端开发工作中,会遇到这样问题:针对同一个dom元素,即希望为它绑定click事件,又想该元素可以允许拖拽的效果.而使用拖拽的效果,我们一般就会用到mousedown,mousemove和mouse ...

  10. Android—自定义控件实现ListView下拉刷新

    这篇博客为大家介绍一个android常见的功能——ListView下拉刷新(参考自他人博客,网址忘记了,阅读他的代码自己理解注释的,希望能帮助到大家): 首先下拉未松手时候手机显示这样的界面: 下面的 ...