我需要使用 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++;
}
根据您的示例,您可以尝试类似的操作,因为您必须指定您提供的确切格式
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++;
}
正如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>();
}
}