如何在 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; }
}
我有以下格式的 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; }
}