【问题标题】:CsvHelper parse csv and convert string to DateTimeCsvHelper 解析 csv 并将字符串转换为 DateTime
【发布时间】:2016-03-14 14:44:27
【问题描述】:

我正在使用 CsvHelper 并能够解析 csv 文件。我的问题是如何将Date 解析为DateTime 对象

我想在解析 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

【问题讨论】:

  • 你尝试了什么? base 和 open 应该是什么?
  • @Valentin,我想通过 CsvHelper 转换它
  • 你可能会解释它是如何不工作的 - 它从任何对当前文化合法的格式转换

标签: c# csv csvhelper


【解决方案1】:

根据我对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;
}

来自Wikigithub

使用 CsvHelper 非常简单。它的默认设置是针对最常见的场景设置的。

这是一些设置数据。

Actors.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>();

【讨论】:

    【解决方案2】:

    也许这会对你有所帮助:

            string dateTime = "2016-02-29";
            DateTime dt;
            DateTime.TryParseExact(dateTime,
                "yyyy-MM-dd",
                CultureInfo.InvariantCulture,
                DateTimeStyles.AssumeLocal,
                out dt);
    

    将此示例中的正确代码放入您的集合运算符中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      相关资源
      最近更新 更多