Пользовательские преобразования при записи файлов CSV с использованием CsvHelper
В последнее время я занимался чтением и написанием CSV-файлов и столкнулся сCsvHelper это фантастика до сих пор. Я столкнулся с одной маленькой проблемой; Я использую пользовательский конвертер при чтении файлов, но когда я записываю их обратно, этот формат теряется. Мой формат CSV выглядит так:
67,1234-1,20150115,750,20150115,1340,549,549,406,0,FRG
Поля20150115,750
сопоставить с однимDateTime
поле называетсяStart
(Итак, 15.01.2015, 7:50). Моя карта классов выглядит так:
public sealed class DutyMap : CsvClassMap<Duty>
{
static readonly CultureInfo enUS = new CultureInfo("en-US");
public DutyMap()
{
Map(m => m.PersonId).Index(0);
Map(m => m.DutyName).Index(1);
Map(m => m.Start).ConvertUsing(row => ParseDate(row.GetField<String>(2), row.GetField<String>(3)));
Map(m => m.End).ConvertUsing(row => ParseDate(row.GetField<String>(4), row.GetField<String>(5)));
Map(m => m.DutyTime1).Index(6);
Map(m => m.DutyTime2).Index(7);
Map(m => m.FlightTime).Index(8);
Map(m => m.CreditHours).Index(9);
Map(m => m.DutyType).Index(10);
}
private static DateTime ParseDate(string date, string time)
{
DateTime ret;
if (time.Length < 4)
time = new String('0', 4 - time.Length) + time;
if (!DateTime.TryParseExact(date + time, "yyyyMMddHHmm", enUS, DateTimeStyles.None, out ret))
throw new FormatException(String.Format("Could not parse DateTime. Date: {0} Time: {1}", date, time));
return ret;
}
}
Это прекрасно работает, и теперь я могу вызвать синтаксический анализ всего файла следующим образом:
var csv = new CsvReader(sr);
csv.Configuration.HasHeaderRecord = false;
csv.Configuration.RegisterClassMap<DutyMap>();
Data = csv.GetRecords<Duty>().ToList();
Тем не менее, когда язаписывать файл:
csv.WriteRecords(Data);
Файл записан так:
67,7454-1,1/15/2015 7:50:00 AM,1/15/2015 1:40:00 PM,549,549,406,0,FPG
Просматривая документацию, я не вижу способа указать функцию разговора припишу, толькочтение, Единственное решение, которое я нашел, - это вручную написать каждую запись вручную:
var csv = new CsvWriter(sw);
foreach (var item in Data)
{
csv.WriteField(item.PersonId);
csv.WriteField(item.DutyName);
csv.WriteField(item.Start.ToString("yyyyMMdd"));
csv.WriteField(item.Start.ToString("Hmm"));
csv.WriteField(item.End.ToString("yyyyMMdd"));
csv.WriteField(item.End.ToString("Hmm"));
csv.WriteField(item.DutyTime1);
csv.WriteField(item.DutyTime2);
csv.WriteField(item.FlightTime);
csv.WriteField(item.CreditHours);
csv.WriteField(item.DutyType);
csv.NextRecord();
}
Есть лучший способ сделать это? Спасибо!