我有一个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
我知道我可以手动读取CSV文件并使用普通的StreamReader构建列表,但我想知道是否有更好的方法,也许使用LINQ?
答案 0 :(得分: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])
});
如果您已经为数据声明了类型,则可以使用该类型而不是匿名类型。
请注意,此代码根本不健全。它将无法正确处理包含逗号/换行符等的值,引用的字符串值或CSV文件中经常出现的任何其他深奥内容。
答案 1 :(得分:36)
您可以使用这样的简单代码,它会忽略标题但不能使用引号,但可能足以满足您的需求。
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])
}
或者您可以像其他人建议的那样使用库。
答案 2 :(得分:6)
答案 3 :(得分: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;
希望对您有所帮助或有用。
答案 4 :(得分:0)
它不使用LINQ,但是CsvHelper是实现对.NET对象的CSV解析的简单方法:
using (TextReader txt = new StreamReader(filename))
{
using (var csv = new CsvReader(txt))
{
var records = csv.GetRecords<PlantMaterial>();
return records.ToList();
}
}
答案 5 :(得分:0)
使用Cinchoo ETL库,可以将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());
}
}
}