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

C#使用CsvHelper向现有CSV文件写入指定单元格的问题

问题原因

  • 你声明的StringBuilder没有实际作用:拼接后的内容既没有赋值给record.EmailSent属性,也没有传入写入方法,代码里直接写入的还是读取时的原始EmailSent值,自然不会更新为"sent"。且AppendFormat用法错误,第一个参数没有占位符的情况下,第二个参数不会生效。
  • 目前只写入了EmailSent单个字段,原始CSV的其他列(姓名、邮箱等)会全部丢失,不符合使用需求。
  • 写入逻辑在邮件发送之前执行,哪怕邮件发送失败也会标记为已发送,逻辑不合理。
  • 没有对CsvWriter和StreamWriter做资源释放、缓冲区刷新操作,部分写入内容可能滞留在内存中没有落盘。

修正后代码

// 用using自动释放资源、刷新缓冲区
using var scan = new StreamReader(myBlob);
using var csvv = new CsvReader(scan, CultureInfo.InvariantCulture);
var records = csvv.GetRecords<Records>().ToList();

using var scanwriter = new StreamWriter(myBlob4);
using var csvwriter = new CsvWriter(scanwriter, CultureInfo.InvariantCulture);

// 先写CSV表头
csvwriter.WriteHeader<Records>();
csvwriter.NextRecord();

foreach (Records record in records)
{                
    var from = new EmailAddress("example.com", "John");
    var to = new EmailAddress(record.Email, record.Name);            
    var subject = "example";
    var msg = MailHelper.CreateSingleEmail(from, to, subject, txtf, htmlf);
    
    // 先发送邮件,成功后再更新标记
    var response = await client.SendEmailAsync(msg);
    
    // 可根据实际返回的response判断是否发送成功再赋值
    record.EmailSent = "sent";
    
    // 直接写入整条记录,保留所有原有列
    csvwriter.WriteRecord(record);
    csvwriter.NextRecord();
}

补充说明

如果不需要保留原始CSV的其他列,只需要输出邮箱和发送状态两列,可以自定义写入逻辑,不需要写入整行记录。如果写入的文件需要兼容Excel打开,可以配置CsvHelper的编码为UTF-8带BOM。

内容的提问来源于stack exchange,提问作者Juan Pablo Guerra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:39:00