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 :
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
------------------------ 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.
-- 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)"
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.
Voilà, nous avons avec Exporter et Importer un BackUp personnel complet.
En téléchargement le projet MonLogiciel en version au niveau où nous en sommes du tutoriel MonLogiciel107.zip.