PowerShell + Automatización Práctica
PowerShell + Practical Automation

PowerShell para Limpiar Data: 20 Casos Avanzados

PowerShell for Data Cleaning: 20 Advanced Cases

Automatización directa para estandarizar archivos, validar campos, enriquecer registros, enmascarar PII y preparar data antes de SQL, Excel o Power BI.

Direct automation to standardize files, validate fields, enrich records, mask PII, and prepare data before SQL, Excel, or Power BI.

La idea central

The core idea

PowerShell es una herramienta excelente para resolver problemas de datos en carpetas reales: archivos exportados, fotos, CSV, reportes, nombres mal escritos y estructuras que necesitan limpieza antes de llegar a un sistema formal.

PowerShell is an excellent tool for solving data problems in real folders: exported files, photos, CSVs, reports, misspelled names, and structures that need cleaning before they reach a formal system.

Cómo usar estos casos sin romper nada

How to use these cases without breaking anything

Estandarización visual Visual standardization

1. Capitalizar nombres y apellidos

1. Capitalize first and last names

Corregir registros ingresados en minúsculas o MAYÚSCULAS para que los nombres luzcan profesionales en cualquier reporte oficial.

Correct records entered in lowercase or UPPERCASE so names look professional in any official report.

Ejemplo baseBase example
$textInfo = (Get-Culture).TextInfo
$_.Nombre = $textInfo.ToTitleCase($_.Nombre.ToLower())
Formato único Unique format

2. Estandarizar números telefónicos

2. Standardize phone numbers

Forzar un formato limpio (ej. 305-555-1234) a partir de cadenas sucias, removiendo puntos, espacios o paréntesis innecesarios.

Force a clean format (e.g., 305-555-1234) from dirty strings, removing unnecessary dots, spaces, or parentheses.

Ejemplo baseBase example
$telLimpio = $_.Telefono -replace '\\D', ''
$_.Telefono = "{0:###-###-####}" -f [int64]$telLimpio
Compatibilidad legacy Legacy compatibility

3. Remover acentos y caracteres especiales

3. Remove accents and special characters

Preparar nombres para sistemas antiguos que no soportan caracteres latinos, convirtiendo letras como 'á' en 'a' o 'ñ' en 'n'.

Prepare names for older systems that don't support Latin characters, converting letters like 'á' to 'a' or 'ñ' to 'n'.

Ejemplo baseBase example
$normalizado = $_.Apellido.Normalize([System.Text.NormalizationForm]::FormD)
$_.Apellido = $normalizado -replace '\\p{M}', ''
Consistencia geográfica Geographical consistency

4. Unificar nomenclaturas de estados o ciudades

4. Unify state or city nomenclatures

Reemplazar variaciones informales como 'Fla.' o 'Florida' por el estándar oficial 'FL' usando una tabla de cruce rápida.

Replace informal variations like 'Fla.' or 'Florida' with the official 'FL' standard using a quick lookup table.

Ejemplo baseBase example
$estados = @{ "Florida"="FL"; "Fla."="FL"; "fl"="FL" }
$_.Estado = $estados[$_.Estado]
Preparación para SQL SQL preparation

5. Normalizar formatos de fechas

5. Normalize date formats

Convertir fechas mezcladas en textos al estándar ISO YYYY-MM-DD, ideal para importar a bases de datos sin errores.

Convert mixed text dates to the ISO YYYY-MM-DD standard, ideal for importing into databases without errors.

Ejemplo baseBase example
$fecha = [datetime]::ParseExact($_.Fecha, "dd/MM/yyyy", $null)
$_.FechaFormateada = $fecha.ToString("yyyy-MM-dd")
Filtro de exactitud Accuracy filter

6. Validar longitud de Códigos Postales

6. Validate Zip Code length

Identificar y separar los registros donde el código postal (Zip Code) tenga menos de 5 dígitos o contenga letras por error.

Identify and separate records where the Zip Code has less than 5 digits or mistakenly contains letters.

Ejemplo baseBase example
Import-Csv "C:\\Data\\Contactos.csv" | 
Where-Object { $_.ZipCode -notmatch "^\\d{5}$" } | 
Export-Csv "C:\\Data\\ZipInvalidos.csv"
Lógica de negocio Business logic

7. Identificar fechas ilógicas o fuera de rango

7. Identify illogical or out-of-range dates

Marcar registros donde la fecha calculada rompa una regla, como menores de edad en una base de datos de personal laboral.

Flag records where the calculated date breaks a rule, such as minors in an employee database.

Ejemplo baseBase example
$edad = (Get-Date).Year - ([datetime]$_.FechaNacimiento).Year
if ($edad -lt 18) { Write-Warning "Alerta: Registro menor de edad" }
Seguridad institucional Institutional security

8. Validar dominios de correo electrónico

8. Validate email domains

Asegurar que los correos de un listado pertenezcan exclusivamente a los dominios educativos o corporativos autorizados.

Ensure that emails in a list belong exclusively to authorized educational or corporate domains.

Ejemplo baseBase example
Import-Csv "C:\\Data\\Usuarios.csv" | 
Where-Object { $_.Email -notmatch "@misistema\\.edu$" }
Prevención de errores Error prevention

9. Detectar anomalías numéricas (Outliers)

9. Detect numerical anomalies (Outliers)

Identificar salarios o tarifas que se salgan de un rango lógico predefinido para evitar cálculos erróneos que afecten presupuestos.

Identify salaries or rates that fall outside a predefined logical range to prevent erroneous calculations affecting budgets.

Ejemplo baseBase example
Import-Csv "C:\\Data\\Nominas.csv" | 
Where-Object { [int]$_.Salario -gt 150000 -or [int]$_.Salario -lt 20000 }
Integridad de enlaces Link integrity

