簡體   English   中英

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

根據我對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM