You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#循环生成CSV文件问题:如何避免包含历史数据

解决CSV文件重复包含之前迭代数据的问题

嘿,我一眼就看出问题所在啦!你遇到的情况是因为你的DataTable对象在每次循环迭代时没有被重置,导致新查询的数据一直追加到旧数据后面,最终生成的CSV自然就包含了之前所有循环的内容。

问题根源

你应该是在foreach循环外面声明了DataTable dt这个对象对吧?每次调用dt.Load(cmd.ExecuteReader())的时候,Load方法默认是把查询结果追加到现有的DataTable中,而不是替换掉原有数据。循环几次,DataTable里就攒了几次的数据。

两种解决办法

方法1:每次循环新建一个DataTable(推荐)

最简单直接的方式就是在每次循环内部创建新的DataTable实例,这样每次都是空的表来加载新数据:

foreach (string CIInfo in CiInformation)
{
    string[] CIId = CIInfo.Split(',');
    string query1 = "Some Query";
    
    // 关键:每次循环都新建DataTable,确保初始状态为空
    DataTable dt = new DataTable();
    
    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);
}

方法2:清空现有DataTable的内容和结构

如果你不想频繁创建新对象,可以在每次循环开始时清空DataTable的所有行和列(因为不同查询可能返回不同的列结构,只清行可能不够):

// 假设dt在循环外声明
DataTable dt = new DataTable();

foreach (string CIInfo in CiInformation)
{
    string[] CIId = CIInfo.Split(',');
    string query1 = "Some Query";
    
    // 清空所有行和列,重置为初始状态
    dt.Clear();
    dt.Columns.Clear();
    
    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);
}

额外小优化(可选)

你的DataTableToCSV方法目前没有处理字段中包含分隔符的情况,如果数据里有逗号,生成的CSV会格式错乱。可以稍微修改一下,把字段用双引号包裹:

public static string DataTableToCSV(DataTable datatable, char separator)
{
    StringBuilder sb = new StringBuilder();
    
    // 处理表头
    for (int i = 0; i < datatable.Columns.Count; i++)
    {
        sb.Append($"\"{datatable.Columns[i].ColumnName}\"");
        if (i < datatable.Columns.Count - 1)
            sb.Append(separator);
    }
    sb.AppendLine();
    
    // 处理行数据
    foreach (DataRow dr in datatable.Rows)
    {
        for (int i = 0; i < datatable.Columns.Count; i++)
        {
            // 把字段内容中的双引号替换成两个双引号(CSV转义规则)
            string value = dr[i].ToString().Replace("\"", "\"\"");
            sb.Append($"\"{value}\"");
            
            if (i < datatable.Columns.Count - 1)
                sb.Append(separator);
        }
        sb.AppendLine();
    }
    return sb.ToString();
}

这样生成的CSV会更规范,避免字段里的分隔符破坏格式。

内容的提问来源于stack exchange,提问作者A.S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:23:32