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