【问题标题】:How to write a CSV string on disk in C#如何在 C# 中将 CSV 字符串写入磁盘
【发布时间】:2018-03-16 08:14:40
【问题描述】:

我有一个 foreach 循环,我在其中从数据表创建一个 CSV 字符串。我正在使用 File.WriteAllText 方法将文件写入磁盘。 它在每次循环迭代后在指定路径上创建一个新的 .csv 文件,但每个新文件也包含其先前文件的数据。以下是我的示例代码:

 foreach (string CIInfo in CiInformation)
        {
            string[] CIId = CIInfo.Split(',');
            string query1 = "Some Query"
            if (conn.State == ConnectionState.Open)
            {
                SqlCommand cmd = new SqlCommand(query1, conn);
                cmd.CommandTimeout = 50000;
                dt.Load(cmd.ExecuteReader());
            }
            string CSV = DataTableToCSV(dt, ',');
            File.WriteAllText("D:\\NonMsCSV\\" + CIId[0] + ".csv", CSV);

有没有办法在每次迭代后创建一个新文件,该文件只包含它自己的数据而不是它的前任数据? 任何帮助将不胜感激。

 public static string DataTableToCSV(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();
    }

【问题讨论】:

  • 欢迎来到 SO。请访问stackoverflow.com/tour
  • 你的代码没有格式化,不够用。请提供完整且正确的代码。
  • 从文档DataTable.Load Method如果 DataTable 已经包含行,则来自数据源的传入数据将与现有行合并。 所以你正在传递整个数据到 DataTableToCSV。
  • 哈哈,现代 CSV 格式使用 \t 表示列,使用 \r\n 表示行 :) 想想吧。
  • @alerya,等什么?你有这种现代方式的规范吗?因为 rfc 4180 是明确的。 \t 没有收益。如果列数据没有同一侧,您的文本文件中将不会显示表格。常见的 c# CSV lib 使用逗号作为默认分隔符。并且 Excel 中的 Copy past 参数被破坏了 " " 字段分隔符不会被修剪; CSV 清晰且定义明确。对于未来,IT 可能会使用 Csv 库并停止这种毫无意义的事情。我不明白为什么有人要更改分隔符,是否有人将 Json [{}] 更改为 ~

标签: c# asp.net file csv


【解决方案1】:

每次迭代,您都添加到同一个数据表中。每个循环使用一个数据表实例,您的文件中将只有该数据:

foreach (string CIInfo in CiInformation)
{
    var localTable = new DataTable();

    string[] CIId = CIInfo.Split(',');
    string query1 = "Some Query"
    if (conn.State == ConnectionState.Open)
    {
        SqlCommand cmd = new SqlCommand(query1, conn);
        cmd.CommandTimeout = 50000;
        localTable .Load(cmd.ExecuteReader());
    }

    string CSV = DataTableToCSV(localTable, ',');
    File.WriteAllText("D:\\NonMsCSV\\" + CIId[0] + ".csv", CSV);
}

【讨论】:

    猜你喜欢
    • 2014-03-09
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    相关资源
    最近更新 更多