CSV到对象模型映射

mpe*_*row 33 c# linq csv

我有一个CSV文件,我想读入List.这是一个示例文件:

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
Run Code Online (Sandbox Code Playgroud)

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

Luk*_*keH 37

对于您问题中显示的具体数据......

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])
                                });
Run Code Online (Sandbox Code Playgroud)

如果您已经为数据声明了类型,则可以使用该类型而不是匿名类型.

请注意,此代码是不稳健可言.它将无法正确处理包含逗号/换行符等的值,引用的字符串值或CSV文件中经常出现的任何其他深奥内容.


svi*_*ick 37

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

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])
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这对于带有逗号的字符串数据不起作用. (3认同)

Kei*_*ler 6

有一个代码项目:

http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

但是,您可能需要查看此处:

Linq和streamreader获取线路


JP *_*son 6

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

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

Plant,Material,DensityLbft3,StorageLocation
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样解析文件:

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();
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用LINQ:

var items = from item in linqCsv.DynamicRecords
            where item.Plant == "Fred" && item.DensityLbft3 >= 62.6
            orderby item.StorageLocation
            select item;
Run Code Online (Sandbox Code Playgroud)

希望对您有所帮助或有用.