У меня есть этот CSV-файл, с которым я довольно много работаю.Моя последняя задача - добавить сводный лист.
С учетом сказанного у меня есть файл CSV, который я извлекаю с веб-сайта и отправляю через множество проверок.Код ниже:
$Dups = import-csv 'C:\Working\cylrpt.csv' | Group-Object -Property 'Device Name'| Where-Object {$_.count -ge 2} | ForEach-Object {$_.Group} | Select @{Name="Device Name"; Expression={$_."Device Name"}},@{Name="MAC"; Expression={$_."Mac Addresses"}},Zones,@{Name="Agent"; Expression={$_."Agent Version"}},@{Name="Status"; Expression={$_."Is online"}}
$Dups | Export-CSV $working\temp\01-Duplicates.csv -NoTypeInformation
$csvtmp = Import-CSV $working\cylrpt.csv | Select @{N='Device';E={$_."Device Name"}},@{N='OS';E={$_."OS Version"}},Zones,@{N='Agent';E={$_."Agent Version"}},@{N='Active';E={$_."Is Online"}},@{N='Checkin';E={[DateTime]$_."Online Date"}},@{N='Checked';E={[DateTime]$_."Offline Date"}},Policy
$csvtmp | %{
if ($_.Zones -eq ""){$_.Zones = "Unzoned"}
}
$csvtmp | Export-Csv $working\cy.csv -NoTypeInformation
import-csv $working\cy.csv | Select Device,policy,OS,Zones,Agent,Active,Checkin,Checked | % {
$_ | Export-CSV -path $working\temp\$($_.Zones).csv -notypeinformation -Append
}
- Первая проверка для дубликатов, я использовал отдельные строки кода для этого, потому что я хотел создать CSV для дубликатов.
- Вторая проверка засыпоквсе пустые ячейки под столбцом Zones с «UnZoned»
- Третье, что нужно сделать, - это пройти через весь файл CSV и создать файл CSV для каждой зоны
Так что это мойбаза.Мне нужно добавить еще один CSV-файл для краткого изложения информации о зоне.Зоны имеют формат XXX-WS или XXX-SRV, где XXX может содержать от 3 до 17 букв.
Мне бы хотелось, чтобы сводный лист выглядел следующим образом
ABC ###
ABC-WS ##
ABC-SRV ##
DEF ###
DEF-WS ##
DEF-SRV ##
Мои мысли состоят в том, чтобы либо подсчитать исходный CSV-файл, либо подсчитать количество строк в каждом CSV-файле и вычесть 1 для строки заголовка.
Теперь зоны являются динамическими, поэтому я не могу простоскажем, я хочу ZONE XYZ, потому что эта зона может не существовать.
Итак, мне нужно иметь возможность подсчитать аналогичный тип зоны в исходном файле и вывести его в массив или файл, что быбыть моим предпочтительным методом, чтобы дать количество элементов с одинаковым именем зоны.Я просто не знаю, как написать это для поиска и подсчета соответствующих переменных.Вот код, который я пытаюсь использовать для подсчета:
import-csv C:\Working\cylrpt.csv | Group-Object -Property 'Zones'| ForEach-Object {$_.Group} | Select @{N='Device';E={$_."Device Name"}},Zones | % {
$Znum = ($_.Zones).Count
If ($Znum -eq $null) {
$Znum = 1
} else {
$Znum++
}
}
$Count = ($_.Zones),$Znum | Out-file C:\Working\Temp\test2.csv -Append
Вот полный код минус ключ отчета:
$cylURL = "https://protect.cylance.com/Reports/ThreatDataReportV1/devices/"
$working = "C:\Working"
Remove-item -literalpath "\\?\C:\Working\Cylance Report.xlsx"
Invoke-WebRequest -Uri $cylURL -outfile $working\cylrpt.csv
$Dups = import-csv 'C:\Working\cylrpt.csv' | Group-Object -Property 'Device Name'| Where-Object {$_.count -ge 2} | ForEach-Object {$_.Group} | Select @{Name="Device Name"; Expression={$_."Device Name"}},@{Name="MAC"; Expression={$_."Mac Addresses"}},Zones,@{Name="Agent"; Expression={$_."Agent Version"}},@{Name="Status"; Expression={$_."Is online"}}
$Dups | Export-CSV $working\temp\01-Duplicates.csv -NoTypeInformation
$csvtmp = Import-CSV $working\cylrpt.csv | Select @{N='Device';E={$_."Device Name"}},@{N='OS';E={$_."OS Version"}},Zones,@{N='Agent';E={$_."Agent Version"}},@{N='Active';E={$_."Is Online"}},@{N='Checkin';E={[DateTime]$_."Online Date"}},@{N='Checked';E={[DateTime]$_."Offline Date"}},Policy
$csvtmp | %{
if ($_.Zones -eq ""){$_.Zones = "Unzoned"}
}
$csvtmp | Export-Csv $working\cy.csv -NoTypeInformation
import-csv $working\cy.csv | Select Device,policy,OS,Zones,Agent,Active,Checkin,Checked | % {
$_ | Export-CSV -path $working\temp\$($_.Zones).csv -notypeinformation -Append
}
cd $working\temp;
Rename-Item "Unzoned.csv" -NewName "02-Unzoned.csv"
Rename-Item "Systems-Removal.csv" -NewName "03-Systems-Removal.csv"
$CSVFiles = Get-ChildItem -path $working\temp -filter *.csv
$Excel = "$working\Cylance Report.xlsx"
$Num = $CSVFiles.Count
Write-Host "Found the following Files: ($Num)"
ForEach ($csv in $CSVFiles) {
Write-host "Merging $CSVFiles.Name"
}
$EXc1 = New-Object -ComObject Excel.Application
$Exc1.SheetsInNewWorkBook = $CSVFiles.Count
$XLS = $EXc1.Workbooks.Add()
$Sht = 1
ForEach ($csv in $CSVFiles) {
$Row = 1
$Column = 1
$WorkSHT = $XLS.WorkSheets.Item($Sht)
$WorkSHT.Name = $csv.Name -Replace ".csv",""
$File = (Get-Content $csv)
ForEach ($line in $File) {
$LineContents = $line -split ',(?!\s*\w+")'
ForEach ($Cell in $LineContents) {
$WorkSHT.Cells.Item($Row,$Column) = $Cell -Replace '"',''
$Column++
}
$Column = 1
$Row++
}
$Sht++
}
$Output = $Excel
$XLS.SaveAs($Output)
$EXc1.Quit()
Remove-Item *.csv
cd ..\