# Erreur -39 fin de fichier



## titigrou (8 Octobre 2016)

Hello,

J'ai sollicité de l'aide hier pour un script pour lire le contenu d'un fichier texte et le stocker dans une variable.
Pas de problèmes jusque là, sauf que j'ai une superbe erreur lorsque je lance le script.


```
error "Erreur de fin de fichier." number -39 from file "Macintosh HD:Users:Antoine:Desktop:Programme:toto.txt"
```

Le fichier existe bien, il contient une ligne, j'ai bien fait un glisser déposer dans la fenêtre pour avoir le bon path.

J'ai essayé beaucoup de forums, mais en vain.
Voilà le code

```
set chemin_vers_le_fichier to "/Users/Antoine/Desktop/Programme/toto.txt"
open for access chemin_vers_le_fichier
set vartoto to read chemin_vers_le_fichier as string
close access chemin_vers_le_fichier
display dialog vartoto -- pour voir ta variable vartoto
```

Si quelqu'un a une idée...

Merci d'avance 

Antoine


----------



## zeltron54 (8 Octobre 2016)

Bonjour,

As-tu essayé avec un autre fichier, car il s'agit d'une erreur dans ton fichier "toto.txt".

Sinon: Quel est ta version OS et Applescript ?, et peux tu transmettres ton fichier toto.txt que je puisse faire un essai avec ton fichier?


----------



## titigrou (8 Octobre 2016)

Je suis en Applescript 2.5 sous El Capitan.
J'ai essayé avec un autre fichier oui, en le recréant aussi.
Je peux pas mettre un .txt en pièce jointe, du coup je l'ai uploader ici
http://nowhere.lu/macg/
Dis moi si ça marche...


----------



## zeltron54 (8 Octobre 2016)

Avec ton fichier cela fonctionne.

Mais sous ElCapitan ma version AppleScript est la 2.8.1 (183.1)

Donc tu dois mettre à jour ton "Editeur de script".


----------



## titigrou (8 Octobre 2016)

J'ai Version 2.8.1
Applescript 2.5 dans la fenêtre d'information, donc potentiellement on a la même version!


----------



## zeltron54 (8 Octobre 2016)

Tu devrais essayer sur une autre session pour vérifier si c'est un problème général ou dans ta session .


----------



## titigrou (8 Octobre 2016)

Je teste ça oui


----------



## titigrou (8 Octobre 2016)

Je viens d'essayer sur le macbook, ça marche...
Alors par contre j'ai une autre question, toujours par rapport à la lecture.
Mon fichier fait 10 lignes.
J'aimerai que:
La première ligne soit stockée dans la variable Vartoto1
La deuxième ligne soit stockée dans la variable Vartoto2
Les lignes 3 à 10 soient stockées dans la variable Vartoto3

C'est possible du coup?


----------



## r e m y (8 Octobre 2016)

Ca fonctionne parfaitement chez moi...


----------



## titigrou (8 Octobre 2016)

Je vais essayer sur une nouvelle session sur l'iMac.
Tu as une idée pour la seconde question pour la lecture par lignes?


----------



## r e m y (8 Octobre 2016)

titigrou a dit:


> Tu as une idée pour la seconde question pour la lecture par lignes?


Il faudrait détecter les caractères de "fin de ligne", mais je ne connais pas suffisamment AppleScript pour t'aider.

Regarde cette page par exemple: http://www.legallou.com/Mac/ASS/TutoML/ML720.html


----------



## zeltron54 (8 Octobre 2016)

Comme expliqué dans le lien de "remy" tu utilises un délimiters (dans ton cas un caractère 13 retour chariot) pour découper ta variable en une liste de X éléments (les lignes), puis tu récupères chaque éléments avec une boucle ou par un item.


----------



## titigrou (8 Octobre 2016)

Hum j'avoue que c'est un peu complexe le site là... Je bloque dès le départ!

```
try
    set monFichier to "/Users/Dev/Desktop/TESTLECTURE/toto.txt"
    open for access monFichier
    set tout_le_fichier to the result
    close access monFichier
on error
    display dialog "Erreur sur le fichier entré"
    close access monFichier -- Ne pas oublier de fermer le fichier
end try
display dialog tout_le_fichier
```

