Identify salaries, rates, quantities, or financial values that fall outside a predefined logical range.
Identificar salarios, tarifas, cantidades o valores financieros que se salgan de un rango lógico predefinido.
This exercise is for learning and testing purposes only. Do not run scripts against production directories, payroll files, HR records, financial systems, business-critical repositories, or enterprise datasets without proper authorization, testing, backups, change-control approval, least-privilege permissions, and compliance with your organization's cybersecurity policies.
Este ejercicio es únicamente para aprendizaje y pruebas. No ejecutes scripts contra directorios de producción, nóminas, archivos de recursos humanos, sistemas financieros, repositorios críticos o datos empresariales sin autorización, pruebas, respaldos, aprobación de control de cambios, permisos mínimos y cumplimiento de las políticas de ciberseguridad de tu organización.
An organization receives a payroll, budget, billing, or operational CSV file. Most numeric values are reasonable, but some records contain values that are too high, too low, missing, or incorrectly entered. These outliers can distort totals, averages, forecasts, budgets, dashboards, and downstream calculations.
Una organización recibe un archivo CSV de nómina, presupuesto, facturación u operaciones. La mayoría de los valores numéricos son razonables, pero algunos registros contienen valores demasiado altos, demasiado bajos, vacíos o mal ingresados. Estos outliers pueden distorsionar totales, promedios, pronósticos, presupuestos, dashboards y cálculos posteriores.
| EmployeeID | Name | Department | Salary |
|---|---|---|---|
| 1001 | Maria Lopez | Finance | 65000 |
| 1002 | Juan Perez | IT | 72000 |
| 1003 | Ana Torres | HR | 18000 |
| 1004 | Carlos Diaz | Operations | 158000 |
| 1005 | Laura Smith | Admin | 54000 |
| 1006 | Pedro Ramos | Public Works | 210000 |
The basic idea is to return only records where the salary is outside the logical range.
La idea base es devolver solamente los registros donde el salario está fuera del rango lógico.
Import-Csv "C:\Data\Nominas.csv" |
Where-Object { [int]$_.Salario -gt 150000 -or [int]$_.Salario -lt 20000 }$sourceFile = "C:\Data\Nominas.csv" $cleanFile = "C:\Data\Nominas_Validas.csv" $reviewFile = "C:\Data\Nominas_Outliers.csv"
$records = Import-Csv -Path $sourceFile
For this exercise, salaries below 20,000 or above 150,000 will be flagged for review.
Para este ejercicio, los salarios menores de 20,000 o mayores de 150,000 serán marcados para revisión.
$minimumSalary = 20000 $maximumSalary = 150000
$processed = foreach ($record in $records) {
$salaryText = $record.Salary
$salary = 0
if (-not [int]::TryParse($salaryText, [ref]$salary)) {
$status = "Review"
$issue = "Salary is not numeric"
}
elseif ($salary -lt $minimumSalary) {
$status = "Review"
$issue = "Salary below minimum threshold"
}
elseif ($salary -gt $maximumSalary) {
$status = "Review"
$issue = "Salary above maximum threshold"
}
else {
$status = "Valid"
$issue = ""
}
$record | Add-Member -NotePropertyName ValidationStatus -NotePropertyValue $status -Force
$record | Add-Member -NotePropertyName ValidationIssue -NotePropertyValue $issue -Force
$record
}$validRecords = $processed | Where-Object { $_.ValidationStatus -eq "Valid" }
$reviewRecords = $processed | Where-Object { $_.ValidationStatus -eq "Review" }
$validRecords | Export-Csv -Path $cleanFile -NoTypeInformation
$reviewRecords | Export-Csv -Path $reviewFile -NoTypeInformation# PowerShell Advanced Topic #9
# Detect numeric anomalies / outliers
$sourceFile = "C:\Data\Nominas.csv"
$cleanFile = "C:\Data\Nominas_Validas.csv"
$reviewFile = "C:\Data\Nominas_Outliers.csv"
$minimumSalary = 20000
$maximumSalary = 150000
$records = Import-Csv -Path $sourceFile
$processed = foreach ($record in $records) {
$salaryText = $record.Salary
$salary = 0
if (-not [int]::TryParse($salaryText, [ref]$salary)) {
$status = "Review"
$issue = "Salary is not numeric"
}
elseif ($salary -lt $minimumSalary) {
$status = "Review"
$issue = "Salary below minimum threshold"
}
elseif ($salary -gt $maximumSalary) {
$status = "Review"
$issue = "Salary above maximum threshold"
}
else {
$status = "Valid"
$issue = ""
}
$record | Add-Member -NotePropertyName ValidationStatus -NotePropertyValue $status -Force
$record | Add-Member -NotePropertyName ValidationIssue -NotePropertyValue $issue -Force
$record
}
$validRecords = $processed | Where-Object { $_.ValidationStatus -eq "Valid" }
$reviewRecords = $processed | Where-Object { $_.ValidationStatus -eq "Review" }
$validRecords | Export-Csv -Path $cleanFile -NoTypeInformation
$reviewRecords | Export-Csv -Path $reviewFile -NoTypeInformation
Write-Host "Numeric anomaly detection completed."
Write-Host "Valid records:" $validRecords.Count
Write-Host "Records requiring review:" $reviewRecords.Count| EmployeeID | Name | Salary |
|---|---|---|
| 1001 | Maria Lopez | 65000 |
| 1002 | Juan Perez | 72000 |
| 1005 | Laura Smith | 54000 |
| EmployeeID | Name | Salary | Issue |
|---|---|---|---|
| 1003 | Ana Torres | 18000 | Below minimum |
| 1004 | Carlos Diaz | 158000 | Above maximum |
| 1006 | Pedro Ramos | 210000 | Above maximum |