Csvhelper: export datatable to csv

Created on 23 Oct 2019  路  4Comments  路  Source: JoshClose/CsvHelper

Existe la implementaci贸n que exporte el contenido de un DataTable a un archivo .csv?

documentation

Most helpful comment

@johnyesberg Oops, thanks. I'll need to add this to the documentation.

You could go through the rows and columns like this.

void Main()
{
    var dt = new DataTable();
    dt.Columns.Add("Id", typeof(int));
    dt.Columns.Add("Name", typeof(string));

    var row = dt.NewRow();
    row["Id"] = 1;
    row["Name"] = "one";
    dt.Rows.Add(row);

    row = dt.NewRow();
    row["Id"] = 2;
    row["Name"] = "two";
    dt.Rows.Add(row);

    using (var writer = new StringWriter())
    using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
    {       
        foreach (DataColumn dc in dt.Columns)
        {           
            csv.WriteField(dc.ColumnName);
        }
        csv.NextRecord();

        foreach (DataRow dr in dt.Rows)
        {           
            foreach (DataColumn dc in dt.Columns)
            {
                csv.WriteField(dr[dc]);
            }
            csv.NextRecord();
        }

        writer.ToString().Dump();
    }
}

Or you could use a DataReader and to it like this.

void Main()
{
    var dt = new DataTable();
    dt.Columns.Add("Id", typeof(int));
    dt.Columns.Add("Name", typeof(string));

    var row = dt.NewRow();
    row["Id"] = 1;
    row["Name"] = "one";
    dt.Rows.Add(row);

    row = dt.NewRow();
    row["Id"] = 2;
    row["Name"] = "two";
    dt.Rows.Add(row);

    using (var writer = new StringWriter())
    using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
    {
        using (var reader = dt.CreateDataReader())
        {
            for (var i = 0; i < reader.FieldCount; i++)
            {
                csv.WriteField(reader.GetName(i));
            }
            csv.NextRecord();

            while (reader.Read())
            {
                csv.WriteField(reader.GetFieldValue<int>("Id"));
                csv.WriteField(reader.GetFieldValue<string>("Name"));
                csv.NextRecord();
            }
        }

        writer.ToString().Dump();
    }
}

If there are better ways, let me know. I'm not too familiar with data tables.

All 4 comments

Hi @JoshClose I think Wagimo was looking for a way to write DataTables to CSV files. At the link you provided, I only see information about how to read a CSV file to a DataTable, but not the reverse. Am I missing something?

@johnyesberg Oops, thanks. I'll need to add this to the documentation.

You could go through the rows and columns like this.

void Main()
{
    var dt = new DataTable();
    dt.Columns.Add("Id", typeof(int));
    dt.Columns.Add("Name", typeof(string));

    var row = dt.NewRow();
    row["Id"] = 1;
    row["Name"] = "one";
    dt.Rows.Add(row);

    row = dt.NewRow();
    row["Id"] = 2;
    row["Name"] = "two";
    dt.Rows.Add(row);

    using (var writer = new StringWriter())
    using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
    {       
        foreach (DataColumn dc in dt.Columns)
        {           
            csv.WriteField(dc.ColumnName);
        }
        csv.NextRecord();

        foreach (DataRow dr in dt.Rows)
        {           
            foreach (DataColumn dc in dt.Columns)
            {
                csv.WriteField(dr[dc]);
            }
            csv.NextRecord();
        }

        writer.ToString().Dump();
    }
}

Or you could use a DataReader and to it like this.

void Main()
{
    var dt = new DataTable();
    dt.Columns.Add("Id", typeof(int));
    dt.Columns.Add("Name", typeof(string));

    var row = dt.NewRow();
    row["Id"] = 1;
    row["Name"] = "one";
    dt.Rows.Add(row);

    row = dt.NewRow();
    row["Id"] = 2;
    row["Name"] = "two";
    dt.Rows.Add(row);

    using (var writer = new StringWriter())
    using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
    {
        using (var reader = dt.CreateDataReader())
        {
            for (var i = 0; i < reader.FieldCount; i++)
            {
                csv.WriteField(reader.GetName(i));
            }
            csv.NextRecord();

            while (reader.Read())
            {
                csv.WriteField(reader.GetFieldValue<int>("Id"));
                csv.WriteField(reader.GetFieldValue<string>("Name"));
                csv.NextRecord();
            }
        }

        writer.ToString().Dump();
    }
}

If there are better ways, let me know. I'm not too familiar with data tables.

I suggest this method add to library, because it's really useful.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

muzzamo picture muzzamo  路  5Comments

RifS picture RifS  路  5Comments

GraceYuJuSong picture GraceYuJuSong  路  4Comments

JoshClose picture JoshClose  路  5Comments

NeilMeredith picture NeilMeredith  路  4Comments