Home

Tutorial AppleScript Studio

Partie 7 - Sauvegarde des données (BackUp) -

Etape 2 - Importer à partir d'un fichier texte tabulé

Sous Léopard - xCode 3.0


Nous allons étudier la lecture d'un fichier texte où chaque ligne est de format : donnée, tabulation, donnée, tabulation, etc, et la fin de ligne marquée par un retour chariot CR.

Je parle de fichier de taille usuelle, et pas d'une base de données. Disons un fichier de 1000 lignes, qui met moins de deux secondes à se charger dans une application programmée avec le code qui suit.


Attention : Le fichier en entrée doit être un fichier en TEXT pur, avec un CR (Carriage Return, code 13), et pas un LF (Line Feed, code 10).
Avec le logiciel TextEdit, il faut sauver avec les options Lines Breaks Macintoch, Encoding Western (Mac OS Roman).
Prenez garde à la provenance de votre fichier, Mac, PC, Unix, qui gèrent différemment la fin de ligne. Unix, c'est un LF, Mac c'est un CR, Window pour faire simple c'est CR+LF.


Nous allons faire :

  1. Sélectionner le fichier des données dans son dossier.
  2. Lire le fichier en entier.
  3. Créer une liste des lignes.
  4. Pour chaque lignes crée une liste de ces éléments.


Sélection et lecture du fichier

try

set monFichier to chooseFile() -- Sélection du fichier à lire

-- Résultat : "iMac:Users:alg:Documents:ASSdev:InputNotes"

open for access monFichier -- Le fichier doit exister, sinon il est créé vide

read monFichier -- Lecture de la totalité du fichier

set tout_le_fichier to the result.


Il est important de noter que tout le fichier entré est lu d'un bloc et stocké dans la variable tout_le_fichier. Ceci est possible pour des fichiers de taille raisonnable, disons de au plus mille lignes. Plus grand, il serai nécessaire de faire le traitement ligne par ligne.


close access monFichier -- Ne pas oublier de fermer le fichier

Une fois ouvert, le fichier entré doit être impérativement fermé, sinon il devient inaccessible.

Il faut, donc, utiliser un bloc de commande try .... on error .... end try.


on error

display dialog "Erreur sur le fichier entré"

close access monFichier -- Ne pas oublier de fermer le fichier

end try



chooseFile()

------------------------ pop up de sélection d'un fichier -----------------------

on chooseFile() -- Résultat : iMac:Users:alg:dossier sélectionné

set defaultFolder to getHomeSites()

set withInvisibles to false

set monFichier to (choose file with prompt "Choose Folder" default location defaultFolder without invisibles and multiple selections allowed)

return monFichier

end chooseFile

on getHomeSites() -- Résultat : iMac:Users:alg:

set sitesPath to do shell script "echo $HOME/"

set sitesFolder to POSIX file sitesPath

return sitesFolder --as alias

end getHomeSites

---------------------------------------------


Le sous-programme chooseFile appelle getHomeSites, et ouvre la fenêtre habituelle de sélection des dossiers, et fichiers. Puis la commande set place le résultat dans la variable monFichier pour son utilisation dans les différentes demandes de lecture du script.


getHomeSites va rechercher le nom de votre disque dur, ajout le nom du catalogue "Users", qui est un nom standard, et en final ajoute le nom de votre dossier utilisateur. Pour moi c'est les initiales de mon nom "alg". Sachant que le nom de mon disque dur est "iMac". getHomeSites va renvoyer, pour ma configuration "iMac:Users:alg:", qui est la racine de mes dossiers personnels.


Remarque : La commande open ouvre le fichier. Ceui-ci doit exister. Cette remarque est importante si vous voulez ne pas utiliser le sous-programme chooseFile qui vous garantie que le fichier existe, mais une affectation en dur du nom de fichier, comme :
set monFichier to alias "iMac:Users:alg:Classic:Classic2.3 BackUp"

J'utilise en dur, que pendant la mise au point pour gagner du temps. Mais attention, si le fichier n'existe pas. Applescript va le créer vide, et vous allez vous étonner de ne pas trouver vos données au test suivant.

Dernier point, toujours faire l'ouverture du fichier dans un Try ... on error .... end try. Car il faut toujours fermer le fichier sinon il n'est plus accessible.





Traitement du fichier lu



-- Création de la liste de toutes les lignes (Une ligne par élément)

set applescript 's text item delimiters to (ASCII character 13) -- Carriage Return


Chaque ligne du fichier séparée par un CR est extraite et stockée dans une liste.


set toutes_les_lignes to (every text item of tout_le_fichier) as list



set applescript 's text item delimiters to "" -- Retour à la valeur normale

set tout_le_fichier to "" -- récupération de l'espace mémoire


-- Ligne par ligne extraction des éléments tabulés

repeat with une_ligne in toutes_les_lignes

set applescript 's text item delimiters to tab -- Tabulation


Chaque élément de la ligne séparé par Tab est extrait et stocké dans une liste.


set mes_colonnes to (every text item of une_ligne) as list

set applescript 's text item delimiters to "" -- Retour à la valeur normale


Ici, deux cas, soit le programme exige que tous les éléments d'une ligne soient présent, soit le programme accepte que la ligne soit incompléte. Danc ce cas il faut compter le nombre d'éléments dans la ligne, et traiter suivant ce nombre. J'ai pris cette option. Cela inclus la détection des lignes vides (Nb_elements = 1 et Nb_char = 0). Et traite di-facto une erreur clasique qui est une ligne vide en fin de fichier.


set Nb_elements to (the count of mes_colonnes)


-- Initialisation des colonnes du tableau dépendant du nombre de colonnes

if Nb_elements is equal to 1 then

-- Test d'une ligne vide (un CR seul en fin de fichier ou au milieu)

-- sinon c'est une ligne avec seulement un titre

set Nb_char to the count of characters of item 1 of mes_colonnes


if Nb_char is equal to 0 then -- Uniquement un CR

-- Rien à faire, on saute cette ligne

else

-- Un élément seul

Ici, vous placez le traitement pour un élément seul dans une ligne.


end if


Vous continuer pour 2, 3, 4, etc colonnes de données entrées. Ce qui permet d'accepter un nombre variable de colonnes en entrée.


if Nb_elements is equal to 2 then ......

if Nb_elements is equal to 3 then ......


end if


end repeat



Note 1 : par sécurité, j'ai mis une instruction "set applescript 's text item delimiters to "" -- Retour à la valeur normale" à chaque utilisation.


Note 2 :J'ai utilisé l'instruction "repeat with une_ligne in toutes_les_lignes" qui est l'équivalent de :

set Nb_de_lignes to (count of toutes_les_lignes)

+ repeat with i from 1 to Nb_de_lignes

+ "set une_ligne to (item i of toutes_les_lignes)"




Le code complet



image image

J'ai fait à la va vite dans le facile comme code. Il serait bien de faire un code général pour quelque soit le nombre de colonne.


image
Menu Léopard - Photo 10 à 14


Voilà, nous avons avec Exporter et Importer un BackUp personnel complet.




Téléchargement

En téléchargement le projet MonLogiciel en version au niveau où nous en sommes du tutoriel MonLogiciel107.zip.






La suite - La p-list existe-t-elle ? - Gestion du Bundle


Page précédente

Page suivante


Merci de votre visite


UP