imagen

Excel varias pestañas y datos dispersos en varias filas o columnas pasarlo a fichero tabulado

17.May.2023 — Julio

Me pasan fichero excel con multitud de pestañas tal que así

e2a1.png

Dentro de cada hoja hay datos agrupados por Repartos como código cliente, nombre, población y orden

pero pueden estar en cualquier parte de la hoja excel (columna y fila), en este caso empiezan en la columna A y F

e2a2.png

pero también pueden empezar en la columna B fila 23

e2a3.png

Se require fichero tabulado en el cual la primera columna sea el nombre de la pestaña/hoja del excel

y el resto las columnas antes mencionadas: reparto1 o reparto2, codigocliente, población, orden

este sería un ejemplo para pestaña 174 reparto 2

e2a4.png

En lugar de manipular todos estos datos a mano, un script utilizando herramientas disponibles en linux genera

el fichero deseado en 1 segundo:

```

#!/usr/bin/env bash
# Función: crear YVLG_KMS_ORDEN segun excel que nos pasen
# Fecha creación: 13.04.2023
# Autor: Julio Briso-Montiano
# Versión: 1.0
# Detalle:
#       - correr primero xlsx2csv -s 0 -d tab EXCEL_ORDEN.xlsx > EXCEL_ORDEN.txt
#       - tu responsabilidad chequear
#       - si quieres excluir alguna ruta renombra la hoja del excel que sea añadiendo alguna letra p.e "x"
#

set -ueo pipefail

if [ $# -lt 1 ]
then
    echo "Formato:   ./kms.sh <excel.xlsx>"
    exit
fi

xlsx2csv -s 0 -d tab $1 > tmpkms.tsv

awk -F"\t" '{
    gsub("\r","")
    if ( substr($1,1,7) == "-------" && NF == 1) {
        gsub(" ","")
        split($1, a, "-")
        #ruta=sprintf("%06i",a[10])
        ruta=substr("000000"a[10],1 + length("000000"a[10]) - 6)
    }
    if ( ruta*1 > 1 )
        for (i=1; i <= NF; i++) {
            if ( match($i," Reparto ") ) {
                reparto=substr($i, RSTART+9,1)
                colreparto[i]=reparto
            }
            if ( ($i*1 > 10000000 && $i*1 < 19999999) || $i == "CE20" ) {
                if ( $i == "CE20" )
                    tipo="A"
                else
                    tipo="E"
                print ruta,colreparto[i],"01.01.2023","31.12.9999",$i,$(i+3),tipo,"X"
            }
        }
}' OFS="\t" tmpkms.tsv > tmpyvlg_kms_orden.tsv
sort -t$'\t' -k1 -k2 -nk6 tmpyvlg_kms_orden.tsv > yvlg_kms_orden.tsv
echo -e "Generado fichero yvlg_kms_orden.tsv"

```

Tags: awk, bash, excel

Comments? Tweet