# [Applescript] Lire un fichier Excell et l'exploiter



## Astronight (18 Juin 2011)

Bonjour tout le monde.

J'ai une question à vous poser: 
Comment faire pour pouvoir lire un fichier excel, (C'est un fichier .TSV) avec un applescript ? 
Et surtout comment faire pour exploiter ses données, c'est à dire par exemple, copier la case A1, puis ensuite, lire et copier la case A2 et ensuite copier les 2 dernières lettres de la case C3.

J'ai essayé de chercher sur internet, mais ma recherche a été infructueuse! 

Merci pour votre réponse!


----------



## Anonyme (18 Juin 2011)

Bonjour,

J'ai testé. sur Excel *2004*, l'encodage est (Mac Roman). et open office (j'ai sélectionné l'encodage UTF8)

Voici le script qui utilise un shell, fonctionne avec l'encodage  (Mac Roman ou  UTF8).

```
set tsvFile to quoted form of "/Users/jack/Desktop/Retail_Product_Specs2.tsv"

do shell script "/usr/bin/awk -F\"\\t\" '{if (NR<3) {print $1;}else if (NR=3) {n=length($3);print substr($3,n-1);exit;}}' RS='\\r' " & tsvFile & "| /usr/bin/sed 's/^\"//;s/\"$//;s/\"\"/\"/g'"

set {A1, B2, C3} to paragraphs of the result
--la variable A1 contient la valeur de la case A1, la variable C3 contient les deux derniers caractères de la case C3
```
remplace *RS='\\r'* par *RS='\\n'* si les fins de lignes sont Unix (fin de lignes de open office).

Tu peux enlever 
	
	



```
& "| /usr/bin/sed 's/^\"//;s/\"$//;s/\"\"/\"/g'"
```
 si le fichier TSV ne contient pas de guillemet droit *"*, mais ça ne change rien si tu ne l'enléve pas



-- Ou ce script (qui n'utilise pas de shell)

```
set tFile to (POSIX file "/Users/jack/Desktop/Retail_Product_Specs2.tsv") as alias
set tLines to (get paragraphs 1 thru 3 of (read tFile as «class utf8»))
set L to {}
set oldTid to text item delimiters
set text item delimiters to tab
try
	repeat with i from 1 to 3
		if i < 3 then -- récupère A1 et B1
			set end of L to text item 1 of (item i of tLines)
		else -- récupère C3
			set x to text item 3 of (item i of tLines)
			set end of L to text -2 thru -1 of x -- les deux derniers caractères
		end if
	end repeat
on error
	set text item delimiters to oldTid
	return
end try
set {A1, B2, C3} to L -- la variable A1 contient la valeur de la case A1
```
supprime as «class utf8» si l'encodage est (Mac Roman)
Si une de ces cases (*A1*, *B1* ou *C3*) contient  des guillemets droit, il faut  modifier ce script, sinon ils seront protégés par d'autres guillemets droit.

Ces scripts ne fonctionnent pas correctement, si une case contient une fin de ligne (une cellule qui contient *deux lignes ou plus*))


----------



## Astronight (18 Juin 2011)

Tout d'abord merci!
Mais Oui, voila J'ai le problème que vous évoquiez en dernière ligne.

si je met 

```
repeat with i from 1 to 1
```

Cela marche, j'arrive à récuperer la case.

Mais si je fait 

```
repeat with i from 1 to 2 (ou plus)
```
J'ai un probleme et j'obtiens sur Applescript le message d'erreur suivant:
Il est impossible de rendre {"X", "Y"} en type string.


----------



## Anonyme (18 Juin 2011)

Astronight a dit:


> Mais Oui, voila J'ai le problème que vous évoquiez en dernière ligne.


Est-ce que tu veux dire que tu as des cellules qui contiennent plus qu'une ligne ?
Si oui :
 -- Est-ce que ce fichier contiendra toujours le même nombre de colonnes (nombre de tab par rangée) ?
-- Si c'est un gros fichier, quel est son poids ?




Astronight a dit:


> J'ai un probleme et j'obtiens sur Applescript le message d'erreur suivant:
> Il est impossible de rendre {"X", "Y"} en type string.


Je ne comprends pas l'erreur. {"X", "Y"} en type string.

Le plus simple sera que tu me donnes ton fichier TSV (seulement  les 3 premières rangées) dans un ZIP pour que je le  teste.

*Edition : *
j'ai tester avec une cellule qui contient plus qu'une ligne, je n'ai pas cette erreur.
les valeurs ne sont pas les bonnes ou une de ces erreurs selon le cas  
*"Il est impossible d&#8217;obtenir text 1 thru -1 of \"\"."*
*"Il est impossible d&#8217;obtenir text item 3 of ....*"

Donc, est-ce que tu as ajouté d'autres lignes de code dans le script ?


----------



## Astronight (19 Juin 2011)

Oui, Voila un extrait du .tsv!

Sinon, non j'ai utilisé tel quel votre script sans Shell.
Je n'ai pas réussi à comprendre l'autre ^^'


----------



## Anonyme (19 Juin 2011)

Bonjour,

Ça fonctionne sans erreur ici avec  ou sans "*as «class utf8»*".
le résultat est 
	
	



```
{"Chuck.4.01.avi", "Chuck.4.02.avi", "ml"}
```
 As-tu essayé sans  "*as «class utf8»*" ?

Cela ne m'aide pas à comprendre  où est l'erreur, il n'y a pas de "*x*" et de "*Y*" dans ce fichier.

Exécute ce script dans l'éditeur sur le fichier  "Extrait.tsv", donne moi l'erreur dans la partie *résultat*.

```
set tFile to (POSIX file "/Users/jack/Desktop/Extrait.tsv") as alias

set tLines to (get paragraphs 1 thru 3 of (read tFile as «class utf8»))
set L to {}
set oldTid to text item delimiters
set text item delimiters to tab
try
	repeat with i from 1 to 3
		if i < 3 then -- récupère A1 et B1
			set end of L to text item 1 of (item i of tLines)
		else -- récupère C3
			set x to text item 3 of (item i of tLines)
			set end of L to text -2 thru -1 of x -- les deux derniers caractères
		end if
	end repeat
on error err
	set text item delimiters to oldTid
	return err
end try
set {A1, B2, C3} to L -- la variable A1 contient la valeur de la case A1
```
Fait la même chose sans  "*as «class utf8»*"


Edition :
Est ce que le script avec "do shell script "*/usr/bin/awk*" fonctionne correctement ?


----------



## Astronight (19 Juin 2011)

Mac_Jac a dit:


> Bonjour,
> 
> Ça fonctionne sans erreur ici avec  ou sans "*as «class utf8»*".
> le résultat est
> ...





Ah oui, Effectivement, votre script marche bien, je viens de me rendre compte du probleme.. En faite mon script était 

```
set tFile to (POSIX file "/Users/Astronight/Desktop/extrait.tsv") as alias

set tLines to (get paragraphs 1 thru 3 of (read tFile as «class utf8»))
set L to {}
set oldTid to text item delimiters
set text item delimiters to tab
try
	repeat with i from 1 to 3
		if i < 3 then -- récupère A1 et B1
			set end of L to text item 1 of (item i of tLines)
		else -- récupère C3
			set x to text item 3 of (item i of tLines)
			set end of L to text -2 thru -1 of x -- les deux derniers caractères
		end if
	end repeat
on error err
	set text item delimiters to oldTid
	return err
end try
set {A1, B2, C3} to L -- la variable A1 contient la valeur de la case A1
display dialog L
```

C'était le display dialog qui était la cause de l'erreur Il est impossible de rendre {"Chuck.4.01.avi", "Chuck.4.02.avi", "ml"} en type string.
Si je fait Display dialog A1  & B2 & C3, cela marche 

Donc merci! Maintenant, le script marche parfaitement, je peux exploiter les données!


----------



## Anonyme (19 Juin 2011)

Astronight a dit:


> Ah oui, Effectivement, votre script marche bien, je viens de me rendre compte du probleme..
> 
> C'était le display dialog qui était la cause de l'erreur Il est impossible de rendre {"Chuck.4.01.avi", "Chuck.4.02.avi", "ml"} en type string.



OK, je comprends maintenant.:rateau:


J'ai oublié de remettre la valeur du séparateur dans le script, s'il n'y avait pas d'erreur :
ajoute ceci aprés la ligne end try

```
set text item delimiters to oldTid
```

Exécute ce script pour le remettre à la valeur par défaut, car il est resté à tab.

```
set text item delimiters to ""
```


----------



## Astronight (19 Juin 2011)

Merci 
Je passe en résolu !


----------

