如何使用 CsvReader 指定自定义 DateOnly 格式?

问题描述 投票:0回答:2

我需要使用 CsvReader 读取 CSV 文件,但是我有一个自定义日期格式 (yyyyMMdd),默认情况下无法转换为

DateOnly
。如何指定此自定义日期格式?使用一些注释可以吗?

这是我目前拥有的代码,它失败了

FormatException:字符串“20230817”未被识别为有效的 DateOnly。

class Foo
{
    public string Title { get; set; } = null!;
    public DateOnly Date { get; set; }
}

var sb = new StringBuilder();
sb.Append(@"Title,Date");
sb.AppendLine();
sb.Append(@"hello world,20230817");
sb.AppendLine();


using var stringReader = new StringReader(sb.ToString());
using var csvReader = new CsvReader(stringReader, CultureInfo.InvariantCulture);

int lineIndex = 0;

while(csvReader.Read())
{
    if(lineIndex == 0)
    {
        csvReader.ReadHeader();
    } else
    {
        var foo = csvReader.GetRecord<Foo>();
    }

    lineIndex++;
}
c# date csvhelper csvreader dateonly
2个回答
0
投票

根据您的示例,您可以尝试类似的操作,因为您必须指定您提供的确切格式

StringBuilder sb = new StringBuilder();
sb.Append(@"Title,Date");
sb.AppendLine();
sb.Append(@"hello world,20230817");
sb.AppendLine();
using var stringReader = new StringReader(sb.ToString());

using var csvReader = new CsvReader(stringReader, CultureInfo.InvariantCulture);

int lineIndex = 0;
while (csvReader.Read())
{
    if (lineIndex == 0)
    {
        csvReader.ReadHeader();
    }
    else
    {
        var foo = new Foo() { Title = csvReader.GetField<string>(0), Date = DateOnly.ParseExact(csvReader.GetField<string>(1), "yyyyMMdd") };
    }
    lineIndex++;
}

0
投票

正如Rand Random 评论的那样,您有两种方法来添加格式。

您只需添加

Format
注释即可

class Foo
{
    public string Title { get; set; } = null!;
    
    [Format("yyyyMMdd")]
    public DateOnly Date { get; set; }
}

或者您可以设置所有

DateOnly
值以使用
TypeConverterOptionsCache

的格式
var sb = new StringBuilder();
sb.AppendLine(@"Title,Date");
sb.AppendLine(@"hello world,20230817");

using var stringReader = new StringReader(sb.ToString());
using var csvReader = new CsvReader(stringReader, CultureInfo.InvariantCulture);

var options = new TypeConverterOptions { Formats = new[] { "yyyyMMdd" } };
csvReader.Context.TypeConverterOptionsCache.AddOptions<DateOnly>(options);

if (csvReader.Read())
{
    csvReader.ReadHeader();

    while (csvReader.Read())
    {
        var foo = csvReader.GetRecord<Foo>();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.