如何在CSV文件中重新重新格式化日期值?
我有一个CSV文件,其中包含(除其他字段)(无效)DateTime值,其格式为“ 2021-11-20 14:16:16:52.255421”,我想摆脱毫秒或其他。
我尝试过这样的尝试,但是日期格式保持不变:
var csvConfiguration = new CsvConfiguration(CultureInfo.InvariantCulture);
csvConfiguration.HasHeaderRecord = true;
csvConfiguration.Delimiter = ";";
csvConfiguration.TrimOptions = TrimOptions.Trim;
Record[] records;
using (var reader = new StreamReader(CsvPath, Encoding.UTF8))
using (var csv = new CsvReader(reader, csvConfiguration))
{
records = csv.GetRecords<Record>().ToArray();
}
using (var writer = new StreamWriter($@"reformatted.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.CurrentCulture))
{
//I have also tried with these options, but it doesn't help either
//var options = new TypeConverterOptions { Formats = new[] { "yyyy-MM-dd HH:mm:ss" } };
//csv.Context.TypeConverterOptionsCache.AddOptions<DateTime>(options);
csv.WriteRecords(records.Where(x => x.Memo != null));
}
// "mbox_id";"email_address";"created";"updated";"created_by";"memo";
class Record
{
[Name("mbox_id")]
public string MailboxId { get; set; }
[Name("email_address")]
public string EmailAddress { get; set;}
[Name("created")]
public DateTime? Created { get; set; }
[Name("updated")]
public DateTime? Updated { get; set; }
[Name("created_by")]
public string CreatedBy { get; set;}
[Name("memo")]
public string Memo { get; set; }
}
我在做什么错?我真的不明白CSVWriter甚至如何了解输入格式...
I have a CSV file that contains (among other fields) (nullable) DateTime values that are formatted like "2021-11-20 14:16:52.255421" I want to get rid of the milliseconds or whatever that is.
I have tried like this, but somehow the date format remains the same:
var csvConfiguration = new CsvConfiguration(CultureInfo.InvariantCulture);
csvConfiguration.HasHeaderRecord = true;
csvConfiguration.Delimiter = ";";
csvConfiguration.TrimOptions = TrimOptions.Trim;
Record[] records;
using (var reader = new StreamReader(CsvPath, Encoding.UTF8))
using (var csv = new CsvReader(reader, csvConfiguration))
{
records = csv.GetRecords<Record>().ToArray();
}
using (var writer = new StreamWriter($@"reformatted.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.CurrentCulture))
{
//I have also tried with these options, but it doesn't help either
//var options = new TypeConverterOptions { Formats = new[] { "yyyy-MM-dd HH:mm:ss" } };
//csv.Context.TypeConverterOptionsCache.AddOptions<DateTime>(options);
csv.WriteRecords(records.Where(x => x.Memo != null));
}
// "mbox_id";"email_address";"created";"updated";"created_by";"memo";
class Record
{
[Name("mbox_id")]
public string MailboxId { get; set; }
[Name("email_address")]
public string EmailAddress { get; set;}
[Name("created")]
public DateTime? Created { get; set; }
[Name("updated")]
public DateTime? Updated { get; set; }
[Name("created_by")]
public string CreatedBy { get; set;}
[Name("memo")]
public string Memo { get; set; }
}
What am I doing wrong? I really don't understand how the CsvWriter would even know about the input format...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您的问题是,由于您的属性是类型
dateTime?
,您必须明确注册dateTime的类型转换器?
以及dateTime
:演示小提琴#1 在这里。
创建扩展方法:
so
如果经常出现这种情况,您可以为
typeconverteroptionscache
nofollow noreferrer“>在这里。Your problem is that, since your properties are of type
DateTime?
, you must explicitly register a type converter forDateTime?
as well asDateTime
:Demo fiddle #1 here.
If this situation arises often, you could create an extension method for
TypeConverterOptionsCache
like so:And then do:
Demo fiddle #2 here.