Thursday, November 26, 2009

Upload a csv file and show data in a grid view

The following post will lead u to Upload a csv file and show data in a grid view,
In .aspx page:

<table>
 <tr>
  <td>
   <asp:FileUpload ID="FileUpload1" runat="server" />
  </td>
  <td>
   <asp:Button ID="Button1" runat="server" OnClientClick="return noFilePresent();" OnClick="Button1_Click" Text="Upload CSV" />
  </td>
 </tr>
 <tr>
   <td colspan="2">
    <asp:Label ID="lblMsg" Text="Please Select Proper File" runat="server" BorderColor="White"
         Font-Bold="True" ForeColor="Red" Visible="false"></asp:Label>
   </td>
 </tr>
 <tr>
   <td>
    <asp:GridView ID="gv" runat="server"></asp:GridView>
   </td>
 </tr>
</table>


In .aspx.cs :

protected void Page_Load(object sender, EventArgs e)
    {
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
      
            //save the file
            //restrict user to upload other file extenstion
            string[] FileExt = FileUpload1.FileName.Split('.');
            string FileEx = FileExt[FileExt.Length - 1];
            if (FileEx.ToLower() == "csv")
            {
                FileUpload1.SaveAs(Server.MapPath("CSVLoad//" + FileUpload1.FileName));
            }
            else
            {
                Response.Write("Upload a valid file");
                return;
            }
      

        //create object for CSVReader and pass the stream
        CSVReader reader = new CSVReader(FileUpload1.PostedFile.InputStream);
        //get the header
        string[] headers = reader.GetCSVLine();
        DataTable dt = new DataTable();
        //add headers
        foreach (string strHeader in headers)
            dt.Columns.Add(strHeader);

        string[] data;
      
        while ((data = reader.GetCSVLine()) != null)
            dt.Rows.Add(data);
        //bind gridview
        gv.DataSource = dt;
        gv.DataBind();

    }

CSVReader.cs:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Text;
using System.Collections;
/// <summary>
/// Summary description for CSVReader
/// </summary>
namespace Csv.Reader
{
    public class CSVReader
    {

        //

        private Stream objStream;

        private StreamReader objReader;


        //add name space 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);
        }
        //parse the Line
        public string[] GetCSVLine()
        {
            string data = objReader.ReadLine();
            if (data == null) return null;
            if (data.Length == 0) return new string[0];
            //System.Collection.Generic
            ArrayList result = new ArrayList();
            //parsing CSV Data
            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;
        }
    }
}

Output:












No comments:

Post a Comment