[英]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
根據我對CsvHelper
理解,默認的內置轉換器將處理大多數類型轉換的情況,它應該能夠轉換類的屬性類型。 無需將它們全部設置為字符串。 只需將它們放入您想要的類型即可。 一旦屬性名稱與 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;
}
來自 github 上的Wiki
使用 CsvHelper 非常簡單。 它的默認設置是為最常見的場景設置的。
這是一些設置數據。
演員.csv:
Id,FirstName,LastName
1,Arnold,Schwarzenegger
2,Matt,Damon
3,Christian,Bale
Actor.cs(代表演員的自定義類對象):
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>();
可能這會幫助你:
string dateTime = "2016-02-29";
DateTime dt;
DateTime.TryParseExact(dateTime,
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeLocal,
out dt);
將此示例中的正確代碼放入您的 set 運算符中。
這可以通過注冊ClassMap
來實現:
using var reader = new StreamReader(@"");
using var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
csv.Context.RegisterClassMap<TransactionLineMap>(); // <-- this line
var records = csv.GetRecords<TransactionLine>();
在ClassMap
中,您可以使用TypeConverterOption.Format("your-date-format")
定義 DateTime 的格式
internal class TransactionLineMap : ClassMap<TransactionLine>
{
public TransactionLineMap()
{
Map(m => m.Timestamp)
.TypeConverter<CsvHelper.TypeConversion.DateTimeConverter>()
.TypeConverterOption.Format("yyyy-MM-dd");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.