csvhelper: как написать конкретную «ячейку» в существующем csv-файле на C#?

#c# #csvhelper

Вопрос:

У меня есть список клиентов в формате csv, который я использую для отправки электронных писем. Я хотел бы записать в CSV после выполнения каждой строки, чтобы разместить условное правило. Я использую csvhelper для управления файлом. Вот код:

 var scan = new StreamReader(myBlob);
var csvv = new CsvReader(scan, CultureInfo.InvariantCulture);
var records = csvv.GetRecords<Records>().ToList();
var scanwriter = new StreamWriter(myBlob4);
var csvwriter = new CsvWriter(scanwriter, CultureInfo.InvariantCulture);

foreach (Records record in records)
{
                
    var from = new EmailAddress("example.com", "John");
    var to = new EmailAddress(record.Email, record.Name);
            
    var subject = "exapmple";

    var msg = MailHelper.CreateSingleEmail(from, to, subject, txtf, htmlf);

    StringBuilder text = new StringBuilder();
    text.AppendFormat("sent", record.EmailSent);
                
    csvwriter.WriteField(record.EmailSent);
    csvwriter.NextRecord();
                
            
    var response = await client.SendEmailAsync(msg);
}
 

Однако мой csv-файл не добавляет значение «отправлено» в файл в столбце «Отправлено». Я использую StringBuilder, который может оказаться бесполезным в этом сценарии.

Комментарии:

1. Вы ничего не делаете с экземпляром StringBuilder после добавления строки.

2. Да, мой последний комментарий отражает это. Спасибо

Ответ №1:

Похоже, вы пытаетесь сделать что-то большее, чем это.

 void Main()
{
    var records = new List<SendEmail>
    {
        new SendEmail{ Email = "example.com", Name = "John" },
        new SendEmail{ Email = "example2.com", Name = "Jenny" }
    };
    var csvwriter = new CsvWriter(Console.Out, CultureInfo.InvariantCulture);
    
    foreach (var record in records)
    {
//      var from = new EmailAddress("example.com", "John");
//      var to = new EmailAddress(record.Email, record.Name);
//
//      var subject = "exapmple";
//
//      var msg = MailHelper.CreateSingleEmail(from, to, subject, txtf, htmlf);

        record.EmailSent = "sent";
        
        csvwriter.WriteRecord(record);
        csvwriter.NextRecord();

        //var response = await client.SendEmailAsync(msg);
    }
}

public class SendEmail
{
    public string Email { get; set; }
    public string Name { get; set; }
    public string EmailSent { get; set; }
}
 

Комментарии:

1. Я получаю ошибку в csvwriter, когда эти строки вызывают csvwriter. Запись записи(запись); csvwriter.NextRecord(); {csvконфигурация { Разрешениекомментарии = Ложь, BadDataFound = CSVHelper.BadDataFound, Размер буфера = 4096, Кэш-поля = Ложь, Комментарий = #, Количество байтов = Ложь, CultureInfo = , Разделитель = ,, обнаружениеделимитер = Ложь, обнаружениеделимитервалюсы = Система. Строка[], DetectColumnCountChanges = Ложь, DynamicPropertySort = , Кодировка = System.Text. Кодировка utf8 кодировка utf8, Скрытый, Escape = «, исключение messagescontainrawdata = True, getConstructor = CSVHelper. getConstructor, имя GetDynamicPropertyName =

2. Что такое сообщение об исключении? {CsvConfiguration { AllowComments ... это просто показывает, что находится в csvwriter.Configuration

Ответ №2:

 //using blocks will make sure the streams and disposed and file handles are closed properly,
// **even if an exception is thrown **
using(var scan = new StreamReader(myBlob))
using (var csvv = new CsvReader(scan, CultureInfo.InvariantCulture))
using (var scanwriter = new StreamWriter(myBlob4))
using (var csvwriter = new CsvWriter(scanwriter, CultureInfo.InvariantCulture))
{
    var records = csvv.GetRecords<Records>(); //ToList() was not needed or helpful here
    foreach (var 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);
                
        csvwriter.WriteField($"sent {record.EmailSent}");
        csvwriter.NextRecord();           
            
        var response = await client.SendEmailAsync(msg);
    }
}
 

Комментарии:

1. Эй, спасибо, что посмотрели на это. Я попытался добавить с помощью блоков, но тогда это утверждение не будет работать var records = csvv.GetRecords<Записи>(); Похоже, csvv не был распознан, есть идеи, почему?

2. Кроме того, csvwriter выдает эту ошибку: ================ {CsvConfiguration { AllowComments = False, BadDataFound = CSVHelper.BadDataFound, Размер буфера = 4096, Поля кэша = False, Комментарий = #, Количество байтов = False, CultureInfo = , Разделитель = ,, DetectDelimiter = False, DetectDelimiterValues = Система. Строка[], DetectColumnCountChanges = Ложь, DynamicPropertySort = , Кодировка = System.Text. Кодировка utf8 кодировка utf8, Скрытый, Escape = «, исключение messagescontainrawdata = True, getConstructor = CSVHelper. getConstructor, имя GetDynamicPropertyName =