#include <Array.au3>
#include <File.au3>
#include <Excel.au3>
$sPath = @ScriptDir ; Путь к папке с файлами Excel
$sTotalName = "Итог.xlsx" ; Название итогового файла Excel
Local $iN = 0, $iP = 0 ; Переменные для подсчета общего времени недоступности / перегрузки
Dim $aFirstReport[2][8] = [['SLA' & @CRLF & '(30*24*60)', 'Точка', 'Время недоступности (мин)', _
'Время перегрузки', '% недоступность ', '% перегрузка', '% суммарная недоступность', '% суммарная доступность'], [43200]]
Dim $aSecondReport[2][6] = [['№', 'Начало', 'Конец', 'Продолжительность (мин)', 'Узел', 'Тип']] ; Массивы для отчетов
$iCount = 1 ; Переменная для конечного массива
$iTotalTime = 0 ; Общее время
$aList = _FileListToArray($sPath, '*.csv', 1) ; Берем список xlsx файлов в папке
For $i = UBound($aList) -1 To 0 Step -1 ; Оставляем только те файлы, в конце названия которых есть P или N
If Not StringRegExp($aList[$i], '[P|N]\.csv') Then
_ArrayDelete($aList, $i)
EndIf
Next
$oExcel = _Excel_Open() ; Открываем Excel
For $iFile = 0 To UBound($aList) -1 ; Для каждого файла...
$oBook = _Excel_BookOpen($oExcel, $sPath & "\" & $aList[$iFile])
$aRange = _Excel_RangeRead($oBook) ; Читаем в массив содержимое файла Excel
$iTime = 0
$sType = StringRegExp($aList[$iFile], '(.)\.', 3)[0] ; Определяем тип файла ('P'/'N')
For $iRow = 1 To UBound($aRange) -1 Step 2 ; Проходим по каждой строчке массива, первую строчку пропускаем
ReDim $aSecondReport[$iCount + 1][6] ; Добавляем строку во второй отчет
If $aRange[$iRow] = "" Then ContinueLoop ; Пропускаем пустые строки
$aCurrent = StringSplit($aRange[$iRow], ',', 3) ; Разбиваем текущую строку по разделителю в массив
$aNext = StringSplit($aRange[$iRow+1], ',', 3) ; И следующую
$iTime += _ToSecond($aNext[4])
$aSecondReport[$iCount][0] = $iCount ; Записываем номер
$aSecondReport[$iCount][1] = $aNext[0] ; Записываем в первую колонку дату в следующей строчке
$aSecondReport[$iCount][2] = $aCurrent[0] ; Во вторую колонку - дату в текущей строчке
$aSecondReport[$iCount][3] = _SecondToMinutes(_ToSecond($aNext[4])) ; В четвертую колонку записываем время в минутах
$aSecondReport[$iCount][4] = StringLeft($aList[$iFile], StringInStr($aList[$iFile], '-', 0, -1) -1) ; Название узла
If $sType = 'N' Then ; Записываем Тип
$aSecondReport[$iCount][5] = 'Недоступность'
Else
$aSecondReport[$iCount][5] = 'Перегрузка'
EndIf
$iCount += 1
Next
$aFirstReport[$iFile + 1][1] = StringLeft($aList[$iFile], StringInStr($aList[$iFile], '-', 0, -1) -1) ; Записываем название файла в первый отчет
If $sType = 'N' Then ; А также время перегрузки/недоступности
$aFirstReport[$iFile + 1][2] = _SecondToMinutes($iTime)
$aFirstReport[$iFile + 1][3] = "0"
Else
$aFirstReport[$iFile + 1][2] = "0"
$aFirstReport[$iFile + 1][3] = _SecondToMinutes($iTime)
EndIf
$iN += StringReplace($aFirstReport[$iFile + 1][2], ',', '.') ; Подсчитываем суммарную недоступность
$iP += StringReplace($aFirstReport[$iFile + 1][2], ',', '.') ; И перегрузку
ReDim $aFirstReport[UBound($aFirstReport) + 1][8]
_Excel_BookClose($oBook) ; Закрываем книгу
Next
For $i = 1 To UBound($aFirstReport) -1
$aFirstReport[$i][6] = Round(StringReplace($aFirstReport[$i][2], ',', '.') / $iN * 100, 2) & '%' ; Записываем % от общего времени перегрузки и недоступности
$aFirstReport[$i][7] = Round(StringReplace($aFirstReport[$i][3], ',', '.') / $iP * 100, 2) & '%'
Next
;_ArrayDisplay($aFirstReport)
$oBook = _Excel_BookOpen($oExcel, $sPath & "\" & $sTotalName)
If @error Then $oBook = _Excel_BookNew($oExcel)
$oExcel.Columns('A:L').EntireColumn.Delete ; Удаляем все из файла Excel
_Excel_RangeWrite($oBook, Default, $aFirstReport, "D6")
_Excel_RangeWrite($oBook, Default, $aSecondReport, "D" & (6 + UBound($aSecondReport)))
$oExcel.Columns('A:L').EntireColumn.AutoFit ; Расширяем колонки по длине текста
_Excel_BookSaveAs($oBook, $sPath & "\" & $sTotalName)
Func _SecondToMinutes($iSecond) ; Переводит секунды в минуты в формате MM,SS
If $iSecond >= 60 Then
$iTmp = Floor($iSecond / 60) & ','
$iSecond = $iSecond - $iTmp * 60
Else
$iTmp = 0 & ','
EndIf
If $iSecond > 10 Then
Return $iTmp & $iSecond
Else
Return $iTmp & '0' & $iSecond
EndIf
EndFunc
Func _ToSecond($sTime) ; Переводит строку с временем в секунды. Например, из строки 3m 49s вернет 229
$sTime = StringReplace($sTime, '"', '')
$aTime = StringSplit($sTime, ' ', 2)
$iValue = 0
For $iTime = 0 To UBound($aTime) -1
$sTmp = StringRight($aTime[$iTime], 1)
$aTime[$iTime] = StringTrimRight($aTime[$iTime], 1)
Switch $sTmp
Case 'd'
$iValue = $iValue + $aTime[$iTime] * 86400
Case 'h'
$iValue = $iValue + $aTime[$iTime] * 3600
Case 'm'
$iValue = $iValue + $aTime[$iTime] * 60
Case 's'
$iValue = $iValue + $aTime[$iTime]
EndSwitch
Next
Return $iValue
EndFunc