Introduction
Nowadays it is common in applications to have the functionality of reading the CSV data. My current project needed one. Even after searching for long, I could not get one which could satisfy my requirements. But after doing considerable amount of study, I came up with the following tool. CSV files stand for Comma Separated Value files. They are common text files with comma delimited values. Though the default delimiter is comma (,), we can specify other characters as delimiters like the semi-colon (;), colon (:), asterisk (*). But you cannot specify double quotes (") as a delimiter. I have used Microsoft Text Drivers for reading the CSV data. You have to use ODBC connection for accessing the CSV data. You can either create a DSN or use the connection string. If you create a DSN, the schema.ini file gets created automatically in the folder where all your CSV files reside. But if you use connection string, you have to create schema.ini file on your own. We are going to see the latter approach.
Schema.ini File (Text File Driver)
When the Text driver is used, the format of the text file is determined by using a schema information file. The schema information file, which is always named schema.ini and always kept in the same directory as the text data source, provides the IISAM with information about the general format of the file, the column name and data type information, and a number of other data characteristics.
Using the demo application
For successfully running the application you need Test.csv file and a database with a table having three columns. But all this is provided in the demo application. So you need not worry. Follow these steps to run the demo application:
- First run DBI.exe application.
- The screen shown below will appear.
- Fill the required details and click the button "Install".
- Make sure that a folder named "Test" is created in "D:" drive with the Test.csv file in it.
- Now run our main application i.e. FinalCSVReader.exe.
- Keep the default folder and file path as it is.
- First click "Import CSV data" to import the CSV data.
- Now click "Save", to save the data in the database.
Using the source code
Some important parts of the code are discussed below
Create schema.ini
This is a function writeSchema()
. It creates the schema.ini file dynamically.
private void writeSchema()
{
try
{
FileStream fsOutput =
new FileStream (txtCSVFolderPath.Text+"\\schema.ini",
FileMode.Create, FileAccess.Write);
StreamWriter srOutput = new StreamWriter (fsOutput);
string s1, s2, s3,s4,s5;
s1="["+strCSVFile+"]";
s2="ColNameHeader="+bolColName.ToString ();
s3="Format="+strFormat;
s4="MaxScanRows=25";
s5="CharacterSet=OEM";
srOutput.WriteLine(s1.ToString()+'\n'+s2.ToString()+
'\n'+s3.ToString()+'\n'+
s4.ToString()+'\n'+s5.ToString());
srOutput.Close ();
fsOutput.Close ();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
}
Function for importing the CSV Data
This function ConnectCSV (string filetable)
takes the .csv file name as argument and returns the dataset containing the imported data.
public DataSet ConnectCSV (string filetable)
{
DataSet ds = new DataSet ();
try
{
string strConnString=
"Driver={Microsoft Text Driver (*.txt;*.csv)};
Dbq="+txtCSVFolderPath.Text.Trim()+";
Extensions=asc,csv,tab,txt;
Persist Security Info=False";
string sql_select;
System.Data.Odbc.OdbcConnection conn;
conn = new System.Data.Odbc.OdbcConnection(
strConnString.Trim ());
conn.Open ();
sql_select="select * from ["+ filetable +"]";
obj_oledb_da=new System.Data.Odbc.OdbcDataAdapter(
sql_select,conn);
obj_oledb_da.Fill(ds,"Stocks");
dGridCSVdata.DataSource=ds;
dGridCSVdata.DataMember="Stocks";
conn.Close ();
}
catch (Exception e)
{
MessageBox.Show (e.Message);
}
return ds;
}
Code for inserting the data
This is a code written in the button's click event btnUpload_Click
. This actually inserts the data in the database.
private void btnUpload_Click(object sender,
System.EventArgs e)
{
try
{
SqlConnection con1=
new SqlConnection(ReadConFile().Trim());
SqlCommand cmd = new SqlCommand();
SqlCommand cmd1 = new SqlCommand();
DataSet da = new DataSet();
da=this.ConnectCSV(strCSVFile);
cmd.Connection=con1;
cmd.CommandType=CommandType.Text;
cmd1.Connection=con1;
cmd1.CommandType=CommandType.Text;
con1.Open();
for(int i=0;i<=da.Tables["Stocks"].Rows.Count-1;i++)
{
for(int j=1;j<=da.Tables["Stocks"].Columns.Count-1;j++)
{
cmd.CommandText=
"Insert into Test(srno,
"+da.Tables["Stocks"].Columns[0].ColumnName.Trim()+")
values("+(i+1)+",
'"+da.Tables["Stocks"].Rows[i].ItemArray.GetValue(0)+"')";
cmd1.CommandText=
"Update Test set "
+da.Tables["Stocks"].Columns[j].ColumnName.Trim()+"
= '"+da.Tables["Stocks"].Rows[i].ItemArray.GetValue(j)+
"' where srno ="+(i+1);
cmd.ExecuteNonQuery();
cmd1.ExecuteNonQuery();
}
}
con1.Close();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
btnUpload.Enabled=false;
}
}