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.
相关产品推荐
相关产品推荐

