Benutzerdefinierte Konvertierungen beim Schreiben von CSV-Dateien mit CsvHelper

Ich habe in letzter Zeit CSV gelesen und geschrieben und bin auf @ gestoße CsvHelper was bisher fantastisch ist. Ich bin auf ein kleines Problem gestoßen. Ich verwende einen benutzerdefinierten Konverter zum Lesen der Dateien, aber wenn ich sie zurückschreibe, geht dieses Format verloren. Mein CSV-Format sieht folgendermaßen aus:

67,1234-1,20150115,750,20150115,1340,549,549,406,0,FRG

Die Felder20150115,750 map zu einem einzelnenDateTime Feld mit dem NamenStart (Also, 15.01.2015, 7:50 Uhr). Meine Klassenkarte sieht so aus:

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;
    }
}

Das funktioniert großartig und ich kann jetzt eine ganze Datei wie folgt parsen:

var csv = new CsvReader(sr);
csv.Configuration.HasHeaderRecord = false;
csv.Configuration.RegisterClassMap<DutyMap>();

Data = csv.GetRecords<Duty>().ToList();

Jedoch, wenn ichschreibe die Datei

csv.WriteRecords(Data);

Die Datei ist so geschrieben:

67,7454-1,1/15/2015 7:50:00 AM,1/15/2015 1:40:00 PM,549,549,406,0,FPG

Bei Durchsicht der Dokumentation sehe ich keine Möglichkeit, eine Konversationsfunktion bei @ anzugebeSchreibe, nurlese. Die einzige Lösung, die ich bisher gefunden habe, besteht darin, jeden Datensatz manuell von Hand zu schreiben:

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();
}

Gibt es einen besseren Weg, dies zu tun? Vielen Dank

Antworten auf die Frage(2)

Ihre Antwort auf die Frage