【发布时间】:2021-07-04 11:41:09
【问题描述】:
我有一个我认为很容易解决的问题,但经过几天的尝试失败后,我正在寻求帮助。
我在 Excel 中有一个如下所示的表格:
| Transaction Date | Bank Account | Balance |
|---|---|---|
| 44287 | Account 1 | 500 |
| 44287 | Account 1 | -700 |
| 44287 | Account 2 | -200 |
| 44286 | Account 1 | 300 |
| 44286 | Account 3 | -150 |
该表代表多个银行账户,我想获取所有账户每个日期的累积余额。例如,我期望的输出是:
| Transaction Date | Balance |
|---|---|
| 44287 | -900 |
| 44286 | 150 |
如果同一账户在给定日期有多个交易,例如在“44287”上,账户 1 的余额有两个值,所以我会采用最大绝对值 -700(并忽略 500)。为简单起见,我使用 Excel 中的默认日期数字表示法。
我已经用尽了 Excel 中的所有选项,所以我用 C# 创建了自己的简单控制台应用程序。
这是我目前所拥有的。
我正在将 Excel 中的输入读入var data = new List<List<string>>();。第一个外部列表存储列,第二个内部列表存储行。因此,例如 data[2][3] 将等于 -200。
private static void Calculate(string filePath, string sheetName)
{
var data = new List<List<string>>();
using (ExcelReader excel = new ExcelReader(filePath))
{
excel.SetWorksheet(sheetName);
data = excel.ReadUsedRangeToList();
}
var date = data[0];
var account = data[1];
var balance = data[2];
// group transactions by date
var groupedByDate = new List<List<List<string>>>();
for (int r = 1; r < date.Count - 2; r++)
{
var lines = new List<List<string>>();
for (int ri = r; ri < date.Count; ri++)
{
if (date[r] == date[ri])
{
var temp = new List<string>();
temp.Add(date[ri]);
temp.Add(account[ri]);
temp.Add(balance[ri]);
lines.Add(temp);
// need to set r to the latest ri to finish at the last line
r = ri;
}
else
{
r = ri - 1;
break;
}
}
groupedByDate.Add(lines);
}
}
我首先将我的原始列表分组到一个新列表中,该列表也按日期对数据进行分组。然而,这为列表添加了另一个深度级别。然后我尝试按银行帐户对其进行分组,但这会在列表中添加另一个级别,并且所有这些循环的逻辑变得令人兴奋。
我开始认为我采取了错误的方法来解决这个问题。我做了很多谷歌搜索,似乎使用 LINQ 而不是使用循环可能会更好?我以前使用过 LINQ,但只用于非常琐碎的事情。
如果有人能指出我正确的方向,那就太好了。我对所有想法持开放态度。如果有人知道您是否可以在我可能错过的 Excel 中轻松完成此操作,请告诉我!
【问题讨论】:
标签: c# excel list merge duplicates