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

最后找到一个好用的,在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. 使用css3的动画模拟太阳系行星公转

    本文介绍使用css3的animation画一个太阳系行星公转的动画,再加以改进,讨论如何画椭圆的运行轨迹.然后分析京东和人人网使用animation的实际案例,最后结合css3的clip-path做一 ...

  2. 【转】App开放接口api安全性—Token签名sign的设计与实现

    前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等, ...

  3. 【转】JS编码解码、C#编码解码

    GB2312,指的是中文 UTF8,指的是国标,包含中文.英文. 但是通过JQuery.ajax的Get.Post,如果直接传递中文或者特殊字符的特使字符的时候,这个时候就会出现乱码现象. JS编码 ...

  4. ASP.NET MVC HtmlHelper之Html.ActionLink

    前言 ActionLink用于生成超链接,方法用于指向Controller的Action. 扩展方法与参数说明 ActionLink扩展方法如下: public static MvcHtmlStrin ...

  5. SqlServer切换MySql总结

    最近项目任务不多就琢磨着把SqlServer换成MySql(数据访问使用的ado.net),初步想了下方案有2种: 方案一:继续使用ado.net,重写所有的sql语句 优势:数据访问效率高,改写Sq ...

  6. angularjs SyntaxError: Unexpected token  in JSON at position 0

    使用NodeJs读取json格式的文件,转换成对象时报错 :SyntaxError: Unexpected token in JSON at position 0,这个问题查了两三个小时,记录一下解决 ...

  7. 背水一战 Windows 10 (17) - 动画: ThemeTransition(过渡效果)

    [源码下载] 背水一战 Windows 10 (17) - 动画: ThemeTransition(过渡效果) 作者:webabcd 介绍背水一战 Windows 10 之 动画 ThemeTrans ...

  8. Linux查看CPU和内存使用情况(转)

    在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况.运行 top 命令后,CPU 使用状态会 ...

  9. SpringMVC中servletFileUpload.parseRequest(request)解析为空获取不到数据问题

    原因分析 首先我们来看下Spring mvc 中文件上传的配置 <bean id="multipartResolver" class="org.springfram ...

  10. 【转】Cookie和Session区别和联系详解

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...