Cómo unir archivos CSV dentro de ZIP automáticamente con PowerShell
Cómo unir archivos CSV dentro de ZIP automáticamente con PowerShell
Automatiza la consolidación de reportes CSV provenientes de múltiples archivos ZIP sin duplicar encabezados.
Cuando trabajamos con reportes generados por diferentes sistemas es bastante común recibir información distribuida en varios archivos CSV, muchas veces comprimidos dentro de archivos ZIP.
Por ejemplo, podemos recibir diariamente:
- Reportes de facturación.
- Archivos de pedidos.
- Información de embarques.
- Reportes de logística.
- Archivos generados por un ERP.
- Información descargada de algún sistema administrativo.
- Reportes enviados por diferentes sucursales.
El problema aparece cuando tenemos que juntar todos esos archivos manualmente.
Abrir cada ZIP, extraer el CSV, copiar la información, pegarla en otro archivo y repetir el proceso puede convertirse en una tarea repetitiva y propensa a errores.
En este artículo vamos a crear un pequeño script de PowerShell que automatiza este proceso.
¿Qué hace nuestro script?
El proceso es bastante sencillo:
- Busca archivos ZIP en una carpeta.
- Extrae cada archivo ZIP.
- Busca el archivo CSV que contiene.
- Toma el primer CSV completo, incluyendo su encabezado.
- Para los siguientes CSV solamente copia los datos.
- Genera un único archivo
Consolidado.csv.
De esta forma evitamos terminar con un archivo como este:
RFC,Nombre,Total
AAA,Juan,100
BBB,Ana,200
RFC,Nombre,Total
CCC,Pedro,300
DDD,Luis,400
Nuestro resultado será:
RFC,Nombre,Total
AAA,Juan,100
BBB,Ana,200
CCC,Pedro,300
DDD,Luis,400
El encabezado solamente aparece una vez.
¿Por qué utilizar PowerShell para este proceso?
Una de las ventajas de esta solución es que podemos aprovechar una herramienta disponible en Windows para realizar la automatización sin tener que adquirir un software especializado.
Para muchos procesos administrativos y operativos no necesitamos una plataforma costosa. Si el equipo ya cuenta con Windows PowerShell, podemos utilizarlo para automatizar tareas relacionadas con archivos, carpetas, reportes y procesos repetitivos.
Esto puede representar una ventaja importante para pequeñas empresas o áreas que necesitan automatizar procesos pero tienen un presupuesto limitado.
¿Para quién puede ser útil?
Aunque el ejemplo utiliza PowerShell, este tipo de automatización puede ser útil para diferentes áreas de una empresa.
Contabilidad
Un área contable puede recibir periódicamente archivos con información de facturas, CFDI, movimientos o reportes de diferentes periodos.
En lugar de abrir cada archivo y copiar manualmente la información, PowerShell puede realizar la consolidación.
Logística
En logística es común trabajar con reportes de pedidos, entregas, movimientos y embarques.
Si cada reporte llega como un CSV dentro de un ZIP, podemos utilizar este proceso para generar automáticamente un archivo consolidado.
Embarques
Otra aplicación puede ser la consolidación de archivos generados por diferentes transportistas, almacenes o periodos.
Por ejemplo:
Embarques_01.zip
Embarques_02.zip
Embarques_03.zip
Embarques_04.zip
Cada ZIP puede contener un CSV y nuestro script puede convertirlos en:
Embarques_Consolidado.csv
La estructura de las carpetas
Para este ejemplo utilizamos una estructura similar a:
UnirCSV
│
├── archivo01.zip
├── archivo02.zip
├── archivo03.zip
│
├── work
│
└── output
El script crea automáticamente las carpetas de trabajo necesarias y genera el archivo consolidado.
Demo del script para explicar el problema
El script de PowerShell
Este es el código utilizado para realizar la consolidación, lo que esta resaltado en negritas es lo que debes modificar de acuerdo a que carpeta vas a utilizar y que nombre le vas a poner a tu archivo de salida:
$InputFolder = "D:\Temp\EjecucionScripts\UnirCSV"
$WorkFolder = Join-Path $InputFolder "work\_temp"
$OutputFolder = Join-Path $InputFolder "output"
$FinalFileCSV = Join-Path $OutputFolder "Consolidado.csv"
# Limpiar carpetas previas
if (Test-Path $WorkFolder) {
Remove-Item $WorkFolder -Recurse -Force
}
if (Test-Path $OutputFolder) {
Remove-Item $OutputFolder -Recurse -Force
}
if (Test-Path $FinalZip) {
Remove-Item $FinalZip -Force
}
New-Item -ItemType Directory -Path $WorkFolder | Out-Null
New-Item -ItemType Directory -Path $OutputFolder | Out-Null
# Crear archivo final vacío
New-Item -ItemType File -Path $FinalFileCSV | Out-Null
$ZipFiles = Get-ChildItem -Path $InputFolder -Filter "*.zip"
$EsPrimerArchivo = $true
foreach ($Zip in $ZipFiles) {
$ExtractPath = Join-Path $WorkFolder $Zip.BaseName
New-Item -ItemType Directory -Path $ExtractPath | Out-Null
Expand-Archive -Path $Zip.FullName -DestinationPath $ExtractPath -Force
# Buscar archivos CSV
$InvoiceFile = Get-ChildItem -Path $ExtractPath -Recurse -Filter "*.csv" |
Select-Object -First 1
if ($InvoiceFile) {
if ($EsPrimerArchivo) {
# Primer CSV: copiar encabezado + datos
Get-Content $InvoiceFile.FullName |
Add-Content -Path $FinalFileCSV
$EsPrimerArchivo = $false
}
else {
# Siguientes CSV: saltar encabezado
Get-Content $InvoiceFile.FullName |
Select-Object -Skip 1 |
Add-Content -Path $FinalFileCSV
}
}
}
Write-Host "Proceso terminado."
La parte importante: detectar el primer archivo
La variable:
$EsPrimerArchivo = $true
nos permite saber si estamos procesando el primer CSV.
Cuando encontramos el primer archivo hacemos:
Get-Content $InvoiceFile.FullName |
Add-Content -Path $FinalFileCSV
En este caso copiamos todo el contenido, incluyendo el encabezado.
Después cambiamos la variable:
$EsPrimerArchivo = $false
A partir de ese momento todos los demás archivos pasan por:
Get-Content $InvoiceFile.FullName |
Select-Object -Skip 1 |
Add-Content -Path $FinalFileCSV
Select-Object -Skip 1 hace que PowerShell ignore la primera línea del CSV.
De esta manera podemos combinar todos los archivos sin repetir el encabezado.
Ventajas de automatizar este proceso
Una automatización como esta puede parecer sencilla, pero cuando el proceso se ejecuta de manera frecuente puede ahorrar bastante tiempo.
- No requiere adquirir una licencia adicional de un programa especializado para realizar esta tarea en un equipo Windows que ya dispone de PowerShell.
- Reduce el trabajo manual de abrir, extraer y copiar información de múltiples archivos.
- Reduce errores ocasionados por copiar y pegar información manualmente.
- Permite procesar muchos archivos de manera automática.
- Es reutilizable: podemos adaptar el script para diferentes reportes.
- Puede programarse para ejecutarse automáticamente mediante el Programador de tareas de Windows.
Una automatización sencilla, pero muy útil
Este es un buen ejemplo de algo que no necesariamente requiere comprar un software especializado.
Si trabajamos con Windows, podemos aprovechar PowerShell para automatizar muchas tareas repetitivas relacionadas con archivos.
En mi experiencia trabajando con sistemas, muchas automatizaciones útiles no necesitan grandes plataformas ni herramientas costosas.
A veces un pequeño script puede ahorrarnos mucho tiempo cuando una tarea se repite todos los días, todas las semanas o todos los meses.
¿Qué podríamos mejorar?
Este script es solamente un punto de partida.
Podríamos agregar otras funcionalidades, por ejemplo:
- Validar que todos los CSV tengan las mismas columnas.
- Registrar qué archivos fueron procesados.
- Detectar archivos ZIP dañados.
- Ignorar archivos duplicados.
- Crear un archivo de log.
- Procesar únicamente archivos de una fecha determinada.
- Ejecutar automáticamente el proceso con el Programador de tareas de Windows.
- Enviar un correo cuando termine el proceso.
- Generar estadísticas del proceso.
- Mover los ZIP procesados a otra carpeta después de procesarlos.
Y aquí es donde PowerShell se vuelve especialmente interesante para la automatización de procesos administrativos y operativos.
Conclusión
Unir archivos CSV manualmente puede parecer una tarea pequeña, pero cuando tenemos decenas o cientos de archivos se convierte en una actividad repetitiva.
Con PowerShell podemos automatizar el proceso y convertir múltiples archivos CSV contenidos en ZIP en un único archivo consolidado.
Además, podemos hacerlo utilizando herramientas que ya tenemos disponibles en Windows, sin necesidad de adquirir una solución especializada solamente para realizar esta tarea.
Lo más importante no es solamente el código, sino identificar esas tareas repetitivas que hacemos diariamente y preguntarnos:
¿Esto realmente tengo que hacerlo manualmente?
Muchas veces la respuesta es no.
Comentarios
Publicar un comentario
Dejanos tus dudas y comentarios