c# - 将字符串 csv 转换为对象列表

标签 c# string parsing csv

我有以下刺痛

const string csv = "Foo1,Foo2,Foo3,Foo4,Foo5,Foo6,Ping Pong\n" +
                   "2016-02-29,1437.530029,1445.839966,1433.77002,1436.930054,34016300,1436.930054\n" +
                   "2016-02-25,1431.439941,1431.439941,1421.280029,1426.97998,78076500,1426.97998\n" +
                   "2016-02-24,1430.459961,1432.430054,1417.449951,1419.790039,29049900,1419.790039\n";

如何将其转换为 List<Model> 在哪里

public class Model
{
    public string Foo1 { get; set; }
    public string Foo2 { get; set; }
    public string Foo3 { get; set; }
    public string Foo4 { get; set; }
    public string Foo5 { get; set; }
    public string Foo6 { get; set; }
    public string Ping_Pong { get; set; }
}

注意 Ping Pong我的原始 csv 中的标题

我尝试使用 CsvHelper但没有成功,因为它采用的是流而不是字符串,我尝试转换解析失败

编辑 是否使用 CsvHelper 对我来说并不重要,最后我想将 csv 转换为 List<Model>

我该怎么做?

最佳答案

您可以使用 csv 变量创建一个 StringReader:

var textReader = new StringReader(csv);

var csvr = new CsvReader(textReader);
var records = csvr.GetRecords<Model>();

如果你想要自己的解析器:

var lines = csv.Split(new char[] {'\n'}, StringSplitOptions.RemoveEmptyEntries).Skip(1);
List<Model> models = new List<Model>();

foreach (var item in lines)
{
    var values = item.Split(',');
    var model = new Model
    {
        Foo1 = values[0],
        Foo2 = values[1],
        Foo3 = values[2],
        Foo4 = values[3],
        Foo5 = values[4],
        Foo6 = values[5],
        Ping_Pong = values[6],
    };

    models.Add(model);
}

编辑:

要使用 CsvHelper 解决 header 问题,您需要创建一个映射配置类来指定 header 和属性之间的映射:

public class ModelMap : CsvClassMap<Model>
{
    public ModelMap()
    {
        Map(m => m.Foo1);
        Map(m => m.Foo2);
        Map(m => m.Foo3);
        Map(m => m.Foo4);
        Map(m => m.Foo5);
        Map(m => m.Foo6);
        Map(m => m.Ping_Pong).Name("Ping Pong");
    }
}

这样使用:

var textReader = new StringReader(csv);

var csvr = new CsvReader(textReader);
csvr.Configuration.RegisterClassMap<ModelMap>();

var records = csvr.GetRecords<Model>();

关于c# - 将字符串 csv 转换为对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35900927/

相关文章:

c# - EntityFramework DbContext 生命周期 + Postgres : "An operation is already in progress."

java - 检查字符串是否由唯一字母组成的最简单方法?

java - 命令行输入问题 (Java)

algorithm - 有没有一种方法或算法可以将 DCG 转换为 Prolog 中的正常定性子句?

c# - 如何在 Visual Studio Code 上调试 AspNet 5 应用程序?

c# - 在主页 Nopcommerce 上添加 block 标题以分隔产品

java - 使用反射设置字段 - String 没有 valueOf(String) 方法

c# - 根据组合框中的选定项目获取文件名

c# - 在c#中捕获链接的rel类型和href

c# - SaveChanges CRM 2011 插件未处理的异常