Что нового

Сложное суммирование

AlexVong

Новичок
Сообщения
112
Репутация
1
Версия AutoIt: 3.3.8.1
Описание:Есть веб таблица, к-во строк примерно 10-30тыс. Нужно просумировать по двум критериям - валюта и цвет и просумировать по четырем критериям счет, валюта, признак, цвет, без использования стороних программ, выводя в msg или gui. Черный и синий цвет считается как один, красный суммируется отдельно. Из примера должно получиться -
Итого 110080.48
RUB 106412.13
USD 3668.35

Рах валюта сумма дк
9900601301001 RUB 32908.63 1
9900702201001 RUB 103416.7 1
9900800901001 RUB 3847.29 1
37000000223885 RUB 15530 1
37000000223885 RUB 1244 0
37000002100885 RUB 36593 1
37007201700885 RUB 3000 1
97603000100566 USD 3668.35 1

Итого красн. 2486
EUR 2486

Примечание: Если возможно еще необходимо подсчитывать количество строк из которых состоит сумма.
 

cnm

Новичок
Сообщения
58
Репутация
2
я бы порекомендовал скопировать таблицу в буфер, потом из буфера в ексел, в екселе добавить несколько строк на суммирование с условным форматированием (вроде так можно) и получить результат в екселе.

второй вариант алгоритма - сканировать каждую ячейку на цвет и значение и помещать результат в массив. И потом обработать массив
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
AlexVong

Я не очень понял, как именно нужно суммировать, но тут главное принцип:
из текста получаем массив, который последовательно содержит все ячейки таблицы и цвета строк.
Далее в цикле проверяем, если ячейка с номером $i содержит имя валюты и ячейка $i+1 содержит '.', то обращаемся к ячейке с номером $i-6, которая содержит цвет, а на основании этого цвета уже определяем, куда суммировать значение ячейки $i-1, т.е. сумму.

Возможно, тут можно и как-то соптимизировать.

Код:
#include <Array.au3>

$sText = FileRead('table0.htm'); BinaryToString(InetRead(''))

$aTemp = StringRegExp($sText, '<TD.*>(.*?)</TD|: #(.*?)"', 3)
_ArrayDisplay($aTemp)

Dim $i_RUB[3] = [0, 0, 0]
Dim $i_USD[3] = [0, 0, 0]
Dim $i_EUR[3] = [0, 0, 0]

For $i = 7 To UBound($aTemp) - 1
	Switch $aTemp[$i]

		Case 'EUR'
			If StringInStr($aTemp[$i + 1], '.') Then
				$i_EUR[0] += StringReplace($aTemp[$i - 1], ' ', '') ; всего

				If $aTemp[$i - 6] <> 'FF0000' Then
					$i_EUR[1] += StringReplace($aTemp[$i - 1], ' ', '') ; черный-синий
				Else
					$i_EUR[2] += StringReplace($aTemp[$i - 1], ' ', '') ; красный
				EndIf

			EndIf
		Case 'RUB'
			If StringInStr($aTemp[$i + 1], '.') Then
				$i_RUB[0] += StringReplace($aTemp[$i - 1], ' ', '') ; всего

				If $aTemp[$i - 6] <> 'FF0000' Then
					$i_RUB[1] += StringReplace($aTemp[$i - 1], ' ', '') ; черный-синий
				Else
					$i_RUB[2] += StringReplace($aTemp[$i - 1], ' ', '') ; красный
				EndIf

			EndIf

		Case 'USD'
			If StringInStr($aTemp[$i + 1], '.') Then
				$i_USD[0] += StringReplace($aTemp[$i - 1], ' ', '') ; всего

				If $aTemp[$i - 6] <> 'FF0000' Then
					$i_USD[1] += StringReplace($aTemp[$i - 1], ' ', '') ; черный-синий
				Else
					$i_USD[2] += StringReplace($aTemp[$i - 1], ' ', '') ; красный
				EndIf

			EndIf
	EndSwitch
Next

ConsoleWrite('EUR: ' & @CRLF & 'всего: ' & $i_EUR[0] & @CRLF & 'черный-синий: ' & $i_EUR[1] & @CRLF & 'красный: ' & $i_EUR[2] & @CRLF)
ConsoleWrite('----------------------------------------------------' & @CRLF)
ConsoleWrite('RUB: ' & @CRLF & 'всего: ' & $i_RUB[0] & @CRLF & 'черный-синий: ' & $i_RUB[1] & @CRLF & 'красный: ' & $i_RUB[2] & @CRLF)
ConsoleWrite('----------------------------------------------------' & @CRLF)
ConsoleWrite('USD: ' & @CRLF & 'всего: ' & $i_USD[0] & @CRLF & 'черный-синий: ' & $i_USD[1] & @CRLF & 'красный: ' & $i_USD[2] & @CRLF)
 
Автор
A

AlexVong

Новичок
Сообщения
112
Репутация
1
WSWR
Код считает отлично! Можно к нему еще применить подсчет количества строк из которых состоит сумма?......, чтобы например
Код:
RUB
всего количество/сумма
черный+синий количество/сумма
красный количество/сумма
и т.д.
:'(
 
Верх