Utilisation de la fonction SUBSTR

Signaler
Messages postés
13
Date d'inscription
vendredi 17 décembre 2004
Statut
Membre
Dernière intervention
17 février 2012
-
Messages postés
828
Date d'inscription
mardi 5 octobre 2004
Statut
Membre
Dernière intervention
7 mai 2013
-
Bonjour,
je vous prie de m'excuser par avance, mais je commence la programmation.

je testais cette fonction mais je n’arrive pas a la faire fonctionner.

var1=FOPEN('c:\test.txt',12)
SUBSTR('var1', 10, 4)
MESSAGEBOX(var1)


j'ouvre mon fichier, je lui demande de m'afficher les 4 caractères consécutifs à partir du 10 eme, mais il m'affiche "-1"
quelqu'un peu me dire ou je me suis trompé ?

merci d'avance

16 réponses

Messages postés
828
Date d'inscription
mardi 5 octobre 2004
Statut
Membre
Dernière intervention
7 mai 2013
1
Bonjour,

Attention, la fonction FOPEN ne renvoie aucune donnée, elle ouvre le fichier, c'est tout !

tu t'es trompé en mélangeant deux techniques différentes:
si tu ouvres ton fichier par une commande FOPEN, qui est une commande que nous appellons "de bas niveau" pour dire qu'elle est très proche du C++, alors tu dois continuer ton traitement avec ce type de commande (regarde dans l'aide les commandes qui débutent par la lettre F - Fopen, Fwrite, etc).

Mais à mon avis, tu n'as pas besoin de ce type de commande. il te sera beaucoup plus fcile d'ouvrir ton fichier par un FileToStr( ), qui va renvoyer le contenu du fichier dans une chaine de caractère.
Et puis, tu te trompes aussi dans l'écriture du SubStr. le nom de la variable qui contient la chaine à traiter ne doit pas être entre quotes, sinon le traitement se fera sur le nom pris comme une chaine, et pas sur le contenu. Et encore une autre erreur, cette fois dans le traitement de Var1 dans le MessageBox. Ce messageBox va afficher le contenu de Var1, pas le susbstr.
donc quelque chose du genre:
Local lcMaChaine as String
m.lcMaChaine FileToStr('C:\test.txt')
MessageBox( SubStr(m.lcMaChaine, 10 ,4))


