C# CSV到对象模型映射

C# CSV到对象模型映射,c#,linq,csv,C#,Linq,Csv,我有一个CSV文件,我想读入列表。下面是一个示例文件: Plant,Material,"Density, Lb/ft3",Storage Location FRED,10000477,64.3008,3300 FRED,10000479,62.612,3275 FRED,10000517,90,3550 FRED,10000517,72,3550 FRED,10000532,90,3550 FRED,10000532,72,3550 FRED,10000550,97,3050 我知道我可以手动

我有一个CSV文件,我想读入列表。下面是一个示例文件:

Plant,Material,"Density, Lb/ft3",Storage Location
FRED,10000477,64.3008,3300
FRED,10000479,62.612,3275
FRED,10000517,90,3550
FRED,10000517,72,3550
FRED,10000532,90,3550
FRED,10000532,72,3550
FRED,10000550,97,3050

我知道我可以手动读取CSV文件,并使用普通的StreamReader构建列表,但我想知道是否有更好的方法,也许可以使用LINQ?

有一个代码项目:

但是,您可能需要查看以下内容:


有关问题中显示的具体数据

var yourData = File.ReadAllLines("yourFile.csv")
                   .Skip(1)
                   .Select(x => x.Split(','))
                   .Select(x => new
                                {
                                    Plant = x[0],
                                    Material = x[1],
                                    Density = double.Parse(x[2]),
                                    StorageLocation = int.Parse(x[3])
                                });
如果已经为数据声明了类型,则可以使用该类型而不是匿名类型


请注意,这段代码一点也不健壮。它无法正确处理包含逗号/换行符等的值、带引号的字符串值或CSV文件中常见的任何其他深奥内容。

您可以使用这样一个简单的代码,它忽略标题,不使用引号,但可能足以满足您的需要

from line in File.ReadAllLines(fileName).Skip(1)
let columns = line.Split(',')
select new
{
  Plant = columns[0],
  Material = int.Parse(columns[1]),
  Density = float.Parse(columns[2]),
  StorageLocation = int.Parse(columns[3])
}

或者您可以像其他人建议的那样使用库。

我编写了一个简单的库,允许开发人员在CSV文件上使用LINQ。以下是我的博客帖子:

在您的情况下,您必须将标题字符串更改为如下所示:

Plant,Material,DensityLbft3,StorageLocation
var linqCSV = new CsvToXml("csvfile", true);
linqCsv.TextQualifier = null;

linqCsv.ColumnTypes.Add("Plant", typeof(string));
linqCsv.ColumnTypes.Add("Material", typeof(int));
linqCsv.ColumnTypes.Add("DensityLbft3", typeof(double));
linqCsv.ColumnTypes.Add("StorageLocation", typeof(int));

linqCsv.Convert();
var items = from item in linqCsv.DynamicRecords
            where item.Plant == "Fred" && item.DensityLbft3 >= 62.6
            orderby item.StorageLocation
            select item;
然后你可以像这样解析文件:

Plant,Material,DensityLbft3,StorageLocation
var linqCSV = new CsvToXml("csvfile", true);
linqCsv.TextQualifier = null;

linqCsv.ColumnTypes.Add("Plant", typeof(string));
linqCsv.ColumnTypes.Add("Material", typeof(int));
linqCsv.ColumnTypes.Add("DensityLbft3", typeof(double));
linqCsv.ColumnTypes.Add("StorageLocation", typeof(int));

linqCsv.Convert();
var items = from item in linqCsv.DynamicRecords
            where item.Plant == "Fred" && item.DensityLbft3 >= 62.6
            orderby item.StorageLocation
            select item;
然后可以像这样使用LINQ:

Plant,Material,DensityLbft3,StorageLocation
var linqCSV = new CsvToXml("csvfile", true);
linqCsv.TextQualifier = null;

linqCsv.ColumnTypes.Add("Plant", typeof(string));
linqCsv.ColumnTypes.Add("Material", typeof(int));
linqCsv.ColumnTypes.Add("DensityLbft3", typeof(double));
linqCsv.ColumnTypes.Add("StorageLocation", typeof(int));

linqCsv.Convert();
var items = from item in linqCsv.DynamicRecords
            where item.Plant == "Fred" && item.DensityLbft3 >= 62.6
            orderby item.StorageLocation
            select item;
希望这对您有所帮助或有用。

它不使用LINQ,而是一种简单的方法来实现对.NET对象的CSV解析:

using (TextReader txt = new StreamReader(filename))
{
    using (var csv = new CsvReader(txt))
    {
        var records = csv.GetRecords<PlantMaterial>();
        return records.ToList();
    }
}
使用(TextReader txt=新的StreamReader(文件名))
{
使用(var csv=新的CsvReader(txt))
{
var records=csv.GetRecords();
返回记录。ToList();
}
}
使用库,可以将CSV文件解析为对象

定义与CSV文件结构匹配的类型,如下所示

public class PlantType
{
    public string Plant { get; set; }
    public int Material { get; set; }
    public double Density { get; set; }
    public int StorageLocation { get; set; }
}
加载CSV文件

static void LoadCSV()
{
    using (var p = new ChoCSVReader<PlantType>("*** YOUR CSV FILE PATH ***")
        .WithFirstLineHeader(true)
        )
    {
        foreach (var rec in p)
        {
            Console.WriteLine(rec.Dump());
        }
    }
}
static void LoadCSV()
{
使用(var p=new ChoCSVReader(“***您的CSV文件路径***”)
.WithFirstLineHeader(真)
)
{
foreach(p中的var rec)
{
Console.WriteLine(rec.Dump());
}
}
}

查看什么内容的列表?你已经有这方面的课程了吗?匿名类型可以吗?我有一个类表示csv中的数据。@terphi需要使用引号,正如我所说的,我的代码不能使用引号。对不起,我猜我是在略读。我正在试图找出一种方法,列:Plant,Material。。。。可以在运行时定义,任何解决方案?