C#导出CSV时使用Replace方法导致指定列重复的问题如何解决
问题根因
- 核心逻辑错误为同一行内容执行了两次拼接操作:第一次遍历全列替换
/为-时,已经将索引9列的-格式版本与其余列内容共同拼入行字符串;后续又单独将索引9列的/格式版本再次拼入同一行,最终行内容里同时存在该列的两个版本,对应CSV就会出现第9列重复显示两个值的问题。 - 次要不规范问题:先全局替换再单独回改的写法容易误改非日期字段中自带的
/、-字符,引发其他格式错误。
正确实现方案
遍历每一列时提前判断列索引,对应处理后单次拼接完成即可,参考代码如下:
// 遍历DataGridView行 foreach (DataGridViewRow row in dataGridView1.Rows) { // 跳过空白新行 if (row.IsNewRow) continue; List<string> cellList = new List<string>(); // 遍历当前行所有列 for (int colIndex = 0; colIndex < dataGridView1.Columns.Count; colIndex++) { string cellVal = row.Cells[colIndex].Value?.ToString() ?? string.Empty; // 非第9列执行斜杠转横杠,第9列保留原格式 if (colIndex != 9) { cellVal = cellVal.Replace('/', '-'); } // 处理CSV转义(避免内容含逗号、引号导致格式错乱) cellVal = $"\"{cellVal.Replace("\"", "\"\"")}\""; cellList.Add(cellVal); } // 单次拼接整行写入CSV string csvLine = string.Join(",", cellList); // 此处补充写入文件的逻辑 }
优化建议
如果日期格式转换需求仅针对日期类型字段,也可以直接在MySQL查询阶段用DATE_FORMAT函数处理不同列的输出格式,减少C#侧的字符串处理逻辑,执行效率更高。
内容的提问来源于stack exchange,提问作者Fyah10
相关产品推荐
相关产品推荐

