我有一个看起来像这样的CSV文件:
19177;string1;
10017;string2;6765,00
10017;string2;240,00
10238;string3;350,00
10238;string3;750,00
10238;string3;60170,00
10238;string3;1035,00
我已经能够使用vb.net将其放入DataTable中。现在,我想使用列号1 + 2并将列号3求和,将重复项分组在一起,以便生成一个新的CSV文件,如下所示:
19177;string1;
10017;string2;7005,00
10238;string3;62305,00
我进行了很多搜索,发现我可能可以使用称为LINQ的东西,但是有什么方法可以在纯vb.net中做到这一点?我似乎无法掌握如何执行此操作的概念。
编辑:
我希望避免使用LINQ,因此为每个语句使用a似乎应该可以管理。这样的事情会是一个好的开始吗?还是我在这里完全错了?
For Each r As DataRow In mytable.Rows
For Each item In r.ItemArray
Do something
Next
Next
我觉得自己在这里是错误的“层”,因此我很难在脑海中将其概念化以在代码中体现出来。我需要比较整行,而不仅仅是像这样的单个项目。
答案 0 :(得分:0)
最简单的解决方案是使用linq。如果您想避免使用linq,可以,但是您需要编写更多的代码行。无论如何,这是一个示例,显示了如何使用linq根据前两列对行进行分组,然后计算第三列的总和。
比方说,输入数据表包含从CSV文件加载的C1(Inetegr),C2(String),C3(Integer)列:
C1 | C2 | C3
-------------------
1 |One | 100
1 |One | 200
2 |Two | 300
2 |Two | 400
3 |Three | 500
仅出于测试目的,这是数据表:
Dim dt = New DataTable()
dt.Columns.Add("C1", GetType(Integer))
dt.Columns.Add("C2", GetType(String))
dt.Columns.Add("C3", GetType(Integer))
dt.Rows.Add(1, "One", 100)
dt.Rows.Add(1, "One", 200)
dt.Rows.Add(2, "Two", 300)
dt.Rows.Add(2, "Two", 400)
dt.Rows.Add(3, "Three", 500)
要获得预期的结果,可以使用以下代码:
Dim q = From r In dt.AsEnumerable()
Select C1 = r.Field(Of Integer)("C1"),
C2 = r.Field(Of String)("C2"),
C3 = r.Field(Of Integer)("C3")
Group By C1, C2 Into Group
Select C1, C2, C3 = Group.Sum(Function(x) x.C3)
Dim result = dt.Clone()
For Each item In q
result.Rows.Add(item.C1, item.C2, item.C3)
Next
结果将是:
C1 | C2 | C3
-------------------
1 |One | 300
2 |Two | 700
3 |Three | 500