Pense à déclarer tes variables, et en particulier leur portée. Pense aussi à préfixer les variables par un m.
(regarde dans l'aide les infos sur ces 2 sujets)

PS: par curiosité, si tu commences la programmation, pourquoi avoir choisi Visual FoxPro?
Messages postés
13
Date d'inscription
vendredi 17 décembre 2004
Statut
Membre
Dernière intervention
17 février 2012

bonjour Michel
je vous remercie de vous etre penché sur mon code, j'ai bien compris mes erreurs mise à part quand vous dites :
Local lcMaChaine as String

à quoi ca sert de definir la variable ?


mon probleme c'est que je vois a peu près la logique pour arriver a mes fins mais lorsque je regarde la définition d'une fonction je ne la comprend pas...

sinon j'ai bien compris les fonctions commencant par F, je ne savais pas qu'il y avait plus d'un niveau de langage par compilateur

du coup j’essaie de trouver des alternatives au F... (qui me semble plus compréhensible que les autres fonction)

pour aller plus loin dans mon code j'essai de recuperer en messagebox pour l'instant une serie de chaine
Local lcMaChaine as String
m.lcMaChaine = FileToStr('C:\test.txt')
do while NOT eof() * tant que je suis pas a la fin
IF(SUBSTR(m.lcMaChaine, 0, 3))='tel' * si les 3ere carac sont "tel"
messagebox(SUBSTR(m.lcMaChaine, 10, 2)) *affiche moi le 11 et 12eme carac
ENDIF
Messages postés
13
Date d'inscription
vendredi 17 décembre 2004
Statut
Membre
Dernière intervention
17 février 2012

manque ENDDO à la fin (mauvais copier coller)

je fais une boucle parceque "tel" apparait plusieurs fois dans mon test.txt
je pensais qu'il allait m'afficher ligne par ligne dans le messagebox mais en fait il m'affiche indéfiniment la première ligne
Messages postés
828
Date d'inscription
mardi 5 octobre 2004
Statut
Membre
Dernière intervention
7 mai 2013
1
à quoi ça sert de déclarer une variable?
en VFP (langage non typé, donc déclaration implicite), la déclaration sert essentiellement à préciser la portée (en anglais on dit le "scope") de cette variable. La portée, c'est ce qui définit sa visibilité, et sa destruction. Regarde dans l'aide, c'est une notion indispensable à maitriser parfaitement. Dans le code que je t'ai donné, c'est le mot Local
qui définit la portée de la variable. Le typage, en VFP, est un pseudo typage qui n'est pas repris à la compilation (VFP est non typé), ça ne sert que comme aide mémoire, mais c'est une bonne habitude à prendre.

Regardons ton code, amintenant. Il y a une très grosse erreur, c'est l'usage du EOF(). ça ne concerne que les curseurs de données, cette fonction. rien d'autre. donc ici, ça va tester si tu es en dépassement de dernier enregistrement dans l'alias courant. rien à voir avec ton problème.

Qu'et-ce que tu veux faire? décris d'abord ce que tu cherches à obtenir, en langage courant (par exemple : je veux afficher toutes les lignes de cette chaine, 1 ligne à la fois). Ensuite, on cherchera comment faire.
Messages postés
13
Date d'inscription
vendredi 17 décembre 2004
Statut
Membre
Dernière intervention
17 février 2012

encore moi désolé,

pour afficher 3 variables (à la ligne) dans une seule messagebox,
en cherchant un peu j'ai trouvé ca :
MessageBox(Var1 +chr(13) +Var2 +chr(13) +Var3)

mais j'ai un message d'erreur: Operator/operand type mismatch
Messages postés
828
Date d'inscription
mardi 5 octobre 2004
Statut
Membre
Dernière intervention
7 mai 2013
1
Quels sont les types des variables?
Messages postés
13
Date d'inscription
vendredi 17 décembre 2004
Statut
Membre
Dernière intervention
17 février 2012

bonsoir Michel, désolé nos messages se sont croisés et je n'ai pas eu le temps de répondre avant.
j'ai trouvé le probleme du messagebox, apparemment on ne peu pas mettre de chiffre dans le nom d'une variable.

pour répondre à votre réponse sur le pourquoi foxpro: on me la conseillé comme étant plus simple des langages. meme s'il à l'air plus intuitif que le C et ses balises, à chaque fois que j'ouvre l'aide j'ai l'impression de ressortir avec plus de questions.
je m'uy prends peut etre mal, il me manque peut etre certaines bases, mais comment les aquerir quand le pavé d'aide ne donne pas spécialement envie d'etre lu ? (je suis désolé je donne peut etre l'impression d'etre un fainéant, mais pour sortir mes 3 lignes plus bas, j'ai mis au moins 1 semaine à raison de 3h par jours pour les faire.

donc en fait un "curseur de donné" ou un "alias courant" ne sont pas des mots que j'ai l'habitude d'entendre. y a t'il une possibilité de faire mon petit programme sans que j'ai besoin de devenir programmeur pro ?

voici la derniere mouture (je suis désolé j'en suis revenu au fonction Fopen qui me parle mieux)

IF FILE("c:\test.txt") 
pnhandle=FOPEN("c:\test.txt",2)
gcString = FGETS(pnHandle,8000)  
&& DO WHILE not FEOF(pnhandle)
var=(SUBSTR(gcString, 2, 4))
vari=(SUBSTR(gcString, 2340, 4))
MESSAGEBOX(var +CHR(13) +vari)
FCLOSE(pnhandle)
FCLOSE(gcString)
ENDIF 


voila je me suis dit vu que je ne sais pas revenir à la ligne je vais compter les caracteres jusqu'au suivant, mais on dirait que je dépasse la limite.

en gros ce que je cherche Michel,
c'est de m'afficher les 11 et 12 eme caracteres de chaque ligne de mon fichier et si possible de l'enregistrer dans un fichier texte (sinon un messagebox m'irait tres bien)
Messages postés
828
Date d'inscription
mardi 5 octobre 2004
Statut
Membre
Dernière intervention
7 mai 2013
1
Bonjour,

Concernant ton choix de VFP: oui, bien sur, VFP est plus simple que le C. Mais tous les langages sont plus simples que le C. Est-ce que VFP est le plus simple? je ne pense pas, non. Et je ne sais pas si on peut dire qu'il y a UN langage plus simple que les autres.

Revenons sur tes erreurs:
Quand tu dis
on ne peu pas mettre de chiffre dans le nom d'une variable
, ça ne veut rien dire! une variable peut contenir absolument n'importe quoi. Par contre, ce que tu dois toujours vérifier, c'est le type des variables que tu utilises dans une fonction.
Et là, dans ton exemple de messagebox, tu additionnes des variables de type numérique (var1, var2, et var3) avec des chaines de caractères (tes chr(13) )! comment veux tu que ça fonctionne? le signe + a deux usages différents, deux significations distinctes: si toutes les varibles sont de type numérique, alors le + va effectuer la somme des valeurs contenues dans ces variables. si toutes ces variables sont de type caractère, alors le + va concaténer ces chaines en une seule chaine.

Il est évident qu'il te manque les bases, mais le seul moyen de les acquérir, c'est de lire l'aide, de refaire les exemples qui y figurent, et de suivre les conseils qu'on te donne. Et je te le redis, le FOPEN n'est pas fait pour l'usage que tu imagines. Si tu veux y arriver, utilise le FileToStr comme je te l'ai indiqué.
Ensuite, quand tu auras récupéré le contenu de ton fichier dans cette variable, alors je t'expliquerai comment en parcourir les lignes une à une.

Quelle version de VFP utilises-tu?
Messages postés
13
Date d'inscription
vendredi 17 décembre 2004
Statut
Membre
Dernière intervention
17 février 2012

Bonjour Michel,
merci pour votre patience
j'utilise VFP9 sp2

voilà: j'ai mis mon fichier dans une chaine, j'ai extrait ce dont j'ai besoin,
j'ai enregistré ce que j'ai extrait dans un nouveau fichier.

si vous pouviez me donner une piste concernant les sauts de ligne je vous en serais reconnaissant


Local lcMaChaine as String
LOCAL resultat as Character
LOCAL gcString as String

m.resultat = 'c:\resultat.txt'
m.lcMaChaine = FileToStr('C:\test.txt')
m.gcString = (SUBSTR(lcMaChaine,99,10))

STRTOFILE(gcString, resultat,1)
Messages postés
828
Date d'inscription
mardi 5 octobre 2004
Statut
Membre
Dernière intervention
7 mai 2013
1
Bonjour,

le StrToFile ne te sert à rien, tu n'as pas besoin d'enregistrer le contenu de la varaible, puisque c'est exactement le contenu du fichier d'origine.
Et je ne vois absolument pas à quoi te sert ton Substr avec ces valeurs.

Donc on reprend au point que je t'avais indiqué, c'est à dire à
m.lcMaChaine = FileToStr('C:\test.txt')
.

tu vas regarder l'aide de la fonction et tu essaies d'en faire quelque chose.
Messages postés
13
Date d'inscription
vendredi 17 décembre 2004
Statut
Membre
Dernière intervention
17 février 2012

sauf votre respect,

les lignes marchent, strtofile me permet d'enregistrer dans la variable "resultat" (resultat.txt) le contenu de "gcString" (substr des 10 caracteres apres le 99eme de lcMaChaine (test.txt))

mon fichier resultat.txt contient la bonne valeur


http://imageshack.us/photo/my-images/153/sansre1ay.jpg/

je dois regarder l'aide de quelle fonction exactement ?
Messages postés
828
Date d'inscription
mardi 5 octobre 2004
Statut
Membre
Dernière intervention
7 mai 2013
1
je ne dis pas que ça ne fonctionne pas, je dis que ça ne sert à rien! d'où sortent ces valeurs 10 et 99? elles ne sont pas dans ton énoncé de définition de ce que tu veux faire.

pour la fonction, désolé pour l'oubli: c'est ALINES( ) que tu dois regarder
Messages postés
13
Date d'inscription
vendredi 17 décembre 2004
Statut
Membre
Dernière intervention
17 février 2012

le 10 99 c'est juste que j'ai modifié mon fichier de test entre temps

je suis désolé mais je ne comprends pas la définition de ALINES()

du coup j'ai fait autrement
je suis désolé si pas académique comme approche

gnFileHandle = FOPEN('c:\test.txt')
resultat = 'c:\resultat.txt'
IF gnFileHandle <0
RETURN
ENDIF
=FSEEK(gnFileHandle,0,0)
DO WHILE !FEOF(gnFileHandle)
lcMaChaine=FGETS(gnFileHandle)
fdigit=SUBSTR(lcMaChaine,1,4)
IF fdigit='A000'
gcString = (SUBSTR (lcMaChaine,99,10)) +CHR(13) +CHR(10)
STRTOFILE(gcString,resultat,1)
ENDIF
ENDDO
FCLOSE(gnFileHandle)


me reste plus qu'à trouver comment ouvrir un fichier en fonction de la date du style:
A_YYYYMMDD.txt
mais ca je crois que je vais le faire en batch a moins de passer encore 3 semaines sous foxpro
Messages postés
828
Date d'inscription
mardi 5 octobre 2004
Statut
Membre
Dernière intervention
7 mai 2013
1
Ben écoute, c'est ce qu'on appelle du code spaghetti (et ce n'est pas un compliment). Pas maintenable, inadapté à l'objectif, sans vérification ni gestion d'erreur, bref pas beau pas beau
La question n'est pas d'être académique ou pas. LA question, c'est qu'il faut que ça fonctionne sans erreur, et que qui que ce soit qui reprendra ton code après toi puisse rapidement l'améliorer et le faire évoluer.

Autre remarque (que mon grand âge me permet, et aussi mes bientôt 30 ans d'expérience professionnelle dans le développement): si tu te laisses rebuter par 3 jours d'apprentissage, ou par la lecture d'une page d'aide, ou par la perspective de passer 3 semaines à écrire CORRECTEMENT un bout de programme, alors n'imagine pas que tu vas devenir compétent dans ce métier!

En gros, tu ne connais pas la programmation, tu ne connais pas FoxPro, mais tu veux faire comme tu en as envie. Alors fais-le comme ça te va, mais ne demande pas de conseils, ça n'est vraiment pas la peine!
Messages postés
13
Date d'inscription
vendredi 17 décembre 2004
Statut
Membre
Dernière intervention
17 février 2012

je pense que votre grand age comme vous dites, vous a surtout fait oublié vos débuts.
je n'ai jamais prétendu vouloir devenir programmeur.
durant ces deux pages apres m'avoir aidé sur le 1er message vous avez passé votre temps à me dire
1 DE LIRE L'AIDE
2 que c'est faux (merci j'avais bien lu le message d'erreur)
3 DE LIRE L'AIDE
4 que ca ne marche pas (pourtant ca marchait chez moi)
5 DE LIRE L'AIDE

alors mon code spaghetti, que j'ai compris malgré vos dé-conseils, j'en suis fier.

la prochaine fois si vous croisez un de mes sujets, vu que vous semblez fréquenter tous les forums foxpro, s'il vous plait, n'y répondez pas.
Messages postés
828
Date d'inscription
mardi 5 octobre 2004
Statut
Membre
Dernière intervention
7 mai 2013
1
Bonjour,
Alors puisqu'il faut te mettre les points sur les I, je vais le faire!

Oui, effectivement, je fréquente tous les forums FoxPro, et j'aide de façon bénévole ceux qui veulent APPRENDRE. Et l'apprentissage, dans ce métier comme dans tous les autres, ça passe autant par l'acquisition de savoirs que de savoir-faire.

Les savoirs, ça s'acquiert pour l'essentiel par un croisement entre les LECTURES et les expérimentations. La lecture de l'aide est essentielle pour savoir programmer. et les expérimentations, ça se recommence autant de fois qu'il faut.
Les savoirs-faire, eux, on les acquiert principalement par le partage avec les "anciens", les professionnels aguerris. Qui parfois doivent donner des dé-conseils, comme tu dis, parceque l'intuition des débutant est souvent la porte ouverte à l'installation des pires pratiques.

Ne t'inquiète pas, je ne te répondrai plus sur aucun forum. Mais ne t'étonne pas non plus si personne ne te répond, et si d'autres que moi te disent tes vérités en face de façon plus abrupte.