This one should appeal to both the statistically inclined of you, as well as those interested in cryptography. Measure-Frequency will take any array (or string) and give you the frequency distribution of it’s contents.
function Measure-Frequency { | |
<# | |
.SYNOPSIS | |
Get the frequency distribution of a set. | |
.DESCRIPTION | |
This function will get the frequency distribution of a set (array) of data. | |
It supports array types, as well as strings. | |
.EXAMPLE | |
Measure-Frequency $array | |
.EXAMPLE | |
Measure-Frequency $string -CaseSensitive | |
.NOTES | |
Author: Øyvind Kallstad | |
Date: 10.02.2016 | |
Version: 1.0 | |
#> | |
[CmdletBinding()] | |
param ( | |
[Parameter(Mandatory = $true, Position = 0)] | |
$InputObject, | |
[Parameter()] | |
[switch] $CaseSensitive | |
) | |
try { | |
if ($InputObject.GetType().Name -eq 'String') { | |
if ($CaseSensitive) { | |
$inputArray = $InputObject.ToCharArray() | |
} | |
else { | |
$inputArray = $InputObject.ToLower().ToCharArray() | |
} | |
} | |
else { | |
$inputArray = $InputObject | |
} | |
$inputArray | Group-Object | Sort-Object –Descending –Property Count | ForEach-Object { | |
$frequency = $_.Count / $inputArray.Length | |
$percent = '{0:P0}' -f $frequency | |
Write-Output ([PSCustomObject] [Ordered] @{ | |
Value = $_.Name | |
Count = $_.Count | |
Percent = $percent | |
Frequency = $frequency | |
}) | |
} | |
} | |
catch { | |
Write-Warning $_.Exception.Message | |
} | |
} |