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:

  1. Busca archivos ZIP en una carpeta.
  2. Extrae cada archivo ZIP.
  3. Busca el archivo CSV que contiene.
  4. Toma el primer CSV completo, incluyendo su encabezado.
  5. Para los siguientes CSV solamente copia los datos.
  6. 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.

Importante: en este ejemplo utilizamos PowerShell disponible en Windows, por lo que no es necesario adquirir una licencia adicional de un programa especializado para realizar esta consolidación.

¿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

🚀 Mantener este blog funcionando requiere tiempo y café. ¡Puedes contribuir con uno aquí!

Entradas más populares de este blog

Guía Práctica: Ejemplo Completo de ASPX para Desarrolladores Web

👉 Cómo obtener el tipo de cambio en Excel con API de Banxico (paso a paso)

Macro en Word para automatizar documentos: genera diplomas en segundos (con código VBA)