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

最后找到一个好用的,在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封装的多余的双引号。

  1. public static DataTable ReadCsv2DT(string filename,bool isFirstLineHeader)
  2. {
  3. DataTable dt = new DataTable();
  4. int quotecount = ;
  5. int lastbyte = ;
  6. int b = ;
  7. DataRow dr = null;
  8. bool isfirstline = true;
  9. int colindex = ;
  10. List<string> firstlinefields = new List<string>();
  11. StringBuilder sb = new StringBuilder();
  12. using (FileStream fs = File.OpenRead(filename))
  13. {
  14. while ((b = fs.ReadByte()) != -)
  15. {
  16. if (!isfirstline && dr == null)
  17. dr = dt.NewRow();
  18. if (b == && lastbyte == && quotecount % == ) //one row finished
  19. {
  20. if (!isfirstline)
  21. {
  22. dr[colindex] = removeTextQualifier(sb.ToString());
  23. dt.Rows.Add(dr);
  24. }
  25. else
  26. {
  27. if (isFirstLineHeader)
  28. dt.Columns.Add(removeTextQualifier(sb.ToString()));
  29. else firstlinefields.Add(removeTextQualifier(sb.ToString()));
  30. //build the table strucure
  31. if (isfirstline && !isFirstLineHeader)
  32. {
  33. for (int i = ; i <= firstlinefields.Count; i++)
  34. {
  35. dt.Columns.Add("col" + i);
  36. }
  37. dr = dt.NewRow();
  38. for (int j = ; j < firstlinefields.Count; j++)
  39. {
  40. dr[j] = firstlinefields[j];
  41. }
  42. dt.Rows.Add(dr);
  43. }
  44. isfirstline = false;
  45. }
  46. sb.Clear();
  47. quotecount = ;
  48. b = ;
  49. dr = null;
  50. colindex = ;
  51. lastbyte = ;
  52. }
  53. else if (b == && quotecount % == ) //one filed found 44 stand for comma
  54. {
  55. if (isfirstline)
  56. { if (isFirstLineHeader)
  57. dt.Columns.Add(removeTextQualifier(sb.ToString()));
  58. else
  59. firstlinefields.Add(removeTextQualifier(sb.ToString()));
  60. }
  61. else dr[colindex] =removeTextQualifier(sb.ToString());
  62. sb.Clear();
  63. colindex++;
  64. }
  65. else
  66. {
  67. if (b == ) quotecount++; //"
  68. lastbyte = b;
  69. sb.Append(UnicodeEncoding.ASCII.GetString(new byte[] { byte.Parse(b.ToString()) }));
  70. }
  71. }
  72. };
  73. return dt;
  74. }
  75.  
  76. public static string removeTextQualifier(string text)
  77.  
  78. {
  79. string pattern = "^\"(?<word>[\\s\\S]*?)\"[\r\n]*$";
  80. Regex rgx = new Regex(pattern,RegexOptions.Multiline);
  81. Match m = rgx.Match(text);
  82. if (m.Success)
  83. //return m.Result("($1)").Replace("\"\"", "\"");
  84. return m.Groups["word"].Value.Replace("\"\"", "\"");
  85. else
  86. return text.Replace("\"\"", "\"");
  87. }
  88.  
  89. }

效果图:测试了一个文件,效果还可以,和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. 实体之间的关系【Entity Relationships】(EF基础系列篇9)

    Here, you will learn how entity framework manages the relationships between entities. Entity framewo ...

  2. javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)

    在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...

  3. 模仿36。杀毒~button

    <Style x:Key="360btn" TargetType="{x:Type Button}"> <Setter Property=&q ...

  4. JMeter专题系列(五)检查点

    JMeter也有像LR中的检查点: JMeter里面的检查点通过添加断言来完成. 检查点:我们对用户名和密码进行了参数化,那么怎样来判断jmeter有没有正确调用t.dat里面的文件呢.当然,我们可以 ...

  5. Https网站搭建——通过https://localhost:8443访问tomcat首页

    图片大致介绍了Https浏览器与服务器握手的过程,涉及到的名词:证书.Hash算法.随机数密码.公钥加密.私钥解密.握手消息.hash验证.摘要 tomcat服务器配置可以实现https双向认证,简单 ...

  6. 工行ATM转账——事务操作

    今儿去工行ATM给已朋友转账,遇到这么个情况: 选择对外转账后输入转入账号(输入两次),接着提示输入转入金额(输入一次金额),按确定,系统提示交易中,3秒左右,提示“输入账号无效”,系统自动中断了操作 ...

  7. 监听页面上的checkbox是否选中

    第一种 <!DOCTYPE html> <html> <head> <meta charset='UTF-8'> <title>checke ...

  8. jQuery简单的手风琴菜单

    查看效果:http://keleyi.com/keleyi/phtml/menu/5.htm 本菜单的HTML代码和JS代码都简洁,完整源代码: <!DOCTYPE html PUBLIC &q ...

  9. 怎么使用jQuery

    jQuery的强大我何文启(个人主页:hovertree.com)就不用多说了,那么怎么使用jQuery呢? 首先,下载jquery.下载地址:http://hovertree.com/hvtart/ ...

  10. jquery.datatables中文使用说明

    http://www.cnblogs.com/taizhouxiaoba/archive/2009/03/17/1414426.html 本文共四部分:官网 | 基本使用|遇到的问题|属性表 一:官方 ...