10. Comprobar la existencia de URLs

10. Check URL existence (Broken links)

Hacer un chequeo rápido a los enlaces incluidos en un reporte para marcar aquellos que devuelven un error 404 (rotos).

Do a quick check on links included in a report to flag those returning a 404 error.

Ejemplo baseBase example
try { Invoke-WebRequest $_.Website -Method Head -ErrorAction Stop }
catch { Write-Host "Enlace roto detectado: $($_.Website)" }
Completitud de data Data completeness

11. Rellenar campos nulos o vacíos

11. Fill null or empty fields

Sustituir celdas en blanco por valores predeterminados como 'N/A' para evitar que herramientas como Power BI arrojen errores.

Replace blank cells with default values like 'N/A' to prevent tools like Power BI from throwing errors.

Ejemplo baseBase example
if ([string]::IsNullOrWhiteSpace($_.Departamento)) { 
  $_.Departamento = "N/A" 
}
Enriquecimiento de datos Data enrichment

12. Extraer el dominio del correo para segmentar

12. Extract email domain for segmentation

Cortar la dirección de correo después del @ para crear una nueva columna que agrupe a los usuarios por su institución.

Cut the email address after the @ to create a new column grouping users by their institution.

Ejemplo baseBase example
$datos | Select-Object *, 
@{Name="Dominio"; Expression={$_.Email.Split('@')[1]}}
Estructuración atómica Atomic structuring

13. Separar 'Nombre Completo' en columnas

13. Split 'Full Name' into columns

Dividir una columna única usando el primer espacio como delimitador para obtener 'Primer Nombre' y 'Apellidos' por separado.

Divide a single column using the first space as a delimiter to get 'First Name' and 'Last Name' separately.

Ejemplo baseBase example
$datos | Select-Object *,
@{Name="PrimerNombre"; Expression={$_.NombreCompleto.Split(' ', 2)[0]}},
@{Name="Apellidos"; Expression={$_.NombreCompleto.Split(' ', 2)[1]}}
Control de cambios Strict change control

14. Generar un Hash único por fila (Checksum)

14. Generate a unique Hash per row (Checksum)

Crear un código basado en el contenido para identificar rápidamente si un registro específico sufrió modificaciones de un mes a otro.

Create a content-based code to quickly identify if a specific record was modified from one month to the next.

Ejemplo baseBase example
$cadena = "$($_.ID)-$($_.Status)-$($_.Monto)"
$hash = Get-FileHash -InputStream ([IO.MemoryStream]::new([byte[]][char[]]$cadena)) -Algorithm MD5
Trazabilidad del proceso Process traceability

15. Añadir metadatos de auditoría al archivo

15. Add audit metadata to the file

Inyectar automáticamente columnas indicando la fecha exacta de ejecución y el usuario que corrió el script.

Automatically inject columns indicating the exact execution date and the user who ran the script.

Ejemplo baseBase example
$datos_limpios | Select-Object *,
@{Name="FechaProceso"; Expression={Get-Date -Format "yyyy-MM-dd"}},
@{Name="ProcesadoPor"; Expression={$env:USERNAME}}
Diagnóstico inicial Initial diagnostics

16. Generar un reporte rápido de 'Data Profiling'

16. Generate a quick 'Data Profiling' report

Leer un CSV y agrupar los datos para evaluar el volumen de información y ver cuántos registros hay por categoría.

Read a CSV and group the data to evaluate volume and see how many records exist per category.

Ejemplo baseBase example
Import-Csv "C:\\Data\\Maestro.csv" | 
Group-Object Departamento -NoElement | 
Sort-Object Count -Descending
Cruce relacional Relational cross-check

17. Identificar registros 'huérfanos'

17. Identify 'orphan' records

Cruzar un archivo de actividad contra el maestro principal para encontrar IDs que tienen movimiento pero no están registrados.

Cross an activity file against the main master file to find IDs that have movement but aren't officially registered.

Ejemplo baseBase example
$maestro = Import-Csv "C:\\Data\\Maestro.csv" | Select-Object -ExpandProperty ID
Import-Csv "C:\\Data\\Actividad.csv" | 
Where-Object { $maestro -notcontains $_.ID }
Prevención CSV CSV Corruption Prevention

18. Limpiar saltos de línea invisibles dentro de celdas

18. Clean invisible line breaks inside cells

Remover los retornos de carro (Enters) que los usuarios meten accidentalmente dentro de celdas en Excel y que rompen el formato CSV.

Remove carriage returns (Enters) that users accidentally put inside Excel cells, which break the CSV format.

Ejemplo baseBase example
$_.Comentarios = $_.Comentarios -replace "\`r|\`n", " "
Privacidad y cumplimiento Privacy and compliance

19. Enmascarar datos sensibles (PII)

19. Mask sensitive data (PII)

Ocultar los primeros dígitos de un ID, número de seguro o cuenta, dejando solo los últimos 4 visibles antes de compartir el reporte.

Hide the first digits of an ID, SSN, or account, leaving only the last 4 visible before sharing the report.

Ejemplo baseBase example
$idOriginal = $_.SSN
$_.SSN_Masked = "***-**-" + $idOriginal.Substring($idOriginal.Length - 4)
Entrega rápida Fast delivery

20. Comprimir la data limpia para transmisión

20. Compress clean data for transmission

Tomar el CSV ya procesado, validado y enriquecido, y comprimirlo nativamente en un archivo .zip listo para enviarse.

Take the processed, validated, and enriched CSV and natively compress it into a .zip file ready to be sent.

Ejemplo baseBase example
Compress-Archive -Path "C:\\Data\\Final\\*.csv" -DestinationPath "C:\\Data\\Entrega_Procesada.zip" -Update