Linq到CSV按列值选择
我知道今天早些时候我以不同的方式提出了这个问题,但我已经将我的需求做了一些改进 给定以下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
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没问题,很明显这个解决方案非常松散、无忧无虑,没有数据验证,所有内容都是松散键入的,因此使用风险自负!嗯,是的,我不会用这个词。我一直在寻找这种方法,这个解决方案非常适合我的需求。