将DataTable转换为CSV的最有效方法

Mik*_*son 14 c# csv datatable performance

我正在使用DataTable,我需要将它们转换为CSV文件格式.我正在使用的大多数表都有超过50,000条记录,所以我试图最小化转换它们所需的时间.

这是我目前的方法:

    public static string table_to_csv(DataTable table)
    {
        string file = "";

        foreach (DataColumn col in table.Columns)
            file = string.Concat(file, col.ColumnName, ",");

        file = file.Remove(file.LastIndexOf(','), 1);
        file = string.Concat(file, "\r\n");

        foreach (DataRow row in table.Rows)
        {
            foreach (object item in row.ItemArray)
                file = string.Concat(file, item.ToString(), ",");

            file = file.Remove(file.LastIndexOf(','), 1);
            file = string.Concat(file, "\r\n");
        }

        return file;
    }
Run Code Online (Sandbox Code Playgroud)

有什么方法可以提高这种方法的效率吗?我欢迎您提出任何修改和想法!

fub*_*ubo 22

是的,使用System.Text.StringBuilder来处理大字符串.我实现了这个:

public static string DataTableToCSV(this DataTable datatable, char seperator)
{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < datatable.Columns.Count; i++)
    {
        sb.Append(datatable.Columns[i]);
        if (i < datatable.Columns.Count - 1)
            sb.Append(seperator);
    }
    sb.AppendLine();
    foreach (DataRow dr in datatable.Rows)
    {
        for (int i = 0; i < datatable.Columns.Count; i++)
        {
            sb.Append(dr[i].ToString());

            if (i < datatable.Columns.Count - 1)
                sb.Append(seperator);
        }
        sb.AppendLine();
    }
    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案符合我的要求,一个包含超过3万条记录的DataTable过去需要花费几分钟,现在只需不到1秒。谢谢。 (2认同)

Luc*_*rre 7

这是我在Utility类中使用的方法.适合我正在做的事情.

 public static void GenerateCSV(DataTable dt)
    {  
        StringBuilder sb = new StringBuilder();
        try
        {
            int count = 1;
            int totalColumns = dt.Columns.Count;
            foreach (DataColumn dr in dt.Columns)
            {
                sb.Append(dr.ColumnName);

                if (count != totalColumns)
                {
                    sb.Append(",");
                }

                count++;
            }

            sb.AppendLine();

            string value = String.Empty;
            foreach (DataRow dr in dt.Rows)
            {
                for (int x = 0; x < totalColumns; x++)
                {
                    value = dr[x].ToString();

                    if (value.Contains(",") || value.Contains("\""))
                    {
                        value = '"' + value.Replace("\"", "\"\"") + '"';
                    }

                    sb.Append(value);

                    if (x != (totalColumns - 1))
                    {
                        sb.Append(",");
                    }
                }

                sb.AppendLine();
            }
        }
        catch (Exception ex)
        {
            // Do something
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 投票,因为此解决方案还检查并在需要时转义字符串. (2认同)