Может пригодится кому
исходный вид:
Код:
B:27767 (06.105) 569191 533903 (00.063) 06/01/10 23:38 00:29:04
B:27781 (05.050) 531741 567212 (00.109) 07/01/10 00:07 00:01:25
B:27759 (06.101) 569026 523111 (00.061) 06/01/10 23:27 00:42:03
B:14021 (06.065) 599633 596421 (01.088) 06/01/10 23:54 00:14:47
B:45599 (01.124) 567662 572897 (02.060) 06/01/10 23:58 00:10:29
B:27782 (01.038) 531741 567212 (00.101) 07/01/10 00:09 00:00:21
B:14035 (04.052) 531651 567450 (01.111) 07/01/10 00:09 00:00:38
B:54155 (02.107) 555834 569502 (03.012) 07/01/10 00:09 00:00:06
B:54157 (02.114) 555534 569502 (03.018) 07/01/10 00:09 00:00:06
B:14034 (02.062) 536035 568748 (01.119) 07/01/10 00:08 00:02:39
B:54153 (05.116) 566039 569351 (03.015) 07/01/10 00:06 00:03:56
B:54158 (06.066) 599535 569502 (03.029) 07/01/10 00:10 00:00:11
B:13957 (00.004) 550434 597800 (01.079) 06/01/10 23:13 00:57:43
B: 2361 (06.065) 598561 78772200 (06.107) 07/01/10 00:10 00:01:15
B:14037 (00.023) 550434 597800 (01.093) 07/01/10 00:11 00:00:24
B:54159 (06.118) 015266 569502 (03.007) 07/01/10 00:12 00:00:05
B:14038 (00.018) 550434 597800 (01.094) 07/01/10 00:12 00:00:25
B:27783 (06.053) 523730 566129 (00.118) 07/01/10 00:11 00:01:38
с помощью регулярки взять его не получилось (бывают пустые абонеты А)
но зато они не скачут посимвольно.
Код:
#####################################################################
# Конвертер логов АТС миником УАК в формат логов bgbilling (5.0).
# Язык: PowerShell
# Требования: консольная утилита архивирования 7Zip
# Автор: Валяев Алексей, admintsm@gmail.com
#
# баг: если продолжительность звонка более 23:59 часов вываливается ошибка.
# если ваши абоненты любят потрещать, по другому вычисляйте продолжительность
# звонка в секундах
#####################################################################
#
#Указываем путь к утилите 7zip
$7zip = ".\7za.exe"
#указываем пуи к лог-файлам
$Log_from_uac = "D:\1111"
#
#инициируем массив для хранения путей ко всем лог-файлам
$AllLogFile = @()
#
#берем список всех лог-файлов, передаем по конвееру и
#последовательно обрабатываем содержимое каждого из них
dir $Log_from_uac | %{ Get-Content $Log_from_uac\$_ |%{
#
#Проводим отбор определенных звонков по портам
#(требовалось для выполнения моей задачи)
$InComing =[int]$_.substring(12,3)
$Outgoing =[int]$_.substring(60,3)
#
#
#Условие, выбирающие из строчек логов только те,
#Которые были нужны мне для обработки.
If (($(32..63) -contains $InComing) -or ($(32..63) -contains $Outgoing)){
#
#разбираем строчку лога
#$portA = $_.substring(9,6) - помещаем в
#переменную $portA содержимое текущей обрабатываемой
#строчки лога ($_) начиная с 9 символа и последующие 6 символов
# поскольку порт в логе выглядит как 44.333, я избавился от точки:
$portA = $_.substring(9,2)+$_.substring(12,3)
$portB = $_.substring(57,2)+$_.substring(60,3)
#выбираем из строки номера
$NumberA = $_.substring(17,6)
$NumberB = $_.substring(35,8)
#выбираем дату, время, продолжительность звонка.
#и сразу конвертируем в тип [datetime] для последующей обработки
$datetime = [datetime]::parse($_.substring(65,14))
$Call = [datetime]::parse($_.substring(80,8))
#Вычисляем продолжительность звонка в секундах
$Call_duration = $Call.Hour*360+$Call.Minute*60+$Call.Second
#Создаем дерево каталогов и файлы
$YY = $datetime.ToString("yyyy")
$MM = $datetime.ToString("MM")
$dd = $datetime.ToString("dd")
$HH = $datetime.ToString("HH")
$PathToLog = "D:\PoSh\billing\$YY\$MM"
$LogName = "$dd"+"_$HH"
If (!(Test-Path $PathToLog )){New-Item -ItemType Directory $PathToLog -Force}
If (!(Test-Path $PathToLog\$LogName)){New-Item -ItemType File $PathToLog\$LogName}
#
#Добавляем в массив путь к очередному новому логу, если его там еще нету
If (!($AllLogFile -contains "$pathTolog\$logname")){$AllLogFile+="$pathTolog\$logname"}
#
#формируем новую строчку лога, понятную для bgbilling.
#я добавлял коды города, так как у нас в АТС ходят 6ти значные номера
#"`t" - символ табуляции
$bg_billing = $datetime.ToString("dd.MM.yy HH:mm:ss")+"`t"+"$Call_duration"+"`t"+"$NumberA"+"`t"+"73499"+"$NumberA"+"`t"+"$NumberB"+"`t"+"73499"+"$NumberB"+"`t"+"$portA"+"`t"+"$portB"+"`t"+"0"
$bg_billing|Out-File "$pathTolog\$logname" -Append -Encoding ASCII
}
}
}
#Архивируем и удаляем логи. остаются одни архивы.
$AllLogFile | %{
$newname = ($_ -replace ".txt")+".zip"
&$7zip a $newname $_
}
$AllLogFile | Remove-Item -Force