#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 =