好库网 好库网首页 | 我的好库
好饱的专栏

如何使用C#读取csv文件

发布者:好饱
发布日期:2011/5/5 10:41:32   更新日期:2011/5/5 10:41:32
阅读次数:10646
评分:4.80
介绍:本文提供了一个可以读取CSV的类。
正文:

创建CSV读取类CSVReader

 

public class CSVReader
{
	// 对象定义
	private Stream objStream;
	private StreamReader objReader;
	// 需要添加System.IO.Stream命名空间
	public CSVReader(Stream filestream) : this(filestream, null) { }
	 public CSVReader(Stream filestream, Encoding enc)
	 {
		 this.objStream = filestream;
		 //check the Pass Stream whether it is readable or not
		 if (!filestream.CanRead)
		 {
			 return;
		 }
         objReader = (enc != null) ? new StreamReader(filestream, enc) : new StreamReader(filestream);
	 }

     //解析每行数据
     public string[] GetCSVLine()
     {
         string data = objReader.ReadLine();
		 if (data == null) return null;
         if (data.Length == 0) return new string[0];
		 //System.Collection.Generic use this namespace
		 ArrayList result = new ArrayList();

		 //解析CSV数据
		 ParseCSVData(result, data);
         return (string[])result.ToArray(typeof(string));
	 }

	 private void ParseCSVData(ArrayList result, string data)
	 {
		 int position = -1;
		 while (position < data.Length)
			 result.Add(ParseCSVField(ref data, ref position));
	 }

	 private string ParseCSVField(ref string data, ref int StartSeperatorPos)
	 {
		 if (StartSeperatorPos == data.Length – 1)
		 {
			 StartSeperatorPos++;
			 return "";
		 }
         
		 int fromPos = StartSeperatorPos + 1;
		 if (data[fromPos] == '"')
		 {
			 int nextSingleQuote = GetSingleQuote(data, fromPos + 1);
			 int lines = 1;
			 while (nextSingleQuote == -1)
			 {                 data = data + "\n" + objReader.ReadLine();
			 nextSingleQuote = GetSingleQuote(data, fromPos + 1);
			 lines++;
			 if (lines > 20)
				 throw new Exception("lines overflow: " + data);
			 }
			 StartSeperatorPos = nextSingleQuote + 1;
			 string tempString = data.Substring(fromPos + 1, nextSingleQuote – fromPos – 1);
			 tempString = tempString.Replace("'", """);
				 return tempString.Replace("\"\"", "\"");
		 }
         
		 int nextComma = data.IndexOf(',', fromPos);
		 if (nextComma == -1)
		 {
			 StartSeperatorPos = data.Length;
			 return data.Substring(fromPos);
		 }
		 else
		 {
			 StartSeperatorPos = nextComma;
			 return data.Substring(fromPos, nextComma – fromPos);
		 }
	 }
	 
	 private int GetSingleQuote(string data, int SFrom)
	 {
		 int i = SFrom – 1;
		 while (++i < data.Length)
			 if (data[i] == '"')
			 {
				 if (i < data.Length – 1 && data[i + 1] == '"')
				 {
					 i++;
					 continue;
				 }
				 else
					 return i;
			 }
			 return -1;
	 }
}

该类创建好后,按钮的click事件按如下方式处理:

 

if (FileUpload1.PostedFile.FileName == string.Empty)
{
	Label1.Visible = true;
	return;
}
else
{
	//save the file
	//restrict user to upload other file extenstion
	string[] FileExt = FileUpload1.FileName.Split('.');
	string FileEx = FileExt[FileExt.Length - 1];
	if (FileEx.ToLower() == "xls")
	{
		FileUpload1.SaveAs(Server.MapPath("File//" + FileUpload1.FileName));
	}
	else
	{
		Label1.Visible = true;
		return;
	}
}

//create object of  previous memtain class CSVReader and pass the stream
XLsReader reader = new XLsReader(FileUpload1.PostedFile.InputStream);

//get the header from hear
string[] headers = reader.GetXLSine();
DataTable dt = new DataTable();

//add headers of dara table
foreach (string strHeader in headers)
dt.Columns.Add(strHeader);
string[] data;
while ((data = reader.GetXLSine()) != null)
dt.Rows.Add(data);

//绑定gridview
GridView1.DataSource = dt;
GridView1.DataBind();

 

 

 

 

 


评论 [发表评论]
账号 密码 还没帐号呢,现在注册一个?

免责声明:好库网所展示的信息由买卖双方自行提供,其真实性、准确性和合法性由信息发布人负责。好库网不提供任何保证,并不承担任何法律责任。