CsvHelper 解析 csv 并将字符串转换为 DateTime
CsvHelper parse csv and convert string to DateTime
我正在使用 CsvHelper 并能够解析 csv 文件。我的问题是如何将 Date
解析为 DateTime
object
我想在解析 csv 而不是迭代集合时通过 CsvHelper 转换它
public static List<StockModel> SplitCsv(string csv)
{
var textReader = new StringReader(csv);
var csvr = new CsvReader(textReader);
csvr.Configuration.RegisterClassMap<ModelMap>();
var records = csvr.GetRecords<StockModel>().ToList();
return records;
}
public class StockModel
{
public string Date { get; set; } // I want this object to be DateTime
public string Base { get; set; }
public string Open { get; set; }
}
public sealed class ModelMap : CsvClassMap<StockModel>
{
public ModelMap()
{
Map(m => m.Date);
Map(m => m.Base);
Map(m => m.Open);
}
}
CSV 示例
Date,Base,Open
2016-02-29,1437.530029,1445.839966
2016-02-25,1431.439941,1431.439941
2016-02-24,1430.459961,1432.430054
也许这会对你有所帮助:
string dateTime = "2016-02-29";
DateTime dt;
DateTime.TryParseExact(dateTime,
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeLocal,
out dt);
将此示例中的正确代码放入您的集合运算符中。
根据我对 CsvHelper
的理解,默认内置转换器将处理大多数类型转换情况,它应该能够转换 class 的属性类型。无需将它们全部设为字符串。只需将它们放入您想要的类型即可。一旦 属性 名称与 csv 中的列名称(如果存在)匹配,它就会自动将这些字段映射到它们的匹配 属性
public class StockModel
{
//2016-02-29
public DateTime Date { get; set; } // CsvHelper should be able to infer type
//1437.530029
public decimal Base { get; set; }
//1445.839966
public decimal Open { get; set; }
}
public static List<StockModel> SplitCsv(string csv)
{
var textReader = new StringReader(csv);
var csvr = new CsvReader(textReader);
var records = csvr.GetRecords<StockModel>().ToList();
return records;
}
从 Wiki 到 github
使用 CsvHelper 非常简单。它的默认设置适用于最常见的场景。
这是一些设置数据。
Actors.csv:
Id,FirstName,LastName
1,Arnold,Schwarzenegger
2,Matt,Damon
3,Christian,Bale
Actor.cs(表示演员的自定义 class 对象):
public class Actor
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
阅读
正在使用 CsvReader 读取 CSV 文件:
var csv = new CsvReader( new StreamReader( "Actors.csv" ) );
var actorsList = csv.GetRecords<Actor>();
我正在使用 CsvHelper 并能够解析 csv 文件。我的问题是如何将 Date
解析为 DateTime
object
我想在解析 csv 而不是迭代集合时通过 CsvHelper 转换它
public static List<StockModel> SplitCsv(string csv)
{
var textReader = new StringReader(csv);
var csvr = new CsvReader(textReader);
csvr.Configuration.RegisterClassMap<ModelMap>();
var records = csvr.GetRecords<StockModel>().ToList();
return records;
}
public class StockModel
{
public string Date { get; set; } // I want this object to be DateTime
public string Base { get; set; }
public string Open { get; set; }
}
public sealed class ModelMap : CsvClassMap<StockModel>
{
public ModelMap()
{
Map(m => m.Date);
Map(m => m.Base);
Map(m => m.Open);
}
}
CSV 示例
Date,Base,Open
2016-02-29,1437.530029,1445.839966
2016-02-25,1431.439941,1431.439941
2016-02-24,1430.459961,1432.430054
也许这会对你有所帮助:
string dateTime = "2016-02-29";
DateTime dt;
DateTime.TryParseExact(dateTime,
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeLocal,
out dt);
将此示例中的正确代码放入您的集合运算符中。
根据我对 CsvHelper
的理解,默认内置转换器将处理大多数类型转换情况,它应该能够转换 class 的属性类型。无需将它们全部设为字符串。只需将它们放入您想要的类型即可。一旦 属性 名称与 csv 中的列名称(如果存在)匹配,它就会自动将这些字段映射到它们的匹配 属性
public class StockModel
{
//2016-02-29
public DateTime Date { get; set; } // CsvHelper should be able to infer type
//1437.530029
public decimal Base { get; set; }
//1445.839966
public decimal Open { get; set; }
}
public static List<StockModel> SplitCsv(string csv)
{
var textReader = new StringReader(csv);
var csvr = new CsvReader(textReader);
var records = csvr.GetRecords<StockModel>().ToList();
return records;
}
从 Wiki 到 github
使用 CsvHelper 非常简单。它的默认设置适用于最常见的场景。
这是一些设置数据。
Actors.csv:
Id,FirstName,LastName
1,Arnold,Schwarzenegger
2,Matt,Damon
3,Christian,Bale
Actor.cs(表示演员的自定义 class 对象):
public class Actor
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
阅读
正在使用 CsvReader 读取 CSV 文件:
var csv = new CsvReader( new StreamReader( "Actors.csv" ) );
var actorsList = csv.GetRecords<Actor>();