码迷,mamicode.com
首页 > 其他好文 > 详细

Csharp--Read Csv file to DataTable

时间:2014-12-04 22:51:59      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   使用   sp   

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

最后找到一个好用的,在codeplex上,这位老兄写成了一个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 = 0;

int lastbyte = 0;

int b = 0;

DataRow dr = null;

bool isfirstline = true;

int colindex = 0;

List<string> firstlinefields = new List<string>();

StringBuilder sb = new StringBuilder();

using (FileStream fs = File.OpenRead(filename))

{

while ((b = fs.ReadByte()) != -1)

{

if (!isfirstline && dr == null)

dr = dt.NewRow();

if (b == 10 && lastbyte == 13 && quotecount % 2 == 0) //one row finished

{

if (!isfirstline)

{

dr[colindex] = sb.ToString();

dt.Rows.Add(dr);

}

else

{

if (isFirstLineHeader)

dt.Columns.Add(sb.ToString());

else firstlinefields.Add(sb.ToString());

//build the table strucure

if (isfirstline && !isFirstLineHeader)

{

for (int i = 1; i <= firstlinefields.Count; i++)

{

dt.Columns.Add("col" + i);

}

dr = dt.NewRow();

for (int j = 0; j < firstlinefields.Count; j++)

{

dr[j] = firstlinefields[j];

}

dt.Rows.Add(dr);

}

isfirstline = false;

}

sb.Clear();

quotecount = 0;

b = 0;

dr = null;

colindex = 0;

lastbyte = 0;

}

else if (b == 44 && quotecount % 2 == 0) //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 == 34) 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]*)\"$";

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打开显示的无差异。

bubuko.com,布布扣

如果你需要测试的话,请确保自己写的文件是有效的csv文件,否则请使用excel另存为,自己写的文件改后缀不是真正的csv.

Csharp--Read Csv file to DataTable

标签:style   blog   http   io   ar   color   os   使用   sp   

原文地址:http://www.cnblogs.com/huaxiaoyao/p/4143939.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!