如何在 C# 中使用 csvHelper 将两个单独列中的日期和时间合并到一个新的日期时间列中

How to merge date and time from two separate columns into a new datetime column using csvHelper in C#

我有以下格式的 CSV 文件。

在下面的代码片段中使用csvHelper(使用Visual Studio 2019),我可以成功读取文件。

public ActionResult UploadCsvFile(IFormFile file)
        {
            if (file != null)
            {
                try
                {
                    var basePath = Path.Combine(_hostEnvironment.WebRootPath, "uploads/");
                    if (!Directory.Exists(basePath))
                        Directory.CreateDirectory(basePath);    
                    var filePath = Path.Combine(basePath, file.FileName);
                    using (var stream = new FileStream(filePath, FileMode.Create))
                    {
                        file.CopyTo(stream);
                    }   
                    var config = new CsvConfiguration(CultureInfo.CurrentCulture)
                    {
                        Delimiter = ";",
                        HasHeaderRecord = true
                    };
                    using (var Reader = new StreamReader(filePath))  
                    using (var csv = new CsvReader(Reader, config))
                    {
                        csv.Context.RegisterClassMap<CsvLineClassMap>();
                        var records = csv.GetRecords<CsvLine>().ToList();   
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }
            return Json(null);
        }

从调试中window我可以看到数据记录(从那里你可以看到日期和时间的单独列)。

但是,我需要在具有日期时间格式的单个列中获取结果,如下所示重新创建。

调查过,没能解决。 :(

如果要将结果转换为 POCO,则编写一个 getter 方法,在该方法中连接日期和时间字段并将其转换为 return 日期时间 属性.

(或)

使用这个功能

DateTime GetDateTime(string date, string time)
{
    return DateTime.ParseExact(date + " " + time, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture);
}

并将结果附加到 return 列表。

尝试向您的列表中添加一个项目records并按如下方式连接日期字段和时间字段:

...
using (var csv = new CsvReader(Reader, config))
{
    csv.Context.RegisterClassMap<CsvLineClassMap>();
    var records = csv.GetRecords<CsvLine>().ToList();

    var newDateTime = new DateTime();
    newDateTime = Convert.ToDateTime(records[2] + " " + records[2]);
    records.Add(newDateTime);
}
...

此外,您可以将以下内容用于日期转换部分并格式化日期和时间:

DateTime dt1 = DateTime.ParseExact(records[2] + " " + records[2], "dd/MM/yy h:mm:ss tt", CultureInfo.InvariantCulture);

您可以在 ClassMap

中使用 Convert 方法
void Main()
{
    System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("es");

    var data = new StringBuilder();
    data.AppendLine("Code;Date;Time;Level;Flow;Volumen");
    data.AppendLine("OB-0100-99;16.07.2021;19:00:00;125,53;38,8;1621770");
    data.AppendLine(";16.07.2021;20:00:00;138,6;69,4;1621780");

    var config = new CsvConfiguration(CultureInfo.CurrentCulture)
    {
        Delimiter = ";"
    };
    
    using (var streamReader = new StringReader(data.ToString()))
    using (var csv = new CsvReader(streamReader, config))
    {
        csv.Context.RegisterClassMap<CsvLineClassMap>();
        var records = csv.GetRecords<CsvLine>().ToList().Dump();
    }
    
}

public class CsvLineClassMap : ClassMap<CsvLine>
{
    public CsvLineClassMap()
    {
        Map(x => x.Flow);
        Map(x => x.Code);
        Map(x => x.DateTime).Convert(x => 
        { 
            return DateTime.ParseExact(
                x.Row.GetField("Date") + " " + x.Row.GetField("Time"),
                "dd.MM.yyyy H:mm:ss",
                CultureInfo.InvariantCulture);
        });
        Map(x => x.Level);
        Map(x => x.Volumen);
    }
}

public class CsvLine
{
    public double Flow { get; set; }
    public string Code { get; set; }
    public DateTime DateTime { get; set; }
    public double Level { get; set; }
    public double Volumen { get; set; }
}