将DataSet \ DataTable转换为CSV

时间:2011-02-03 09:30:42

标签: c# .net ado.net

如果有办法从DataTable或DataSet生成CSV文件,请告诉我?具体而言,无需手动迭代DataTable行和连接。

请帮忙

5 个答案:

答案 0 :(得分:11)

有几种方法可以做到这一点。

最简单的一个(IMO)正在使用FileHelpers Library

FileHelpers.CsvEngine.DataTableToCsv(dataTable, filename);

答案 1 :(得分:3)

相对简单,紧凑且非常灵活的解决方案可以是以下扩展方法:

public static string ToCsv(this DataTable table, string colSep = "", string rowSep = "\r\n")
{
    var format = string.Join(colSep, Enumerable.Range(0, table.Columns.Count)
                                            .Select(i => string.Format("{{{0}}}", i)));

    return string.Join(rowSep, table.Rows.OfType<DataRow>()
                                        .Select(i => string.Format(format, i.ItemArray)));
}

请注意,此解决方案可能会导致大量数据出现问题,在这种情况下,您应该对输出进行流式处理。引用和格式化当然会使代码更复杂。

答案 2 :(得分:2)

我希望,还有一种可行的方法:

    static void Main(string[] args)
    {
        DataTable dt = new DataTable("MyTable");
        dt.Columns.Add("Id", typeof(int));
        dt.Columns.Add("Name", typeof(string));
        DataRow dr1 = dt.NewRow();
        dr1["Id"] = 1;
        dr1["Name"] = "John Smith";
        dt.Rows.Add(dr1);
        DataRow dr2 = dt.NewRow();
        dr2["Id"] = 2;
        dr2["Name"] = "John West";
        dt.Rows.Add(dr2);

        List<DataRow> list = dt.AsEnumerable().ToList();
        var strlist = from dr in list
                      select dr[0] + ", " + dr[1];
        var csv = string.Join(Environment.NewLine,strlist);
        Console.WriteLine(csv);
    }

答案 3 :(得分:1)

所以这是一个相当离奇的解决方案,但它比大多数都更快,因为它使用了JSON.net库的序列化。这大大加快了解决方案的速度。

步骤:

  1. 应该在数据表中创建每个列名的数组 简单
  2. 使用JSON.net将数据表转换为json字符串

    string json = JsonConvert.SerializeObject(dt, Formatting.None);

  3. 开始在c#字符串上使用Replace函数并剥离 所有json格式的json字符串。

    json = json.Replace("\"", "").Replace("},{", "\n").Replace(":", "").Replace("[{", "").Replace("}]", "");

  4. 然后使用步骤1中的数组从中删除所有列名 json字符串。你留下了一个csv格式的字符串。

  5. 考虑使用步骤1中创建的数组添加列名 以csv格式返回第一行。

答案 4 :(得分:1)

//Dataset To Xls
ExportDataSetToCsvFile(DS,@"C:\\");

internal static void ExportDataSetToCsvFile(DataSet _DataSet, string DestinationCsvDirectory)
{
    try
    {
        foreach (DataTable DDT in _DataSet.Tables)
        {
            String MyFile = @DestinationCsvDirectory + "\\_" + DDT.TableName.ToString() + DateTime.Now.ToString("yyyyMMddhhMMssffff") + ".csv";//+ DateTime.Now.ToString("ddMMyyyyhhMMssffff")
            using (var outputFile = File.CreateText(MyFile))
            {
                String CsvText = string.Empty;

                foreach (DataColumn DC in DDT.Columns)
                {
                    if (CsvText != "")
                        CsvText = CsvText + "," + DC.ColumnName.ToString();
                    else
                        CsvText = DC.ColumnName.ToString();
                }
                outputFile.WriteLine(CsvText.ToString().TrimEnd(','));
                CsvText = string.Empty;

                foreach (DataRow DDR in DDT.Rows)
                {
                    foreach (DataColumn DCC in DDT.Columns)
                    {
                        if (CsvText != "")
                            CsvText = CsvText + "," + DDR[DCC.ColumnName.ToString()].ToString();
                        else
                            CsvText = DDR[DCC.ColumnName.ToString()].ToString();
                    }
                    outputFile.WriteLine(CsvText.ToString().TrimEnd(','));
                    CsvText = string.Empty;
                }
                System.Threading.Thread.Sleep(1000);
            }
        }
    }
    catch (Exception Ex)
    {
        throw Ex;
    }  
}