Compresser des fichiers au format ZIP avec SSIS

Compresser des fichiers et des dossiers en archives au format ZIP avec un package SSIS et 7-zip.

Tout d’abord, il n’est pas possible de compresser des fichiers au format .zip ou .tar.gz avec les composants natifs SSIS. Cependant plusieurs options sont offertes au développeur pour compresser des fichiers. Il est utile par exemple de réduire la taille des dossiers contenant de fichiers textes, Excel ou encore des bases de données. En effet, tous types de fichiers d’archives peuvent être compressés : des fichiers de données, entres autres types : .XLS, .XLSX, .CSV, .DOC, .TXT, .DOCX, .XML, .HTML, .PDF, .XLA, .ODS, .JPG, .PNG, etc.

Compresser des fichiers en archives ZIP avec un package SSIS

Ce tutoriel explique donc étape par étape comment compresser un ou plusieurs fichiers en ligne de commande et de manière automatisée. Ce package utilise un outils tiers, le logiciel gratuit et open source 7ZIP. Suivre donc les étapes suivantes dans un package SSIS existant ou en ajouter et à un projet. L’exemple ci-dessous utilise le composant Execute Task Component de SSIS, il permet d’appeler les fichiers .bat comportant des commandes MS-DOS ou directement des exécutables Windows.

1. Télécharger, installer et tester le logiciel 7-zip

Pour commencer, télécharger depuis 7zip.org le logiciel de compression et l’installer sur le PC de développement et également sur le serveur si le package SSIS est déployé sur une autre machine Windows.

Télécharger 7-zip depuis le site officiel 7-zip.org
Télécharger 7-zip depuis le site officiel 7-zip.org

Copier un fichier CSV pour tester la commande MS-DOS. Voici le fichier csv d’exemple utilisé dans ce tutoriel SSIS.

Télécharger le fichier, le dupliquer et les renommer comme ceci:

  1. Customers_Data_1.csv
  2. Customers_Data_2.csv
  3. Customers_Data_3.csv

Aller dans le dossier contenant les fichiers CSV. Et afficher les fichiers à zipper.

Fichiers CSV à compresser avec SSIS et 7-zip
Fichiers CSV à compresser avec SSIS et 7-zip

Compresser un seul fichier depuis MS-DOS avec 7-zip

Tester ensuite l’appel directement depuis MS-DOS avant d’utiliser 7-zip depuis SSIS. Ouvrir pour cela une invite de commande Windows et taper ces commandes.

cd c:\data
dir
Vérifier la présence des fichiers CSV à compresser avec une commande DOS
Vérifier la présence des fichiers CSV à compresser avec une commande DOS

Appeler le fichier exécutable 7z.exe pour compresser le fichier.

"C:\Program Files\7-Zip\7z.exe" a Customers_Zipped.zip Customers_Data_1.csv
Compresser un fichier CSV avec une commande MS-DOS et 7-zip
Compresser un fichier CSV avec une commande MS-DOS et 7-zip

2. Compresser un fichier avec SSIS de manière statique

Deuxièmement, dans un flux de contrôle SSIS, ajouter la tâche Execute Process Task.

Le package SSIS utilise une ligne de commande MS-DOS pour compresser les fichiers avec 7ZIP
Le package SSIS utilise une ligne de commande MS-DOS pour compresser les fichiers avec 7ZIP

Cette première option se fait à travers une simple commande MS-DOS. Ecrire directement les paramètres en dur à l’intérieur du composant SSIS Execute Process Task dans un flux de contrôle, dans Visual Studio. Pour paramétrer le composant, depuis l’onglet Process, entrer les valeurs suivantes :

  1. Executable : C:\Program Files\7-Zip\7z.exe
  2. Arguments : a Customers_Zipped.zip Customers_Data_1.csv
  3. WorkingDirectory : C:\data

