About Me

My photo
a Dynamic and Energetic guy.....

Thursday, October 29, 2009

read a .CSV file & create a dataset

protected void CreateImportDataSet()
{
if (FileUpload1.PostedFile.FileName == string.Empty)
{ lblMsg.Visible = true; return; }

else
{
//restrict user to upload other file extenstion
string[] FileExt = FileUpload1.FileName.Split('.');
string FileEx = FileExt[FileExt.Length - 1];
if (FileEx.ToLower() == "csv")
{

}
else { lblMsg.Visible = true; return; }
}

ArrayList counterOfUnNecessaryColumns = new ArrayList();

//create object for CSVReader and pass the stream
CSVReader reader = new CSVReader(FileUpload1.PostedFile.InputStream);
//get the header
string[] headers = reader.GetCSVLine(counterOfUnNecessaryColumns, 0);
DataTable dt = new DataTable();

ArrayList necessaryHeaders = new ArrayList();
necessaryHeaders.Add("First Name");
necessaryHeaders.Add("Middle Name");
necessaryHeaders.Add("Last Name");
necessaryHeaders.Add("Job Title");
necessaryHeaders.Add("E-mail Address");

necessaryHeaders.Add("Business Street");
necessaryHeaders.Add("Business City");
necessaryHeaders.Add("Business State");
necessaryHeaders.Add("Business Postal Code");
necessaryHeaders.Add("Mobile Phone");
necessaryHeaders.Add("Home Phone");

//add headers
for (int counter = 0; counter < headers.Length; counter++)
{
if (necessaryHeaders.Contains(headers[counter]))
{
dt.Columns.Add(headers[counter]);

}
else
{
counterOfUnNecessaryColumns.Add(counter);
}
}
dt.Columns.Add("PersonIndex");

string[] data;
int personIndex = 0;
while ((data = reader.GetCSVLine(counterOfUnNecessaryColumns, personIndex)) != null)
{
dt.Rows.Add(data);
personIndex++;
}
gv.DataSource = dt;
gv.DataBind();

dt.TableName = "MyContacts";
dt.WriteXml(@"D:/mad.xml");
Session["CsvDataSet"] = dt;
}

=====================================Base Class ====================================

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;

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(ArrayList counterOfNecessaryColumns,int personIndex)
{
string data = objReader.ReadLine();
if (data == null) return null;
if (data.Length == 0) return new string[0];

ArrayList result = new ArrayList();
//parsing CSV Data
ParseCSVData(result, data, counterOfNecessaryColumns,personIndex);
return (string[])result.ToArray(typeof(string));
}

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

//Removing Unnecessary columns
for (int i = 0; i < counterOfNecessaryColumns.Count; i++)
{
try
{
result.RemoveAt(int.Parse(counterOfNecessaryColumns[i].ToString()) - i);
}
catch { }
}
result.Add(personIndex.ToString());
}

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;
}
}

No comments:

My Masters