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.
Table of Contents
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.
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:
- Customers_Data_1.csv
- Customers_Data_2.csv
- Customers_Data_3.csv
Aller dans le dossier contenant les fichiers CSV. Et afficher les fichiers à zipper.
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
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
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.
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 :
- Executable : C:\Program Files\7-Zip\7z.exe
- Arguments : a Customers_Zipped.zip Customers_Data_1.csv
- 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.
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
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
Le fichier Customers_Zipped.zip contient bien les 3 fichiers avec l’extension CSV présents dans le dossier source C:\data.
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.
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.
- FlatFilePath : variable utilisée depuis la boucle sur les fichiers et transmise à la tâche de compression SSIS : indiquer comme valeur en dur : file
- 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)
Configurer la boucle avec le composant Foreach File Enumerator. Ouvrir le conteneur et paramétrer comme ceci:
- Choisir le type : Foreach File Enumerator
- Indiquer le dossier de travail : C:\data
- Ecrire le filtre pour sélectionner les extensions CSV uniquement : *.csv
- Choisir l’option pour enregistrer le nom du fichier sans l’extension : Name only
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.
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.
- Executable : C:\Program Files\7-Zip\7z.exe
- WorkingDirectory : C:\data
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"
4.3 Exécuter le package pour compresser les fichiers
Exécuter enfin le package pour compresser chaque fichier dans une archive ZIP.
Le résultat après compression est donc un fichier ZIP pour chaque fichier texte présent dans le dossier.
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"
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.
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.
Soyez le premier à commenter