Mi solución de recuento de palabras de PowerShell
Hace unos días publiqué un acertijo rápido de PowerShell como parte de un anuncio de apariencia.
Usando el archivo de ayuda about_Splatting , ¿qué palabra se usa con más frecuencia? Si puedes mostrar el top 5 aún mejor. Idealmente, su código tratará palabras como "para" y "para" como iguales. Para obtener puntos adicionales, cree un objeto personalizado simple que muestre el nombre del tema de ayuda, el número total de palabras, "," no es una palabra, la palabra principal y el recuento de palabras principales. Además, trate de omitir "el", que casi siempre es una palabra común.
Algunas personas publicaron enlaces a sus soluciones. Y si quieres probar suerte con el problema, deja de leer y vuelve más tarde para comparar tu trabajo con el mío.
Mi solución
En primer lugar, seré el primero en decirles que mi respuesta no es la única solución ni siquiera la mejor. Pero hace el trabajo por lo que es "suficientemente bueno".
Mi solución está escrita como un script de PowerShell para poder probarla fácilmente con otros temas de ayuda. El script no es más que dos expresiones de PowerShell.
Param([string]$topic = "About_splatting")
#I'm filtering out words 'the', 'a' and 'an' before
#selecting the most-used word.
$results = ($(Get-Help $topic).split()) -replace "\W|_","" |
Where-Object {$_} -OutVariable all | Group-Object |
Where-Object {$_.name -notmatch "\b(the|a|an)\b"} |
Sort-Object -property count -Descending |
Select-Object -first 5
#create a custom object
[PSCustomObject]@{
Topic = $topic
TotalWords = $all.Count
TopWord = $results[0].Name
TopWordCount = $results[0].count
PSVersion = $PSVersionTable.PSVersion
}
Así es como funciona. Get-Help escribe un objeto de cadena en la canalización. Estoy dividiendo la cadena usando el espacio en blanco predeterminado y luego reemplazando cada carácter que no es una palabra (\W) o el guión bajo por nada. Esto tiene el efecto de analizar "acerca de_" y tratarlo como "acerca de". Estos resultados se envían a Where-Object, que filtra las líneas en blanco. Podría haber incluido este tipo de análisis de expresiones regulares en la primera parte del comando. Esto deja una lista de palabras. Observe que estoy usando -OutVariable para guardar el resultado de este comando en particular en una variable, $all. Usaré esto más tarde.
Luego, las palabras se agrupan y se filtran nuevamente para ignorar las palabras comunes, "el", "a" y "una". Los resultados del grupo filtrado se ordenan en la propiedad de recuento en orden descendente y selecciono los primeros 5. Aunque probablemente solo necesitaba el primero.
La última parte del script crea un archivo personalizado a partir del primer elemento en $resultados. Podría haber creado un objeto personalizado para cada elemento en $resultados. De todos modos, esto es con lo que termino.
Gran parte de su trabajo en PowerShell implica trabajar con objetos en proceso. Si puede visualizar el proceso, o al menos describirlo verbalmente, creo que PowerShell le resultará más fácil de usar y escribir. El objetivo del problema no es el resultado final, que no tiene valor práctico, sino desarrollar los músculos de PowerShell.

