将数据集/数据表转换为 CSV

Posted

技术标签:

【中文标题】将数据集/数据表转换为 CSV【英文标题】:Converting DataSet/DataTable to CSV 【发布时间】:2011-06-20 12:57:09 【问题描述】:

如果有任何方法可以从 DataTable 或 DataSet 生成 CSV 文件,请告诉我?具体而言,无需手动遍历 DataTable 行并进行连接。

请帮忙

【问题讨论】:

为什么你不想遍历 DataTable 的行?这将是非常简单的...... 我在寻找更快捷的方法。 您可以查看gist.github.com/riyadparvez/4467668 【参考方案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;
      

【讨论】:

这个答案并不清楚它如何解决 OP 的问题。您应该编辑它以使其更清晰和更具可读性【参考方案2】:

一个相对简单、紧凑且相当灵活的解决方案可能是以下扩展方法:

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)));

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

【讨论】:

【参考方案3】:

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

步骤:

    创建数据表中每个列名的数组,应该是 简单

    使用 JSON.net 将数据表转换为 json 字符串

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

    开始在 c# 字符串上使用 Replace 函数并去除 所有json格式的json字符串。

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

    然后使用步骤 1 中的数组从 json字符串。剩下的是 csv 格式的字符串。

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

【讨论】:

【参考方案4】:

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

    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);
    

【讨论】:

我注意到的唯一缺点是,如果将来要添加更多列,我们需要连接 dt[Index],除非这看起来不错。【参考方案5】:

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

其中一个最简单的 (IMO) 是使用 FileHelpers Library

FileHelpers.CsvEngine.DataTableToCsv(dataTable, filename);

【讨论】:

以上是关于将数据集/数据表转换为 CSV的主要内容,如果未能解决你的问题,请参考以下文章

MAINFRAME:在 JCL 中排序以将数据集转换为 CSV 格式

如何从 libSVM 中使用的数据集转换为 weka 中使用的格式数据(*.arff 或 *.csv)

将文本数据集转换为数字数据集

Caffe:将 CSV 文件转换为 HDF5

Spark 无法读取 CSV 文件并转换为数据集

如何将数据集转换为数据表