C# WinForm环境下根据行号删除CSV文件指定行的实现方法
C# WinForm 按行号删除CSV指定行实现方案
以下方案适配你的场景:CSV自带表头Sym,Size,Direction,Action,默认支持用户输入文件物理行号删除(即输入1对应表头行,输入2对应第一行业务数据,可根据需求调整行号映射逻辑)。
实现逻辑
- 校验用户输入的行号合法性,确保为有效正整数,且不超过CSV文件的总行数
- 一次性读取CSV所有行到内存集合中,该方式对小体积CSV执行效率更高,适合新手快速实现
- 移除目标行(注意C#中集合索引从0开始,需将用户输入的1开头行号减1得到对应索引)
- 将修改后的行集合覆盖写入原CSV文件
- 重新加载CSV到DataGridView,实现界面数据同步
完整代码示例
先约定控件命名:
- 行号输入文本框:
txtRowNum - 删除触发按钮:
btnDeleteRow - 展示数据的DataGridView:
dataGridView1 - 请将代码中的
csvPath替换为你的CSV文件实际存储路径
private void btnDeleteRow_Click(object sender, EventArgs e) { string csvPath = @"C:\你的文件路径\data.csv"; // 替换为实际CSV路径 int targetRowNum; // 1. 校验输入是否为有效数字 if (!int.TryParse(txtRowNum.Text.Trim(), out targetRowNum) || targetRowNum < 1) { MessageBox.Show("请输入有效的正整数行号!"); return; } // 2. 读取CSV所有行 List<string> allCsvLines = File.ReadAllLines(csvPath).ToList(); // 3. 校验行号是否超出范围 if (targetRowNum > allCsvLines.Count) { MessageBox.Show($"输入行号超出文件总行数,当前文件共{allCsvLines.Count}行!"); return; } // 4. 移除目标行:用户输入行号是1开头,集合索引是0开头,所以减1 // 如果你要删的是排除表头后的业务行号,比如输入1删第一行业务数据,这里改为 allCsvLines.RemoveAt(targetRowNum); 即可 allCsvLines.RemoveAt(targetRowNum - 1); // 5. 写回CSV文件 File.WriteAllLines(csvPath, allCsvLines); // 6. 重新加载DataGridView,和文件保持同步 LoadCsvToDataGridView(); // 直接复用你之前把CSV加载到dataGridView的现有逻辑即可 MessageBox.Show("删除成功!"); } // 你之前已经实现的加载CSV到DataGridView的方法,这里仅做示例,可直接替换为你自己的逻辑 private void LoadCsvToDataGridView() { string csvPath = @"C:\你的文件路径\data.csv"; DataTable dt = new DataTable(); // 读取表头 string[] headers = File.ReadAllLines(csvPath)[0].Split(','); foreach (string header in headers) { dt.Columns.Add(header); } // 读取业务数据 string[] rows = File.ReadAllLines(csvPath).Skip(1).ToArray(); foreach (string row in rows) { if (!string.IsNullOrWhiteSpace(row)) { dt.Rows.Add(row.Split(',')); } } dataGridView1.DataSource = dt; }
注意事项
- 操作前建议提前备份CSV文件,避免误操作导致数据丢失
- 如果你的CSV单字段内容包含逗号、换行符,需要用专门的CSV解析库处理,当前方案仅适合标准无特殊字符的CSV场景
- 若CSV文件体积超过100M,建议改用逐行读写的方式避免内存占用过高,小体积CSV直接用当前方案即可
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