Cette commande appelle directement l’utilitaire 7z.exe depuis son emplacement sur le PC. La tâche SSIS peut également utiliser un autre outil compatible avec les lignes de commandes MS-DOS. Bien entendu, les options sont paramétrables et il est possible de choisir le mode de compression et le format. Exécuter enfin la tâche pour compresser les fichiers.

Exécuter la tâche SSIS pour compresser les fichiers depuis un dossier Windows
Exécuter la tâche SSIS pour compresser les fichiers depuis un dossier Windows

3. Compresser plusieurs fichiers dans la même archive ZIP

De la même manière, il est possible d’ajouter dans la même archive ZIP plusieurs fichiers, il faut pour cela utiliser un filtre comme un argument plutôt que le nom complet du fichier. Pour cela, remplacer simplement le paramètre Arguments de la tâche d’exécution des processus :

  • Arguments : a Customers_Zipped.zip Customers_*.csv
Compresser dans une archive ZIP les fichiers d'un dossier depuis une tâche SSIS
Compresser dans une archive ZIP les fichiers d’un dossier depuis une tâche SSIS

Tous les fichiers avec une extension CSV sont compressés dans la même archive zip. Le résultat après exécution des deux variantes avec deux fichiers zip:

  • Customers_Data_1.zip : contient uniquement un fichier compressé
    • Customers_Data_1.csv
  • Customers_Zipped.zip : contient les trois fichiers compressés:
    • Customers_Data_1.csv
    • Customers_Data_2.csv
    • Customers_Data_3.csv
Fichiers CSV compressés en ZIP avec le package SSIS
Fichiers CSV compressés en ZIP avec le package SSIS

Le fichier Customers_Zipped.zip contient bien les 3 fichiers avec l’extension CSV présents dans le dossier source C:\data.

Contenu du fichier ZIP avec les 3 fichiers CSV détectés par 7-zip
Contenu du fichier ZIP avec les 3 fichiers CSV détectés par 7-zip

4. Compresser chaque fichier dans une archive ZIP avec SSIS

Il est aussi possible de compresser dynamiquement tous les fichiers d’un dossier sans en connaître le nom. Se baser alors sur l’extension du fichier source ou un filtre sur le nom des fichiers à prendre en compte.

Dans cet exemple simple, seul le nom du fichier à compresser est stocké dans une variable, ainsi que l’horodatage, c’est à dire la date et l’heure. Le but est de créer par exemple une archive par fichier, en conservant le nom original. Il suffit pour cela d’intégrer la tâche d’exécution de processus SSIS dans une boucle de fichiers, c’est le même principe qui est utilisé pour importer des fichiers plats dans une base SQL de manière dynamique.

4.1 Configurer une boucle SSIS et créer 2 variables

Ajouter donc une boucle Foreach Loop Container, et ajouter une tâche Execute Process Task.

Ajouter une boucle SSIS Foreach Loop Container et une tâche Execute Process Task
Ajouter une boucle SSIS Foreach Loop Container et une tâche Execute Process Task

Créer deux variables SSIS pour stocker dynamiquement le nom du fichier à compresser, ainsi que la date du jour et l’heure pour gérer l’horodatage automatique dans le nom du fichier ZIP. Pour afficher les variables, faire un clic droit sur l’espace de travail du package et sélectionner Variables.

  1. FlatFilePath : variable utilisée depuis la boucle sur les fichiers et transmise à la tâche de compression SSIS : indiquer comme valeur en dur : file
  2. TimeStamp : variable créée avec une expression pour générer de manière dynamique un Timestamp, sa formule est la suivante :
"" + LEFT( REPLACE( REPLACE( REPLACE( (DT_WSTR,30) GETDATE(), "-", ""), ":", ""), " ", ""), 15) 
Créer 2 variables SSIS pour gérer le nom des fichiers textes à compresser
Créer 2 variables SSIS pour gérer le nom des fichiers textes à compresser

Configurer la boucle avec le composant Foreach File Enumerator. Ouvrir le conteneur et paramétrer comme ceci:

  1. Choisir le type : Foreach File Enumerator
  2. Indiquer le dossier de travail : C:\data
  3. Ecrire le filtre pour sélectionner les extensions CSV uniquement : *.csv
  4. Choisir l’option pour enregistrer le nom du fichier sans l’extension : Name only
