cs_zedude33
Messages postés38Date d'inscriptionmardi 1 août 2006StatutMembreDernière intervention 9 juillet 2013
-
17 août 2006 à 23:16
cs_zedude33
Messages postés38Date d'inscriptionmardi 1 août 2006StatutMembreDernière intervention 9 juillet 2013
-
19 août 2006 à 08:27
Bonjour,
J'ai un petit souci de récupération et de mise en forme d'une ligne de texte d'un fichier texte.
Je vais essayer d'être le plus clair possible. Je voudrais récupérer juste Mon Texte de :
; DE "Mon Texte" ; Message#2
Cette ligne vient d'un fichier texte c:/ALIMUSD/Conf.alm.
J'y arrive presque avec mon bout de code suivant :
Open "c:/ALIMUSD/Conf.alm" For Input As #1
Dim VarMsg2() As String
Dim LineMsg2
NumLineMsg2 = 73 'déclare i ki representera le numero de la ligne
Do Until EOF(1) 'avant EOF (=la fin du fichier) :
Line Input #1, LineMsg2 'on met la valeur texte = la ligne
NumLineMsg2 = NumLineMsg2 + 1 'augmenter i de 1 ce ki symboliz la ligne 1 et au loop suivant la 2 etc...
'on lit la ligne 2 et non la 1 grace au code do until eof(1)
If NumLineMsg2 100 Then GoTo NextMsg2 'si i 2 donc ligne 2 alors on mark dans le label
Loop
NextMsg2:
VarMsg2() = Split(LineMsg2, """)
For i = 1 To UBound(VarMsg2)
ConfEditFrm.Msg2.Text = VarMsg2(i)
Next i
Close #1
Mon problème se situe dans la partie en rouge car elle génère des erreurs. Je voudrais dans un premier temps récupérer Mon Texte sans les guillemets, ajouter un nombre d'espaces n j'usqu'a avoir 16 caractères ce qui donnerai (sans les |) : |Mon Texte | . J'aimerai avoir le résultat dans ConfEditFrm.Msg2.Text.
Je suis bien arrivé à quelque chose en remplassant """ par " " mais je ne sais pas enlever les guillemets. Je ne sais pas non plus comment ajouter automatiquement le nombre d'espaces n nécessaire au formatage de ma variable pour obtenir systématiquement 16 Caractères.
Si quelqu'un a une petite idée...
@+ Thierry
A voir également:
Mise en forme d'un texte récupéré. Comment faire ?
SamirAloui
Messages postés53Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention20 mars 2008 18 août 2006 à 00:37
Déso maintenant je comprend bien ton 2eme problem .Voila un reponse détaillé
1- Definir une constante de type string contient 16 blancs Ok?
Option explicit
Const Blanc =" " '16 blancs
2-Dans ton procedure tu a :
ConfEditFrm.Msg2.Text = VarMsg2(i)
Alors un peut de calcule:
si taille de varMsg2(i)=n Alors ajouton un nombre de blanc = 16-n
et on na la fonction Len() qui donne le nombre de caractères dans une string
Ici on peut remplacer ta ligne de code par celle ci:
ConfEditFrm.Msg2.Text = VarMsg2(i) &Right(Blanc,16-Len(VarMsg2(i)))
la fonction left(chaine,nbr) donne les Nbr plus a gauche caractères
de chaine sous forme d'une sous-chaine
le& sert a concatener deux chaine dans une grande chaine
SamirAloui
Messages postés53Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention20 mars 2008 18 août 2006 à 00:50
Autre chose comme remarque:
Dans la fin du boucle
For i = 0 To UBound(VarMsg2)
ConfEditFrm.Msg2.Text = VarMsg2(i)
Next i
Tu doit remarquer bien que tu affiche dans une zone de text Msg2 Alors tu auras un pbm car ici le textbox Msg2 n'affiche que la derniere resultat du fin du boucle
Parceque dans chaque rebouclement le i sera incrementé et le contenu du Msg2.Text sera changer.
Alors le solution ici est de remplacer le TextBox Msg2 par une ListBox, et eviter de démarrer i de 0 mais de LBound(VarMsg2) . Alor le code sera:
List1.Clear
For i= LBound(VarMsg2) ToUBound(VarMsg2)
List1.AddItem VarMsg2(i) & Right(Blanc,16-Len(VarMsg2(i)))
Next i
Essayez ça pour voire. Parceque peut etre que la ligne 1 etait affiché mais était remplacée durant le bouclage
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 18 août 2006 à 02:46
Arf, petite erreur de ma part :
For i = 1 To Len(LineMsg2) If z True Then MaVar MaVar & Mid(LineMsg2, i, 1) If Mid(LineMsg2, i, 1) Chr(34) And z False Then z = True: GoTo Saut If Mid(LineMsg2, i, 1) Chr(34) And z True Then Exit For
Saut:
Next i
J'ai omis le saut !
@++
<hr size="2" width="100%" />
--Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_zedude33
Messages postés38Date d'inscriptionmardi 1 août 2006StatutMembreDernière intervention 9 juillet 2013 18 août 2006 à 10:37
Hello,
Milles excuses à 659146 SamirAloui !
Je pense que hier soir j'étais trop crevé pour ne pas faire de boulettes. J'avais passé une bonne partie de l'après-midi a chercher tout seul avant d'avoir recours à vbfrance.
J'ai repris tout ça pas à pas ce matin avec une bonne tasse de café bien chaud et voilà le résultat :
Open "c:/ALIMUSD/Conf.alm" For Input As #1
Dim VarMsg2() As String
Dim LineMsg2
NumLineMsg2 = 73 'déclare i ki representera le numero de la ligne
Do Until EOF(1) 'avant EOF (=la fin du fichier) :
Line Input #1, LineMsg2 'on met la valeur texte = la ligne
NumLineMsg2 = NumLineMsg2 + 1 'augmenter i de 1 ce ki symboliz la ligne 1 et au loop suivant la 2 etc...
'on lit la ligne 2 et non la 1 grace au code do until eof(1) If NumLineMsg2 100 Then GoTo NextMsg2 'si i 2 donc ligne 2 alors on mark dans le label
Loop
NextMsg2:
VarMsg2() = Split(LineMsg2, Chr(34))
For i = 1To UBound(VarMsg2)
ConfEditFrm.Msg2.Text = VarMsg2(1) & Right(Blanc, 16 - Len(VarMsg2(1)))
Next i
Close #1
En fin fe compte le Chr(34) fonctionne très bien.
Merci !
Mortalino a très probablement raison sur le fait de dire que c'est bien compliqué. C'est vrai que ça parait être une usine à gaz pour pas grand chose. Que je passe par Hong-Kong pour faire Bordeaux-Paris. Mais j'ai compris la démarche et où étaient mes erreurs !
Maintenant, je ne demamde pas mieux que d'optimiser tout ça ! Pourrais-tu m'expliquer ton code. Je t'avoue que je ne comprends pas.
Merci à Tous !
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 18 août 2006 à 11:57
Admettons que LineMsg2 = ; DE "Mon Texte" ;<hr size="2" width="100%" /> Dim i As Integer, z As Boolean, MaVar As String
z = False
MaVar = ""
For i = 1 To Len(LineMsg2) ' *** 1 To Nb Total caractères de LineMsg2 If z True Then MaVar MaVar & Mid(LineMsg2, i, 1)
' ** Si z = VRAI (= à faux tant que i <> d'un guillemet), on récupère le caractère dans MaVar If Mid(LineMsg2, i, 1) Chr(34) And z False Then z = True: GoTo Saut
' *** Si le caractère rencontré est " & z = Faux (en fait, on est dans cette condition
' *** tant que le premier ", n'est pas rencontré, bah on saute l'instruction suivante If Mid(LineMsg2, i, 1) Chr(34) And z True Then Exit For
' *** Si le caractère rencontré est " & z = Vrai (on est dans cette condition lorsque l'on rencontre le second "), on sort de la boucle
Saut:
Next i
' *** pour l'instant, MaVar = Mon Texte"
MaVar = Mid(MaVar, 1, Len(MaVar) - 1)
' *** ayant récupérer dans MaVar le dernier ", il faut l'enlever.
<hr size="2" width="100%" />
En espérant que ce soit clair !
@++
<hr size="2" width="100%" />
--Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--
cs_zedude33
Messages postés38Date d'inscriptionmardi 1 août 2006StatutMembreDernière intervention 9 juillet 2013 18 août 2006 à 00:19
Hello,
Merci pour ta réponse.
Le Chr(34) fonctionne bien. J'avais eu l'idée avec (KeyAscii = 34) mais ça ne fonctionnait pas du tout !
Le petit soucis c'est qu'il m'affiche dans ma TextBox : ; Mess
Ce qui veut dire qu'il splite à partir du second ". J'ai donc essayé de remplacer le 0 par -1 mais ça plante. Visiblement et ça parait normal, i ne peut pas prendre de valeur négative.
VarMsg2() = Split(LineMsg2, Chr(34) )
For i = 0 To UBound(VarMsg2)
ConfEditFrm.Msg2.Text = VarMsg2(i)
Next i
Close #1
Par contre pour ça :
A=B & " " '16 blanc
ou bien
c=" "
A=B & c
... je suis désolé mais je ne comprends pas. Je débute juste donc c'est un peu chaud !
cs_zedude33
Messages postés38Date d'inscriptionmardi 1 août 2006StatutMembreDernière intervention 9 juillet 2013 18 août 2006 à 00:19
Hello,
Merci pour ta réponse.
Le Chr(34) fonctionne bien. J'avais eu l'idée avec (KeyAscii = 34) mais ça ne fonctionnait pas du tout !
Le petit soucis c'est qu'il m'affiche dans ma TextBox : ; Mess
Ce qui veut dire qu'il splite à partir du second ". J'ai donc essayé de remplacer le 0 par -1 mais ça plante. Visiblement et ça parait normal, i ne peut pas prendre de valeur négative.
VarMsg2() = Split(LineMsg2, Chr(34) )
For i = 0 To UBound(VarMsg2)
ConfEditFrm.Msg2.Text = VarMsg2(i)
Next i
Close #1
Par contre pour ça :
A=B & " " '16 blanc
ou bien
c=" "
A=B & c
... je suis désolé mais je ne comprends pas. Je débute juste donc c'est un peu chaud !
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201822 18 août 2006 à 00:27
Salut, je ne suis pas certain, mais si tu veux avoir 16 caractères, peut-être que tu cherches à formater ton "texte" (?)
Est-ce que ce sont des lignes de texte dont les données devraient
toutes avoir une longueur définie ? Et un nombre défini de valeur par
ligne, un peu comme une base de données ?
Si oui, tu pourrais créer un Type avec les longueurs prédéfinies
Bon,
L'idée est bonne d'autant plus que je ne dépasserai jamais 16 caractères lors de l'écriture de Msg2 car elle est éditée par :
Print #1, "; DE "; """"; Msg2; """"; " ; Message#2" (Commentaire)
et Msg2 vient lui d'une TextBox avec une MaxLenght de 16 Caractères. Donc Impossible de dépasser. On peut écrire moins de 16 Caractères dans la TextBox mais il me faut 16 caractères pour Msg2, donc des bouche-trous.
L'idée est donc parfaite.
L'instruction Right semble être la bonne car d'après mes recherches :
Dim AnyString, MyStr
AnyString = "Bonjour à tous" ' Définit la chaîne.
MyStr = Right(AnyString, 1) ' Renvoie "s".
MyStr = Right(AnyString, 6) ' Renvoie "à tous".
MyStr = Right(AnyString, 20) ' Renvoie "Bonjour à tous".
Donc le fait de faire : Nbr de caractères de variable texte + (16 Blancs - Nbr de caractères de variable texte) semble être une solution !
mais avec:
<li>Un
<object id ="alink_3" type= "application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>[javascript:alink_3.Click() argument] dépasse probablement la plage des valeurs permises. Par exemple, la fonction Sin ne peut accepter que les valeurs comprises dans une certaine plage. Les arguments positifs inférieurs à 2 147 483 648 sont acceptés, tandis que 2 147 483 648 génère cette erreur. Vérifiez les plages permises pour les arguments.
</li><li>Cette erreur peut également se produire si vous tentez d'effectuer un appel à une
<object id ="alink_4" type= "application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>[javascript:alink_4.Click() procédure] qui n'est pas valide sur la plate-forme en cours. Par exemple, certaines procédures ne sont valides que pour Microsoft Windows, ou pour le Macintosh, etc.</li>A mortalino
I a été déclaré Dim
i As Integer
Mais il semble logique que ça plante dans la mesure ou i correspond au nombre de caractère de Split à prendre en compte. On ne peut donc pas commencer AVANT 0.
Je crois, je ne suis pas sûr bien entendu
A MPi Là ça se complique !
Ca pourrait correspondre à une base de données dans un fichier texte.
On écrit par le biais de Print# et on lit à l'ouverture du programme.
J'ai donc testé ta solution :
J'ai du me planter quelque part car ça ne fonctionne pas.
J'ai écris dans un module :
Type LineMsg2
Mot1 As String * 16
Mot2 As String * 10
Mot3 As String * 12
End Type
Puis :
Dim LineMsg2
Dim Ligne As LineMsg2
Ligne.Mot1 =VarMsg2(0)
Ligne.Mot2=VarMsg2(1)
Ligne.Mot3=VarMsg2(2)
NumLineMsg2 = 73 'déclare i ki representera le numero de la ligne...
Mais ça ne fonctionne pas. Apparemment 0,1,2 seraient hors plage.
Je ne sais pas ce que ça veux dire.
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 18 août 2006 à 02:03
Je trouve que c'est bien compliqué !
avant le
VarMsg2() = Split(LineMsg2, Chr(34) )
mettre
Replace(LineMsg2, " ", "") '** remplace les espaces par rien !
Sinon, moi je ferai ça :
Dim i As Integer, z As Boolean, MaVar As String
z = False
MaVar = ""
For i = 1 To Len(LineMsg2) If z True Then MaVar MaVar & Mid(LineMsg2, i, 1) If Mid(LineMsg2, i, 1) Chr(34) And z False Then z = True If Mid(LineMsg2, i, 1) Chr(34) And z True Then Exit For
Next i
MaVar = Mid(MaVar, 1, Len(MaVar) - 1)
@++
<hr size="2" width="100%" />
--Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"