Mise en forme d'un texte récupéré. Comment faire ?

[Résolu]
Signaler
Messages postés
38
Date d'inscription
mardi 1 août 2006
Statut
Membre
Dernière intervention
9 juillet 2013
-
Messages postés
38
Date d'inscription
mardi 1 août 2006
Statut
Membre
Dernière intervention
9 juillet 2013
-
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

14 réponses

Messages postés
53
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
20 mars 2008

remlacer Split(s,""") par : Split(s,Chr(34))   (34 est lec code ascii de " )

Pour une text qui contient des blanc (ou autres text il siffut de faire)

A=B & "                "  '16 blanc
ou bien
    c="                "
   A=B & c

a b1 to
Messages postés
53
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
20 mars 2008

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

lesert a concatener deux chaine dans une grande chaine

essayer ça  Ok?
a b 1 to
                 
Messages postés
53
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
20 mars 2008

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

Si ça resolve your pbm please tell me Ok?
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
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"
<!--
Messages postés
38
Date d'inscription
mardi 1 août 2006
Statut
Membre
Dernière intervention
9 juillet 2013

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 !

@+ Thierry
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
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"
<!--
Messages postés
38
Date d'inscription
mardi 1 août 2006
Statut
Membre
Dernière intervention
9 juillet 2013

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 !

@+ Thierry
Messages postés
38
Date d'inscription
mardi 1 août 2006
Statut
Membre
Dernière intervention
9 juillet 2013

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 !

@+ Thierry
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
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

Type MaLigne

    Mot1 as string * 16

    Mot2 as string * 10

    Mot3 as string * 12

End Type

Dim Ligne as MaLigne


Ligne.Mot1=VarMsg2(0)
Ligne.Mot2=VarMsg2(1)

Ligne.Mot3=VarMsg2(2)


Une idée comme ça............

MPi
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Salut,

Pour ton i ne prenant pas la valeur négative, c'est que soit tu l'as déclaré en Byte, soit pas déclaré du tout (donc Variant)

Déclare le i comme ceci : Dim i As Integer

@++

  --Mortalino--
Le mystérieux chevalier, "Provençal,
Messages postés
38
Date d'inscription
mardi 1 août 2006
Statut
Membre
Dernière intervention
9 juillet 2013

Re-bonsoir:

A 659146 SamirAloui

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:

ConfEditFrm.Msg2.Text = VarMsg2(i) & Right(Blanc,16-Len(VarMsg2(i)))
VB6 demande un deboggage erreur d'execution 5 :

<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

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.

@+Thierry
Messages postés
38
Date d'inscription
mardi 1 août 2006
Statut
Membre
Dernière intervention
9 juillet 2013

Re bonsoir
6078 MPi

Le hors plage est normal car i =0
Je l'ai corrigé mais Dim Ligne As LineMsg2 plante.
Que signifie cette instruction ? A quoi sert-elle ?

Merci
@+ Thierry
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
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"

<hr size="2" width="100%" />
<s></s>
Messages postés
38
Date d'inscription
mardi 1 août 2006
Statut
Membre
Dernière intervention
9 juillet 2013

Merci à toi Ô Mystérieux chevalier, "Provençal, le Gaulois"!

Ton bout de code fonctionne et tes explications sont on-ne-peut-plus claires !
Essayé, compris et approuvé !

Merci à tous pour votre aide.

@+ Thierry