Что нового

Сумма значений элементов массива.

Malderin

Новичок
Сообщения
68
Репутация
1
Пытался найти ответ на форуме, есть некоторые близкие моей проблеме решения, но немного не то.
Задачка такая, есть файл по типу ini файла, где значения расписаны через равно в одной из секций.
Например такой файл log.log:
[History]
01.09.2014 15:38:49= Старт (1)
01.09.2014 15:38:58 Количество по факту (всего)=0
01.09.2014 15:38:49= Старт (2)
01.09.2014 15:38:58 Количество по факту (всего)=2
01.09.2014 15:38:49= Старт (22)
01.09.2014 15:38:58 Количество по факту (всего)=20
01.09.2014 15:38:49= Старт (22)
01.09.2014 15:38:58 Количество по факту (всего)=22
01.09.2014 15:38:49= Старт (18)
01.09.2014 15:38:58 Количество по факту (всего)=15

Собственно создаем массив например так:

Код:
#include <Array.au3>

$Path = @ScriptDir&"\log.log" ;Путь к файлу ini
dim $stat = IniReadSection($Path,"History")
_ArrayDisplay($stat)


Массив создается, но вот как отфильтровать и просуммировать нужные значения (не подсчитать количество а именно просуммировать значения второго столбца) ума не приложу.
Т.е. итоговый результат должна быть переменная $summ=59 (т.е. 0+2+20+22+15 = 59)
Прошу помощи, перерыл кучу инфы но подходящего варианта для понимания решения задачи так и не нашёл.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
о, ну это очень просто, нужно пройти в цикле по всему массиву, и если в первом столбце то что вам нужно, то к сумме прибавить содержимое второго столбца. Вот и всё решение. 8)
А как конкретно это сделать, думайте. Или подождите пока новички скриптеры не выложат готовое решение. :whistle:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Код:
$sRead = FileRead('log.log')
$sData = StringTrimLeft(StringRegExpReplace($sRead, '(?is).*?Количество по факту \(всего\)=(\d+)(\r?\n.*?|$)', '+\1'), 1)
$iSummary = Execute($sData)

MsgBox(64, 'Title', $sData & '=' & $iSummary)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
Как вариант (сумма в ячейке $aHistory[0][1]).
Код:
#include <Array.au3>

$aHistory = IniReadSection(@ScriptDir & '\log.log', 'History')
If @error Then Exit 13
For $i = 1 To $aHistory[0][0]
	If (StringInStr($aHistory[$i][0], 'Количество по факту')) And (StringIsDigit($aHistory[$i][1])) Then
		$aHistory[0][1] += $aHistory[$i][1]
	EndIf
Next
_ArrayDisplay($aHistory)

OffTopic:
inververs [?]
пока новички скриптеры не выложат готовое решение
Выкладываем. :smile:



Добавлено:
Сообщение автоматически объединено:

Malderin,
А в Вашем случае и такой код вернет правильный результат:
Код:
#include <Array.au3>

$aHistory = IniReadSection(@ScriptDir & '\log.log', 'History')
If @error Then Exit 13
For $i = 1 To $aHistory[0][0]
	$aHistory[0][1] += $aHistory[$i][1]
Next
_ArrayDisplay($aHistory)
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Вау парни, вам обоим по плюсику.
 
Автор
M

Malderin

Новичок
Сообщения
68
Репутация
1
Обидно что я был в шаге от этого решения, единственное что не понимал во встречающихся скриптах, так это смысл выражения:
Код:
$aHistory[0][1] += $aHistory[$i][1]

Теперь до меня наконец то дошло :smile:
Все предложенные варианты отлично подходят, inververs, madmasles, CreatoR - спасибо за помощь !
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Вот еще вариант для AutoIt 3.3.12.0:
Код:
$sum = 0
For $IN In FileReadToArray('test.txt')
	If StringRegExp(StringRegExpReplace($IN, '(?is)(.*?=)(\d+)(\r?\n.*?|$)', '$2'), '^\d+?$') Then $sum += StringRegExpReplace($IN, '(?is)(.*?=)(\d+)(\r?\n.*?|$)', '$2')
Next
ConsoleWrite($sum&@LF)
 
Автор
M

Malderin

Новичок
Сообщения
68
Репутация
1
Версия не та у меня, ставить когда то пробовал - не подошло, посылает в поля вместо кириллицы знаки вопросов, откатился на одну из предыдущих версий.
 
Верх