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

C# 按Id列替换CSV指定行时其余内容丢失如何解决

问题根因分析
  • 写文件逻辑错误:最后调用File.WriteAllText时仅传入了replacedLine单条替换后的行,直接覆盖了整个CSV文件,自然丢失了其余所有行
  • 循环逻辑错误:匹配到目标Id后replacedLine被赋值不为空,后续所有行的解析都会强制用替换后的行拆分,导致返回的listInvoices里除了匹配行之前的条目,后面全是重复的替换行数据
修正后可运行代码
public static IEnumerable<Invoice> Replace(int Id, string invoice)
{
    var lines = File.ReadAllLines("Invoices.csv");
    var processedLines = new List<string>(); // 存储所有处理后的行
    var listInvoices = new List<Invoice>();

    foreach (var line in lines)
    {
        var currentLine = line;
        var value = currentLine.Split(";");

        // 仅当前行匹配目标Id时执行替换
        if (Int32.Parse(value[1]) == Id) 
        {
            currentLine = invoice;
            value = currentLine.Split(";");
        }

        // 构造返回的Invoice对象
        var invoice1 = new Invoice()
        {
            DateAndTimeCreation = value[0],
            Id = Int32.Parse(value[1]),
            Status = GetStatus(value[2]),
            Amount = Decimal.Parse(value[3]),
            PaymentMethod = GetPayment(value[4])
        };
        listInvoices.Add(invoice1);
        processedLines.Add(currentLine); // 存入处理后的行
    }

    // 全量写回所有处理后的行,保留原有未匹配内容
    File.WriteAllLines("Invoices.csv", processedLines);
    return listInvoices;
}
注意事项
  • 如果CSV包含表头,需要跳过第一行再做Id匹配,避免解析报错
  • 建议补充异常判断逻辑:比如行拆分后字段数不足、Id解析失败的场景,避免运行时崩溃
  • 10行级别的小文件用ReadAllLines完全没问题,处理GB级大文件时建议改用流式读写降低内存占用

内容的提问来源于stack exchange,提问作者Кирилл Филободченко

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:54:03