Bonjour,
Je viens de m'inscrire à cette liste, vu que je m'intéresse à Squeak depuis un moment, mais ce n'est que récemment que j'arrive à trouver un peu de temps pour enfin mettre les mains dedans.
Là je débute vraiment en Smalltalk, et il y a quelque-chose que je ne comprend pas dans mon script (dans un Workspace) : En fait c'est pour récupérer des infos d'un fichier .CSV dans un dictionnaire, et s'il y a doublon de la clé, on additionne la nouvelle valeur à l'ancienne au lieu de créer deux éléments. A un moment j'utilise un asSymbol pour transformer une string du CSV pour faire la clé. Seulement dans certain cas, 'toto' devient #'toto' au lieu de #toto, et dans d'autres j'ai bien #toto... Là j'avoue que je ne comprends pas pourquoi... Quelqu'un a-t-il une idée ?
Je ne sais pas si je me suis exprimé assez clairement, donc voici ci-après le contenu de mon CSV de test, et le code dans le Workspace.
Cordialement,
Frédéric
---- test.csv ---- toto,12,a machin,30,b toto,3,c
---- workspace ---- | f ligne donneesLigne assoc cle valeur ancienneValeur | assoc := Dictionary new. Transcript clear. f := FileStream oldFileNamed: 'test.csv'. [(ligne := f nextLine) notNil] whileTrue: [ donneesLigne := ligne csvSubstrings. cle := (donneesLigne at: 1) asSymbol. Transcript show: cle;cr. Transcript show: donneesLigne;cr. valeur := (donneesLigne at: 2) asInteger. (assoc includesKey: cle) ifFalse: [ assoc add: (cle->valeur)] ifTrue: [ Transcript show: 'on ajoute';cr. ancienneValeur := assoc at: cle. assoc at: cle put: (ancienneValeur + valeur)] ]. f close. Transcript show: assoc ; cr. assoc inspect.
Le 05/07/07, fbeudaert@altern.orgfbeudaert@altern.org a écrit :
Bonjour,
Bonjour,
Je viens de m'inscrire à cette liste, vu que je m'intéresse à Squeak depuis un moment, mais ce n'est que récemment que j'arrive à trouver un peu de temps pour enfin mettre les mains dedans.
Bienvenue alors :-).
Là je débute vraiment en Smalltalk, et il y a quelque-chose que je ne comprend pas dans mon script (dans un Workspace) : En fait c'est pour récupérer des infos d'un fichier .CSV dans un dictionnaire, et s'il y a doublon de la clé, on additionne la nouvelle valeur à l'ancienne au lieu de créer deux éléments. A un moment j'utilise un asSymbol pour transformer une string du CSV pour faire la clé. Seulement dans certain cas, 'toto' devient #'toto' au lieu de #toto, et dans d'autres j'ai bien #toto... Là j'avoue que je ne comprends pas pourquoi... Quelqu'un a-t-il une idée ?
Quand on obtient #'une chaine', c'est qu'il y a sûrement un espace ou un caractère non alphanumérique dans la chaîne.
'toto ' asSymbol --> #'toto ' 'toto' asSymbol --> #toto
Le script me paraît correct, mais tu ne dis pas ce que fait la commande #csvSubstrings exactement et comment elle le fait. Autre chose, on n'ajoute pas dans un dictionnaire avec #add:, mais uniquement avec #at:put:.
Salut
Pour lire dans les fichier tu peux faire FileStream oldFileNamed: fileName do: [ ... ]
Cela t'evite de faire f close.
Tu devrais plutot nomé ton dictionaire 'dict' assoc fait plus penser a une seul association.
tu peux utilisé #at:ifAbsent:
dict at: key put: (dict at: key ifAbsent:[0]) + value
Aussi tu n'as pas besoin de Transcript>>show:. Il est souvant plus facile d'utiliser le debugger. En squeak on a un tres bon debugger. Tu peus inspecter tres facilement toutes les variables et compiler du code a la voler. Donc c'est plus dinamic que les autres langage. C'est tres rare que les gens utilise le Transcript pour debugger.
Tu peux utiliser la method #halt qui est l'équivalant d'un breakpoint.
On Jul 5, 2007, at 7:14 PM, fbeudaert@altern.org wrote:
| f ligne donneesLigne assoc cle valeur ancienneValeur | assoc := Dictionary new. Transcript clear. f := FileStream oldFileNamed: 'test.csv'. [(ligne := f nextLine) notNil] whileTrue: [ donneesLigne := ligne csvSubstrings. cle := (donneesLigne at: 1) asSymbol. Transcript show: cle;cr. Transcript show: donneesLigne;cr. valeur := (donneesLigne at: 2) asInteger. (assoc includesKey: cle) ifFalse: [ assoc add: (cle->valeur)] ifTrue: [ Transcript show: 'on ajoute';cr. ancienneValeur := assoc at: cle. assoc at: cle put: (ancienneValeur + valeur)] ]. f close. Transcript show: assoc ; cr. assoc inspect.
fbeudaert@altern.org a écrit :
A un moment j'utilise un asSymbol pour transformer une string du CSV pour faire la clé. Seulement dans certain cas, 'toto' devient #'toto' au lieu de #toto, et dans d'autres j'ai bien #toto... Là j'avoue que je ne
Rien à voir avec ton problème, mais sais tu que ta clé peut-être n'importe quel objet qui comprend les messages hash et =. Ainsi tu peux prendre pour ta clé directement une chaîne comme 'toto'. MLais ça peut-être bien d'autres objets...
Hilaire
squeak-fr@lists.squeakfoundation.org