gpt4 book ai didi

c# - 使用 CsvHelper 编写 CSV 文件时的自定义转换

转载 作者:太空狗 更新时间:2023-10-29 22:11:56 30 4
gpt4 key购买 nike

我最近一直在做一些 CSV 读写,遇到了 CsvHelper到目前为止这太棒了。我遇到了一个小问题;我在读取文件时使用自定义转换器,但当我将它们写回时,该格式丢失了。我的 CSV 格式如下所示:

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

20150115,750 字段映射到名为 Start 的单个 DateTime 字段(因此,01/15/2015 7:50 AM) .我的类(class) map 如下所示:

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

有更好的方法吗?谢谢!

最佳答案

您可以使用自定义类型转换器 (https://github.com/JoshClose/CsvHelper/wiki/Custom-TypeConverter) 来实现。只需覆盖 ConvertToString 方法即可。

public class TestConverter : DefaultTypeConverter
{
public override string ConvertToString(TypeConverterOptions options, object value)
{
return base.ConvertToString(options, value);
}
}

并在映射时指定转换器:

Map(m => m.PersonId).Index(0).TypeConverter<TestConverter>();

关于c# - 使用 CsvHelper 编写 CSV 文件时的自定义转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31817473/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com