Суммирование дублирующихся строк в DataTable в vb.net - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть 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

Я смог поместить это в DataTable, используя vb.net.Теперь я хочу сгруппировать дубликаты вместе, используя столбец № 1 + 2 и суммирующий столбец № 3, чтобы я мог создать новый CSV-файл, который выглядит следующим образом:

19177;string1;
10017;string2;7005,00
10238;string3;62305,00

Я много искал и обнаружил, что яВозможно, можно использовать что-то под названием LINQ, но есть ли способ сделать это на чистом vb.net?Кажется, я не могу понять концепцию, как это сделать.

РЕДАКТИРОВАТЬ:

Я надеялся избежать LINQ, поэтому использование для каждого оператора кажется, что я должен быть в состоянииуправлять.Будет ли что-то подобное хорошим началом или я здесь совсем не в ногу?

For Each r As DataRow In mytable.Rows
    For Each item In r.ItemArray
        Do something
    Next
Next

Я чувствую, что попал не в тот «слой», и мне трудно осмыслить это в своей голове.достаточно, чтобы получить это в коде.Мне нужно сравнить целые строки, а не только отдельные элементы, как это делается.

1 Ответ

0 голосов
/ 17 сентября 2018

Самое простое решение - использовать linq. Если вы хотите избежать использования linq, вы можете, но вам нужно написать гораздо больше строк кода. В любом случае, вот пример, который показывает, как использовать linq для группировки строк на основе первых двух столбцов, а затем для вычисления суммы 3-го столбца.

Допустим, таблица входных данных содержит столбцы C1 (Inetegr), C2 (String), C3 (Integer), которые вы загружаете из CSV-файла:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...