Craig
Craig

Reputation: 18704

DataTable from TextFile?

I have taken over an application written by another developer, which reads data from a database, and exports it.

The developer used DataTables and DataAdaptors.

So,

 _dataAdapter = new SqlDataAdapter("Select * From C....", myConnection);

and then

ExtractedData = new DataTable("CreditCards");
_dataAdapter.Fill(ExtractedData);

ExtractedData is then passed around to do different functions.

I have now been told that I need to, in addition to this, get the same format of data from some comma separated text files. The application does the same processing - it's just getting the data from two sources.

So, I am wondering if I can get the data read into a DataTable, as above, and then ADD more records from a CSV file.

Is this possible?

Upvotes: 3

Views: 27764

Answers (3)

Furqan Safdar
Furqan Safdar

Reputation: 16708

You might need to use this function to read the data into DataTable from the file.

public DataTable GetDataSourceFromFile(string fileName)
{
    DataTable dt = new DataTable("CreditCards");
    string[] columns = null;

    var lines = File.ReadAllLines(fileName);

    // assuming the first row contains the columns information
    if (lines.Count() > 0)
    {
        columns = lines[0].Split(new char[] { ',' });

        foreach (var column in columns)
            dt.Columns.Add(column);
    }

    // reading rest of the data
    for (int i = 1; i < lines.Count(); i++)
    {
        DataRow dr = dt.NewRow();
        string[] values = lines[i].Split(new char[] { ',' });

        for (int j = 0; j < values.Count() && j < columns.Count(); j++)
            dr[j] = values[j];

        dt.Rows.Add(dr);
    }
    return dt;
}

Upvotes: 9

sajanyamaha
sajanyamaha

Reputation: 3198

Ok,try this :

public string[] getColumns(bool ColumnNames)
{
    try {
        StreamReader fileReader = new StreamReader(FileName);
        string line = fileReader.ReadLine;
        fileReader.Close();
        string[] Columns = line.Split(",");
        if (ColumnNames) {
            return Columns;
        }
        int i = 1;
        int c = 0;
        string[] columnsNames = new string[Columns.Count];
        foreach (string column in Columns) {
            columnsNames(c) = "column" + i;
            i += 1;
            c += 1;
        }
        return columnsNames;
    } catch (Exception ex) {
        //log to file    
    }
    return null;
}

AND

public DataTable ReturnData(bool ColumnNames)
{
    try {
        DataTable dt = new DataTable();
        foreach ( columnName in getColumns(ColumnNames)) {
            dt.Columns.Add(columnName);
        }
        StreamReader fileReader = new StreamReader(FileName);
        if (ColumnNames) {
            fileReader.ReadLine();
        }
        string line = fileReader.ReadLine;
        while ((line != null)) {
            line = line.Replace(Strings.Chr(34), "");
            dt.Rows.Add(line.Split(","));
            line = fileReader.ReadLine;
        }
        fileReader.Close();
        return dt;
    } catch (Exception ex) {
        //log to file
    }
    return null;
}

Upvotes: 0

Hamish Smith
Hamish Smith

Reputation: 8181

It is definitely possible.
DataTable has a NewRow method so the simplest, brute force method I can see is to read the text file one line at a time, parse the string (split(",") and then populate the fields of the row. Then you need to add the new row the Rows collection of the DataTable.
There may be smarter ways to do this but this seems reasonably straightforward to implement (with no knowledge of your schema).

Upvotes: 0

Related Questions