Linq到CSV按列值选择

Linq到CSV按列值选择,linq,Linq,我知道今天早些时候我以不同的方式提出了这个问题,但我已经将我的需求做了一些改进 给定以下csv文件,其中第一列是标题,可以有任意数量的列 year,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017 income,1000,1500,2000,2100,2100,2100,2100,2100,2100,2100 dividends,100,200,300,300,300,300,300,300,300,300 net profit,1100,170

我知道今天早些时候我以不同的方式提出了这个问题,但我已经将我的需求做了一些改进

给定以下csv文件,其中第一列是标题,可以有任意数量的列

year,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017
income,1000,1500,2000,2100,2100,2100,2100,2100,2100,2100
dividends,100,200,300,300,300,300,300,300,300,300
net profit,1100,1700,2300,2400,2400,2400,2400,2400,2400,2400
expenses,500,600,500,400,400,400,400,400,400,400
profit,600,1100,1800,2000,2000,2000,2000,2000,2000,2000
如何选择给定年份的利润值?因此,我可能会提供一年,比如说2011年,并期望收回2000年的利润值

目前,我有这个,它显示了每年的利润值,但理想情况下,我想指定年份并获得利润值

        var data = File.ReadAllLines(fileName)
            .Select( 
                l => {
                    var split = l.Split(",".ToCharArray());
                    return split;
                }
            );

        var profit = (from p in data where p[0] == profitFieldName select p).SingleOrDefault();
        var years = (from p in data where p[0] == yearFieldName select p).FirstOrDefault();
        int columnCount = years.Count() ;

        for (int t = 1; t < columnCount; t++)
            Console.WriteLine("{0} : ${1}", years[t], profit[t]);
var data=File.ReadAllLines(文件名)
。选择(
l=>{
var split=l.split(“,”.ToCharArray());
收益分割;
}
);
var profit=(来自数据中的p,其中p[0]==profitFieldName选择p);
var years=(从数据中的p开始,其中p[0]==yearFieldName选择p);
int columnCount=years.Count();
for(int t=1;t
您的数据格式很糟糕,但我认为最好的方法是定义一个类,创建一个列表,然后使用您的输入创建要添加到列表中的对象。然后你可以做任何你需要的查询来得到你想要的结果

class MyData
{
    public string Year { get; set; }
    public decimal Income { get; set; }
    public decimal Dividends { get; set; }
    public decimal NetProfit { get; set; }
    public decimal Expenses { get; set; }
    public decimal Profit { get; set; }
}

// ...

string dataFile = @"C:\Temp\data.txt";
List<MyData> list = new List<MyData>();

using (StreamReader reader = new StreamReader(dataFile))
{
    string[] years = reader.ReadLine().Split(',');
    string[] incomes = reader.ReadLine().Split(',');
    string[] dividends = reader.ReadLine().Split(',');
    string[] netProfits = reader.ReadLine().Split(',');
    string[] expenses = reader.ReadLine().Split(',');
    string[] profits = reader.ReadLine().Split(',');

    for (int i = 1; i < years.Length; i++) // index 0 is a title
    {
        MyData myData = new MyData();
        myData.Year = years[i];
        myData.Income = decimal.Parse(incomes[i]);
        myData.Dividends = decimal.Parse(dividends[i]);
        myData.NetProfit = decimal.Parse(netProfits[i]);
        myData.Expenses = decimal.Parse(expenses[i]);
        myData.Profit = decimal.Parse(profits[i]);

        list.Add(myData);
    }
}

// query for whatever data you need
decimal maxProfit = list.Max(data => data.Profit);
类MyData
{
公共字符串年份{get;set;}
公共十进制收入{get;set;}
公共十进制红利{get;set;}
公共十进制净利润{get;set;}
公共十进制费用{get;set;}
公共十进制利润{get;set;}
}
// ...
字符串数据文件=@“C:\Temp\data.txt”;
列表=新列表();
使用(StreamReader=新StreamReader(数据文件))
{
string[]years=reader.ReadLine().Split(',');
字符串[]=reader.ReadLine().Split(',');
字符串[]=reader.ReadLine().Split(',');
字符串[]netProfits=reader.ReadLine().Split(',');
string[]expenses=reader.ReadLine().Split(',');
字符串[]=reader.ReadLine().Split(',');
对于(int i=1;idata.Profit);

我今天已经回答了一次,但这个答案更充实,希望更清晰

string rowName = "profit";
string year = "2011";

var yearRow = data.First();
var yearIndex = Array.IndexOf(yearRow, year);

// get your 'profits' row, or whatever row you want
var row = data.Single(d => d[0] == rowName);

// return the appropriate index for that row.
return row[yearIndex];

这对我很有用。

是的,这是一种不幸的格式。:)我有点喜欢这种方法,但我担心我提供的行可能不是唯一的行,它们需要可变,因此这可能不起作用。结构可能更像
类YearData{public int Year;public Dictionary Values;}
,假设每年的值/属性需要松散定义或可变。实际上,是的,那也行。考虑到我们正在讨论的文件可能只有几k大小,并且大体上将成为标准文件,我想我仍然会使用你的方法@Kirk。我之前的回答没有包括这一点吗?啊,是的,你有@Kirk。我错过了你的最新编辑。非常感谢你。请用一个链接将此作为您的答案,我会将其标记为正确答案。等等,没关系。看到你的新答案了。@griegs没问题,很明显这个解决方案非常松散、无忧无虑,没有数据验证,所有内容都是松散键入的,因此使用风险自负!嗯,是的,我不会用这个词。我一直在寻找这种方法,这个解决方案非常适合我的需求。