Image

Convertire l'encoding di un file di testo e comprimerlo con gzip

Come convertire l'encoding di un file di testo e comprimerlo con gzip.

Chi usa maneggiare grandi archivi di testo può succedere di aver problemi con l'encoding e la dimensione delgli stessi.
Mi sono preoccupato di creare uno script in bash che può servire a risolvere questi due problemi con un comando.

Lo script andrà ad analizzare il file e rileverà il tipo di encoding originale e successivamente sarà convertito con l'encoding "UTF8", successivamente sarà compresso in formato "gzip"

Come prima cosa necessiteremo creare un file che conterrà il codice permettendo così l'esecuzione di tutti i passi necessari.

Aprire un terminale e creare un file con il nome "convertitore.sh"

nano convertitore.sh

Inserire i vari comandi che eseguono, uno ad uno, per montare lo script.

#!/bin/bash
# Copyright Salvatore Castiglione 2023

# Definizioni delle variabili iniziali
FILE=$1
ENCODING_END='utf8'

#Controlla se il comando è eseguito con il parametro contenente il nome del file da convertire
if [ -z  "$1" ]; then
    clear
    echo "Digitare il nome del file che si vuole trattare."
    echo "Es: ./convertitore.sh nome_file.csv"
    exit 1
else
        ENCODING_START=$(file -bi $FILE | awk '{print $2}' | awk '{print substr($0,9)}')
        echo ""
        echo ""
        echo "File: $FILE con encoding $ENCODING_START"
        echo ""
        read -p "Un tasto per continuare."

        #Converte l'encoding del file da un tipo ad un'altro tipo
        echo "Conversione del file in corso..."
        iconv -f $ENCODING_START -t $ENCODING_END $FILE -o $FILE.$ENCODING_END

        #Manipola il nome del file per poter inserire, tra nome e estensione, il tipo di encoding.
        NOME_INIZIALE=$FILE.$ENCODING_END
        NOME_FILE=$(basename $FILE .csv)
        EXT_CSV=$(echo "$FILE" | cut -f 2- -d '.')
        NOME_FINALE="${NOME_FILE}_${ENCODING_END}.${EXT_CSV}"

        #Rinomina il file appena convertito con il nome composto dal tipo di encoding.
        echo "Rinomina il file convertito"
        mv $NOME_INIZIALE $NOME_FINALE

        #Mostra come il none finale del file è stato modificato
        END=$(file -bi $NOME_FINALE | awk '{print $2}' | awk '{print substr($0,9)}')
        echo "Encoding del file: $NOME_FINALE modificata in: $END "

        #Zippa il file, già codificato, usando il formato Gzip
        read -p "Un tasto per continuare la compressione in formato GZ"
        echo "Compressione del file in corso..."
        #gzip -k $NOME_FINALE
        gzip $NOME_FINALE
        echo "Compressione in formato Gzip completata con successo!!!"
        echo "---------------------------------------------------------------------------------"
        echo "Il nome del file convertito si chiama ${NOME_FINALE}.gz"
        echo ""
fi

Per l'esecuzione del comando sarà necessario aggiungere l'attributo di esecuzione al file usando il comando:

chmod +x convertitore.sh

e successivamente usare:

./convertire.sh nomefileditesto.csv

N.B. lo script deve stare dentro la directory contenente il file da convertire
Fate attenzione perchè il file originale non sara cancellato