mais le display dialog me renvoie des valeurs aléatoires, genre 151, 157
Alors que le fichier contient "Bonjour antoine comment ça va?" (désolé pour l'imagination!).


----------



## zeltron54 (8 Octobre 2016)

Pour récupérer la ligne 1, puis la ligne 2 puis le reste dans des variables.

set monFichier to "/Users/Antoine/Desktop/Programme/toto.txt"
open for access monFichier
set vartoto to read monFichier
close access monFichier

display dialog vartoto -- affiche la variable texte integral du fichier

set NB to count of paragraph of vartoto --récupère le nombre de lignes

set vartoto1 to paragraph 1 of vartoto as string -- récupère la ligne 1
set vartoto2 to paragraph 2 of vartoto as string --récuoère la ligne 2
set vartoto3 to paragraphs 3 thru NB of vartoto as string --récupère de la ligne 3 à la fin du fichier

-- affiche les 3 variables pour contrôle
display dialog vartoto1
display dialog vartoto2
display dialog vartoto3

Chez moi ce script fonctionne. j'ai mis les commentaires et à la fin un affichage des 3 variables.
Plus qu'a l'adapter à tes besoins.


----------



## titigrou (8 Octobre 2016)

Oh génial ça marche! Merci beaucoup!!
C'est chouette ça!
J'essaye de complexifier un peu le truc, avec un fichier qui ressemble à ça

```
Theoreme #1
Importance: +++
Il n’existe pas de nombres entiers non nuls x, y, z tels que:
x^n + y^n = z^n
dès que n est une entier strictement supérieur à 2
#### Fin du théorème ####
Theoreme #2
Importance: +++
Théorème d’Abel
Il n'existe pas de formule générale exprimant les solutions de l'équation du cinquième degré sous forme de radicaux.
#### Fin du théorème ####
Theoreme #3
Importance: +++
Théorème de Bezout
Soient a et b deux entiers relatifs
a et b sont premiers entre eux si et seulement si il existe deux entiers relatifs tels que
ax+by=1
#### Fin du théorème ####
```
et en fait j'aimerai que ça écrive d'abord dans
Var1 La ligne Théorème 1
Var 2 L'importance
Var 3 Le reste jusqu'à la ligne avant #### Fin du théorème ####

Et après la même chose pour le théorème 2 et 3, toujours dans Var 1, Var 2 et Var 3 (que on affichera du coup entre chaque théorème).
Je pensais faire quelque chose du genre je mets sur une ligne le nombre de lignes totales de mon ensemble théorème, mais il doit y avoir moyen de faire un STOP dès que on voit #### Fin du théorème #### j'imagine?


----------



## zeltron54 (8 Octobre 2016)

Si ce texte est fixe et définitif et donc n' évoluera plus, il suffit de compter le nombre de lignes et de le mettre dans le script qui récupère la variable.
Si par contre il doit évoluer dans le nombre de lignes, il faut récupérer à l'aide d'un délimiteurs ( #### Fin du théorème ####) par exemple chaque théorème dans une variable, puis traiter ces variables exactement dans le script actuel.


----------



## titigrou (8 Octobre 2016)

Oui ça peut évoluer car les théorèmes n'ont pas le même nombre de lignes!
Du coup en gros il faudrait un truc du genre
Boucle
Lire ligne 1
Lire ligne 2
Lire ligne 3 à Ligne #### -1
Fin boucle
et ça pour tous les théorèmes
Mais c'est cette histoire de délimiter je vois pas trop comment la gérer


----------



## zeltron54 (8 Octobre 2016)

Tous les théorèmes n'ont pas le même nombres de lignes, mais une fois écrit, il resteront tel quel.
un exemple qui t'écrit le théorème #1 de ton exemple de texte mis dans le fichier toto.txt:

set monFichier to "/Users/Antoine/Desktop/Programme/toto.txt"
open for access monFichier
set vartoto to read monFichier
close access monFichier

display dialog vartoto -- affiche la variable texte integral du fichier

set CR to (ASCII character 13) -- initialise la variable CR avec un retour chariot.

set vartoto1 to paragraph 1 of vartoto as string -- récupère la ligne 1
set vartoto2 to paragraph 2 of vartoto as string --récupère la ligne 2
set vartoto3 to paragraph 3 of vartoto & CR & paragraph 4 of vartoto & CR & paragraph 5 of vartoto as string --récupère de la ligne 3 à la ligne 5 du fichier

-- affiche les 3 variables pour contrôle
display dialog vartoto1
display dialog vartoto2
display dialog vartoto3


Edit: pour une initialisation à l'utilisation des délimiteurs voir la: http://jacquotdion.tripod.com/texte/textitemdelimit.html


----------



## titigrou (8 Octobre 2016)

Je viens d'essayer ton code avec le fichier contenant les théorèmes, le premier Display Dialog m'affiche hT et ensuite ça plante en disant

```
error "Impossible de convertir paragraph 2 of \"hT\" en type string." number -1700 from paragraph 2 of "hT" to string
```


----------



## zeltron54 (8 Octobre 2016)

Chez moi je viens de le refaire : pas de problème.
D' ou provient ton hT  ??? : la première partie du code n'a pas changé depuis le début !
Revérifie tout ...


----------



## titigrou (8 Octobre 2016)

Bah écoute je viens de tester à nouveau sur le macbook et ça marche... Je comprends vraiment pas pourquoi sur l'imac ça ne veut pas fonctionner...
Alors après, pour la lecture en boucle et la délimitation, j'avoue avoir un peu de mal à voir...


----------



## titigrou (8 Octobre 2016)

Pour la boucle, j'ai fait un truc comme ça

```
set x to 5
set y to 3
repeat until x = y
    set vartoto3 to paragraph y of vartoto & CR
    set y to y + 1
end repeat
```
Après ça implique que tous mes théorèmes aient le même nombre de lignes aussi...


----------



## zeltron54 (8 Octobre 2016)

Pour pouvoir t'aider, j'aurais besoin de connaître le contenu de ton fichier texte et de comprendre la finalité de ton script.
Il va faire quoi de ces variables ? ou et comment ?
Quel est le but de ce script ?
Il récupère ce qu'il y a dans le fichier, il le découpe etc... mais pour en faire quoi ?


----------



## titigrou (8 Octobre 2016)

En gros, mon fichier toto.txt va contenir des données de livres, organisées comme ceci
Ligne 1: Titre du livre numéro 1
Ligne 2: Prix du livre numéro 1
Ligne 3 à n: Résumé du livre numéro 1

Ligne n+1: ######
Ligne n+2: Titre du livre numéro 2
Ligne n+3: Prix du livre numéro 2
etc etc etc

La finalité étant de lancer le script pour copier le contenu de chaque livre dans un fichier unique.
Fichier 1: les infos du livre 1.
Fichier 2: les infos du livre 2.
Fichier p les infos du livre p.

le but étant de générer au final un fichier xml par livre, mais cette partie là je vais gérer, j'ai juste besoin de débrouiller la partie applescript.

Je te mets en exemple de toto.txt là (mes derniers livres en cours de lecture).


```
1Q84 Tome 1
10 Euros
Résumé du livre:
Au Japon, en 1984.
C'est l'histoire de deux mondes, celui réel de 1984 et un monde parallèle tout aussi vivant, celui de 1Q84. Deux mondes imbriqués dans lesquels évoluent, en alternance, Aomamé et Tengo, 29 ans tous deux, qui ont fréquenté la même école lorsqu'ils avaient dix ans.
############
1Q84 Tome 2
12 Euros
Résumé du livre:
Les choses qui restent enfermées dans notre coeur n'existent pas en ce monde. Mais c'est dans notre coeur, ce monde à part, qu'elles se construisent pour y vivre.
Le Livre 1 a révélé l'existence du monde 1Q84.
Certaines questions ont trouvé leur réponse.
D'autres subsistent : qui sont les Little People ? Comment se fraient-ils un chemin vers le monde réel ? Pourquoi deux lunes dans le ciel ?
############
1Q84 Tome 3
15 Euros
Résumé du livre:
Ils ne le savaient pas alors, mais c'était là l'unique lieu parfait en ce monde. Un lieu totalement isolé et le seul pourtant à n'être pas aux couleurs de la solitude.
Le Livre 3 fait entendre une nouvelle voix, celle d'Ushikawa.
Et pose d'autres questions : quel est ce père qui sans cesse revient frapper à notre porte ? La réalité est-elle jamais véritable ? Et le temps, cette illusion, à jamais perdu ?
```


----------



## zeltron54 (8 Octobre 2016)

Je comprend mieux.
Mais alors quel intérêt de séparer les lignes, pourquoi ne pas copier directement ce qu'il y a entre chaque "############" pour en faire un fichier?


Ce simple script devrait faire l'affaire:

set monFichier to "/Users/Antoine/Desktop/Fichier_test_roman.txt"
open for access monFichier
set vartoto to read monFichier
close access monFichier

display dialog vartoto -- affiche la variable texte integral du fichier



set AppleScript's text item delimiters to "############" -- défini la fin d'un livre
set NBLivre to (count of text item of vartoto) as string -- défini le nombre de livres

display dialog NBLivre -- affiche le nombre de livres trouvés


repeat with j from 1 to NBLivre

   set lelivre to text item j of vartoto as string

   display dialog lelivre -- affiche chaque livre

end repeat

Dis moi ce qui ne te conviens pas.


----------



## titigrou (8 Octobre 2016)

Pour la mise en forme après.
Tu veux dire faire un copier en Apple script? Mais dans tous les cas il faudra délimiter.


----------



## zeltron54 (8 Octobre 2016)

Je viens d'éditer essai le script pour voir !


----------



## titigrou (8 Octobre 2016)

Je viens de voir! C'est presque ça, il manque juste le fait que il me faudrait dans une variable Var1 le titre, dans Var2 le prix et Var3 le résumé.


----------



## zeltron54 (8 Octobre 2016)

OK essai avec celui là.

set monFichier to "/Users/Antoine/Desktop/Fichier_test_roman.txt"
open for access monFichier
set vartoto to read monFichier
close access monFichier

display dialog vartoto -- affiche la variable texte integral du fichier

set CR to (ASCII character 13) -- initialise la variable CR avec un retour chariot.


set AppleScript's text item delimiters to "############"
set NBLivre to (count of text item of vartoto) as string

display dialog NBLivre -- affiche le nombre de livres


repeat with j from 1 to NBLivre

   set vartoto1 to ""
   set vartoto2 to ""
   set vartoto3 to ""
   set lelivre to text item j of vartoto as string
   set NB to count of paragraph of lelivre --récupère le nombre de lignes


   set ligne1 to 1
   set ligne2 to 2
   set ligne3 to 3
   if j > 1 then
       set ligne1 to 2
       set ligne2 to 3
       set ligne3 to 4
   end if
   set vartoto1 to paragraph ligne1 of lelivre as string -- récupère la ligne 1
   set vartoto2 to paragraph ligne2 of lelivre as string --récupère la ligne 2

   repeat with i from ligne3 to NB
       set varligne to paragraph i of lelivre as string --récupère de la ligne 3 à la ligne x du fichier
       set vartoto3 to vartoto3 & CR & varligne
   end repeat

   -- affiche les 3 variables pour contrôle
   display dialog vartoto1
   display dialog vartoto2
   display dialog vartoto3
end repeat

Chez moi ça fonctionne...


----------



## titigrou (8 Octobre 2016)

Hummm, si tu étais pas loin de chez moi, je te dirai "Viens manger un welsh et boire une bière!"
Merci infiniment, ça semble marcher du tonnerre! Je vais essayer de comprendre le code intégralement, ça fera un bon exercice!


----------



## zeltron54 (8 Octobre 2016)

Content pour toi que cela te convienne.
As-tu réussi à faire fonctionner ton Imac, as-tu fais un essai sur une autre session, éventuellement une toute neuve créé pour le besoin et à effacer après.
Si ça fonctionne sur une autre session il faudra peut être virer le Plist de ta session qui se trouve dans "/users/antoine/library/preferences/com.apple.applescript.plist"


----------



## zeltron54 (9 Octobre 2016)

Je te remets le code avec tous les commentaires qui te permettront de mieux comprendre et de pouvoir le modifier à ta convenance.

set monFichier to "/Users/Antoine/Desktop/Fichier_test_roman.txt" -- récupère le chemin du fichier
open for access monFichier -- ouvre ce fichier en lecture
set vartoto to read monFichier -- lit le fichier et le met dans la variable vartoto
close access monFichier -- ferme le fichier

display dialog vartoto -- affiche la variable texte integral du fichier

set CR to (ASCII character 13) -- initialise la variable CR avec un retour chariot.
set AppleScript's text item delimiters to "############
" -- défini le délimiteur de fin de livre avec 12 # + 1 retour chariot

set NBLivre to (count of text item of vartoto) -- compte le nombre de livres trouvé

display dialog NBLivre -- affiche le nombre de livres

repeat with j from 1 to NBLivre -- boucle avec nombre de livre dans j
   -- met les 3 variables à vide
   set vartoto1 to ""
   set vartoto2 to ""
   set vartoto3 to ""

   set lelivre to text item j of vartoto as string -- récupère la totalité du livre j dans la variable
   set NB to count of paragraph of lelivre --récupère le nombre de lignes du livre j

   set vartoto1 to paragraph 1 of lelivre as string -- récupère la ligne 1
   set vartoto2 to paragraph 2 of lelivre as string --récupère la ligne 2

   repeat with i from 3 to NB -- boucle avec le nombre de ligne du livre dans la variable i de la troisième à la fin
       set varligne to paragraph i of lelivre as string --récupère de la ligne 3 à la ligne x du livre j en remettant les retours chariot de fin de ligne
       set vartoto3 to vartoto3 & CR & varligne -- reconstruit la variable vartoto3
   end repeat

   -- affiche les 3 variables pour contrôle
   display dialog vartoto1
   display dialog vartoto2
   display dialog vartoto3
end repeat

bon courage.


----------



## titigrou (23 Octobre 2016)

Hello!
Désolé pour le retard de réponse!
Merci infiniment, tout marche nickel!!


----------



## titigrou (24 Octobre 2016)

Hello (again!)

Je reviens vers toi car j'ai une dernière petite question pour le code sur lequel tu m'avais bien aidé!
En fait j'aimerai que à la fin du traitement que ça m'envoie un mail résumé.
J'ai trouvé comment faire, mais le problème c'est que ça m'envoie 3 mails (il y a 3 livres dans le fichier d'entrée).
J'aimerai que ça en fasse un seul avec les 3 livres dans le même mail, sur 3 lignes séparées.
Je te mets le code que j'utilise pour le tout!
Le titre du livre est dans vartoto1.


```
set monFichier to "/Users/Antoine/Desktop/Programme LBC Local/Livres.txt"
open for access monFichier -- ouvre ce fichier en lecture
set vartoto to read monFichier -- lit le fichier et le met dans la variable vartoto
close access monFichier -- ferme le fichier

--display dialog vartoto -- affiche la variable texte integral du fichier

set CR to (ASCII character 13) -- initialise la variable CR avec un retour chariot.
set AppleScript's text item delimiters to "############
" -- défini le délimiteur de fin de livre avec 12 # + 1 retour chariot

set NBLivre to (count of text item of vartoto) -- compte le nombre de livres trouvé

--display dialog NBLivre -- affiche le nombre de livres

repeat with j from 1 to NBLivre -- boucle avec nombre de livre dans j
    -- met les 3 variables à vide
    set vartoto1 to ""
    set vartoto2 to ""
    set vartoto3 to ""
   
    set lelivre to text item j of vartoto as string -- récupère la totalité du livre j dans la variable
    set NB to count of paragraph of lelivre --récupère le nombre de lignes du livre j
   
    set vartoto1 to paragraph 1 of lelivre as string -- récupère la ligne 1
    set vartoto2 to paragraph 2 of lelivre as string --récupère la ligne 2
   
    repeat with i from 3 to NB -- boucle avec le nombre de ligne du livre dans la variable i de la troisième à la fin
        set varligne to paragraph i of lelivre as string --récupère de la ligne 3 à la ligne x du livre j en remettant les retours chariot de fin de ligne
        set vartoto3 to vartoto3 & CR & varligne -- reconstruit la variable vartoto3
    end repeat

    set Message_1 to "Bonjour,

Les fiches suivantes ont été crées:
    
     "
    set Message_2 to vartoto1
    tell application "Mail"
       
        set myDate to date string of (current date)
        set myTime to time string of (current date)
       
        set theSubject to "Créations de fiches livres"
        set theAddress to "steeve.jobs@apple.com" -- the receiver
        set theSignatureName to "Sig" -- the signature name
       
       
        set LeMessage to make new outgoing message with properties {visible:true, subject:theSubject, content:Message_1 & " " & Message_2 & " " & myDate & " à " & myTime & "."}
       
       
       
        tell LeMessage to make new to recipient at end of every to recipient with properties {address:theAddress}
       
        set message signature of LeMessage to signature theSignatureName
       
        --send LeMessage
    end tell
   
   
end repeat
```

Merci encore pour ton aide!
Antoine


----------



## zeltron54 (24 Octobre 2016)

Bonsoir,
Il te faut construire ton message dans une variable  envoi l'envoi.

1- Tu initialises la variable MessageEntier à 
"Bonjour,

Les fiches suivantes ont été crées:

     "
" au début du script

2- tu mets: juste avant Tell application mail

set MessageEntier to MessageEntier & Message_2 & CR
End repeat

3- tu modifies:
set LeMessage to make new outgoing message with properties {visible:true, subject:theSubject, content:Message_1 & " " & Message_2 & " " & myDate & " à " & myTime & "."}
en
set LeMessage to make new outgoing message with properties {visible:true, subject:theSubject, content:MessageMessageEntier & " " & myDate & " à " & myTime & "."}

4- Tu supprimes le End repeat de la fin.



tu devrais obtenir ça:

set monFichier to "/Users/Antoine/Desktop/Programme LBC Local/Livres.txt"
open for access monFichier -- ouvre ce fichier en lecture
set vartoto to read monFichier -- lit le fichier et le met dans la variable vartoto
close access monFichier -- ferme le fichier

--display dialog vartoto -- affiche la variable texte integral du fichier

Set MessageEntier to "Bonjour,

Les fiches suivantes ont été crées:

     "

set CR to (ASCII character 13) -- initialise la variable CR avec un retour chariot.
set AppleScript's text item delimiters to "############
" -- défini le délimiteur de fin de livre avec 12 # + 1 retour chariot

set NBLivre to (count of text item of vartoto) -- compte le nombre de livres trouvé

--display dialog NBLivre -- affiche le nombre de livres

repeat with j from 1 to NBLivre -- boucle avec nombre de livre dans j
    -- met les 3 variables à vide
    set vartoto1 to ""
    set vartoto2 to ""
    set vartoto3 to ""

    set lelivre to text item j of vartoto as string -- récupère la totalité du livre j dans la variable
    set NB to count of paragraph of lelivre --récupère le nombre de lignes du livre j

    set vartoto1 to paragraph 1 of lelivre as string -- récupère la ligne 1
    set vartoto2 to paragraph 2 of lelivre as string --récupère la ligne 2

    repeat with i from 3 to NB -- boucle avec le nombre de ligne du livre dans la variable i de la troisième à la fin
        set varligne to paragraph i of lelivre as string --récupère de la ligne 3 à la ligne x du livre j en remettant les retours chariot de fin de ligne
        set vartoto3 to vartoto3 & CR & varligne -- reconstruit la variable vartoto3
    end repeat

    set Message_2 to vartoto1
set MessageEntier to MessageEntier & Message_2 & CR
End repeat

    tell application "Mail"

        set myDate to date string of (current date)
        set myTime to time string of (current date)

        set theSubject to "Créations de fiches livres"
        set theAddress to "steeve.jobs@apple.com" -- the receiver
        set theSignatureName to "Sig" -- the signature name


        set LeMessage to make new outgoing message with properties {visible:true, subject:theSubject, content:MessageEntier & " " & myDate & " à " & myTime & "."}



        tell LeMessage to make new to recipient at end of every to recipient with properties {address:theAddress}

        set message signature of LeMessage to signature theSignatureName

        --send LeMessage
    end tell


----------



## titigrou (25 Octobre 2016)

Nickel, ça marche du tonnerre! Merci encore!


----------



## zeltron54 (25 Octobre 2016)

Content pour toi !


----------

