CsvHelper анализирует csv и конвертирует строку в DateTime

Я работаю с CsvHelper и могу анализировать файл csv. Мой вопрос в том, как я могу разобрать Date на DateTime объект

Я хочу преобразовать его через CsvHelper, пока он анализирует csv, а не повторяет коллекцию

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

person user829174    schedule 14.03.2016    source источник
comment
Что ты пробовал? что такое базовый и открытый?   -  person BugFinder    schedule 14.03.2016
comment
@Valentin, я хочу конвертировать через CsvHelper   -  person user829174    schedule 14.03.2016
comment
Имеет ли смысл stackoverflow.com/questions/31817473/?   -  person Valentin    schedule 14.03.2016
comment
Вы можете объяснить, почему он не работает - он преобразуется из любого формата, разрешенного для текущей культуры.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 14.03.2016


Ответы (2)


Насколько я понимаю 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;
}

Из Wiki на github

Использовать 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; }
}

Чтение

Чтение CSV-файла с помощью CsvReader:

var csv = new CsvReader( new StreamReader( "Actors.csv" ) );
var actorsList = csv.GetRecords<Actor>();
person Nkosi    schedule 14.03.2016

Возможно, это поможет вам:

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

поместите правильный код из этого примера в свой оператор набора.

person Leonid Malyshev    schedule 14.03.2016