Configurer le composant et la boucle SSIS sur les fichiers CSV à compresser
Configurer le composant et la boucle SSIS sur les fichiers CSV à compresser

Mapper maintenant la valeur du nom de fichier depuis la boucle vers la variable. C’est l’étape la plus importante car c’est ce lien entre la boucle et la tâche SSIS qui rend le package dynamique.

Mapper la variable SSIS FlatFilePath avec la valeur du nom de fichier
Mapper la variable SSIS FlatFilePath avec la valeur du nom de fichier

4.2 Configurer la tâche d’exécution de processus SSIS

Ouvrir ensuite la tâche SSIS pour exécuter les processus et paramétrer seulement les deux arguments comme ceci. Le champs arguments reste vide, à paramétrer à l’étape suivante.

  1. Executable : C:\Program Files\7-Zip\7z.exe
  2. WorkingDirectory : C:\data
Configurer la tâche SSIS sans les arguments de compression gérés de façon dynamique
Configurer la tâche SSIS sans les arguments de compression gérés de façon dynamique

Ensuite, depuis l’onglet Expressions, sélectionner arguments dans la liste déroulante et renseigner cette formule. La formule indique ainsi que chaque fichier détecté est compressé dans une archive zip avec le même nom que le fichier original. Customers_Data_1.csv devient donc Customers_Data_1.zip.

" a " + @[User::FlatFilePath] + ".zip " + @[User::FlatFilePath] + ".csv"
Construire l'expression Arguments avec la variable du nom de fichier
Construire l’expression Arguments avec la variable du nom de fichier

4.3 Exécuter le package pour compresser les fichiers

Exécuter enfin le package pour compresser chaque fichier dans une archive ZIP.

Exécuter le package SSIS pour compresser chaque fichier dans une archive avec le même nom
Exécuter le package SSIS pour compresser chaque fichier dans une archive avec le même nom

Le résultat après compression est donc un fichier ZIP pour chaque fichier texte présent dans le dossier.

Résultat du package SSIS
Résultat du package SSIS

5. Compresser des fichiers et ajouter la date au nom de fichier

D’autre part, pour compresser les mêmes fichiers et changer le nom avec la date du jour et l’heure, utiliser maintenant la deuxième variable. Editer à nouveau l’expression Arguments de la tâche et ajouter simplement la variable TimeStamp dynamique comme suit pour ajouter le suffixe :

" a " + @[User::FlatFilePath] + @[User::TimeStamp] + ".zip " + @[User::FlatFilePath] + ".csv"
Utiliser une expression dynamique SSIS pour ajouter la date et l'eheure au fichier ZIP
Utiliser une expression dynamique SSIS pour ajouter la date et l’heure au fichier ZIP

Le résultat après une deuxième exécution du package est le suivant, par exemple le fichier Customers_Data_1.csv est compressé dans l’archive Customers_Data_1_20221018_104229.zip. Le format utilisé est le format de date AAAAMMJJ_HHMMSS.

Archives zip avec la date du jour et l'heure générées par SSIS et 7-zip
Archives zip avec la date du jour et l’heure générées par SSIS et 7-zip

6. Afficher la liste de toutes les options 7zip

De plus, la liste complète des commandes ainsi que les options de 7z est disponible en ligne de commande. Pour cela, taper 7z-h à intérieur d’une fenêtre MS-DOS. Voici donc la liste de toutes les options 7zip.

7z-h

Conclusion sur la compression de fichiers avec SSIS

En conclusion, ce tutoriel explique comment compresser des fichiers au format ZIP avec SSIS, Visual Studio et 7zip appelé en ligne de commande. D’autres options sont aussi possibles comme stocker les noms des dossiers dans des variables. Il est aussi possible de gérer et déployer les packages SSIS en ligne de commande.

Déployer un package SSIS en cmd avec la commande dtutil

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *