[Applescript] Lire un fichier Excell et l'exploiter

Astronight

Membre confirmé
12 Décembre 2010
66
1
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!
 
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).
Bloc de code:
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
Bloc de code:
& "| /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)
Bloc de code:
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))
 
Tout d'abord merci!
Mais Oui, voila J'ai le problème que vous évoquiez en dernière ligne.

si je met
Bloc de code:
repeat with i from 1 to 1

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

Mais si je fait
Bloc de code:
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.
 
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 ?


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 ?
 
Dernière édition par un modérateur:
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 ^^'
 
Bonjour,

Ça fonctionne sans erreur ici avec ou sans "as «class utf8»".
le résultat est
Bloc de code:
{"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.
Bloc de code:
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 ?
 
Dernière édition par un modérateur:
Bonjour,

Ça fonctionne sans erreur ici avec ou sans "as «class utf8»".
le résultat est
Bloc de code:
{"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.
Bloc de code:
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 ?



Ah oui, Effectivement, votre script marche bien, je viens de me rendre compte du probleme.. En faite mon script était
Bloc de code:
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!
 
Dernière édition:
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
Bloc de code:
set text item delimiters to oldTid

Exécute ce script pour le remettre à la valeur par défaut, car il est resté à tab.
Bloc de code:
set text item delimiters to ""
 
Merci ;)
Je passe en résolu !