2010-08-16 124 views
31

我有一个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文件中手动读取,并建立使用普通的StreamReader的名单,但我不知道是否有更好的方法,可能使用LINQ?

+0

要列出什么?你有上课吗?匿名类型好吗? – svick 2010-08-16 22:02:26

+0

我有一个类表示csv中的数据。 – mpenrow 2010-08-16 22:04:39

回答

35

您可以使用像这样的简单代码,它忽略标题并且不适用于引号,但可能足以满足您的需要。

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]) 
} 

或者您可以像其他人一样使用库。

+3

这不适用于包含逗号的字符串数据。 – terphi 2012-11-24 23:00:14

+1

@terphi这将需要使用引号,就像我说的,我的代码将无法正常工作。 – svick 2012-11-24 23:01:22

+0

对不起,我猜是我在偷看。 – terphi 2012-11-25 06:55:17

31

对于你的问题出具体的数据......

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文件中常见的任何其他深奥内容。

+0

我试图找出列的方式:工厂,材料....可以在运行时定义,任何解决方案? – 2016-06-17 22:28:39

6

我写了一个简单的库,允许开发人员在CSV文件上使用LINQ。这里是我的博客文章吧:http://procbits.com/2010/10/11/using-linq-with-csv-files/

在你的情况,你必须改变你的头字符串看起来像这样:

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

然后,您可以使用LINQ这样的:

var items = from item in linqCsv.DynamicRecords 
      where item.Plant == "Fred" && item.DensityLbft3 >= 62.6 
      orderby item.StorageLocation 
      select item; 

希望帮助或工程您。