OVH Cloud OVH Cloud

Lecture dans des variables string

12 réponses
Avatar
SAISAS
Je ne me souviens plus comment on lit une chaine de caractères comme si
c'était un fichier streeam (c'est à dire, que l'on récupère explicitement
chaque ligne).

Si j'ai révé, j'essaierai la fonction split (texte, vbCrLf)

Merci.

10 réponses

1 2
Avatar
Jacques93
Bonjour SAISAS,
SAISAS a écrit :
Je ne me souviens plus comment on lit une chaine de caractères comme si
c'était un fichier streeam (c'est à dire, que l'on récupère explicitement
chaque ligne).

Si j'ai révé, j'essaierai la fonction split (texte, vbCrLf)




Extrait de l'aide :

Dim TextLine

Open "TESTFILE" For Input As #1 ' Open file.
Do While Not EOF(1) ' Loop until end of file.
Line Input #1, TextLine ' Read line into variable.
Debug.Print TextLine ' Print to the Immediate window.
Loop
Close #1 ' Close file.



--
Cordialement,

Jacques.
Avatar
SAISAS
Désolé de ne pas avoir été plus explicite ...

Je ne veux pas lire un fichier dans une variable string, mais depuis une
variable vers une variable.

Voici le code équivalent avec la fonction split :

Public Sub Dire(ByRef Genie As IAgentCtlCharacter, ByVal Message As String)
Dim SplitMsg As Variant
Dim i As Integer

SplitMsg = Split(Message, vbCrLf, -1, vbTextCompare)
For i = LBound(SplitMsg) To UBound(SplitMsg)
Genie.Speak SplitMsg(i)
Next i

End Sub

l'agent MS parle phrase par phrase, les phrases étant séparées par une
nouvelle ligne.
"Jacques93" a écrit :

Bonjour SAISAS,
SAISAS a écrit :
> Je ne me souviens plus comment on lit une chaine de caractères comme si
> c'était un fichier streeam (c'est à dire, que l'on récupère explicitement
> chaque ligne).
>
> Si j'ai révé, j'essaierai la fonction split (texte, vbCrLf)
>

Extrait de l'aide :

Dim TextLine

Open "TESTFILE" For Input As #1 ' Open file.
Do While Not EOF(1) ' Loop until end of file.
Line Input #1, TextLine ' Read line into variable.
Debug.Print TextLine ' Print to the Immediate window.
Loop
Close #1 ' Close file.



--
Cordialement,

Jacques.



Avatar
Jacques93
Bonjour SAISAS,
SAISAS a écrit :
Désolé de ne pas avoir été plus explicite ...

Je ne veux pas lire un fichier dans une variable string, mais depuis une
variable vers une variable.

Voici le code équivalent avec la fonction split :

Public Sub Dire(ByRef Genie As IAgentCtlCharacter, ByVal Message As String)
Dim SplitMsg As Variant
Dim i As Integer

SplitMsg = Split(Message, vbCrLf, -1, vbTextCompare)
For i = LBound(SplitMsg) To UBound(SplitMsg)
Genie.Speak SplitMsg(i)
Next i

End Sub

l'agent MS parle phrase par phrase, les phrases étant séparées par une
nouvelle ligne.



Il me semble que Split est tout à fait approprié pour ce cas de figure.
Que cherche tu de plus ? ou que reproche tu à Split ?

--
Cordialement,

Jacques.
Avatar
SAISAS
Je reproche à mon code de ne pas gérer correctement les différentes formes de
passage à la ligne. Dans la majorité des cas, le code inséré est vbCrLf, mais
de temps en temps, et sans que j'en connaisse la logique, on retrouve vbCr
tout seul, ou vbLf tout seul ...

Il semblerait néanmoins que l'option vbTextCompare traite correctement le
problème.

"Jacques93" a écrit :

Bonjour SAISAS,
SAISAS a écrit :
> Désolé de ne pas avoir été plus explicite ...
>
> Je ne veux pas lire un fichier dans une variable string, mais depuis une
> variable vers une variable.
>
> Voici le code équivalent avec la fonction split :
>
> Public Sub Dire(ByRef Genie As IAgentCtlCharacter, ByVal Message As String)
> Dim SplitMsg As Variant
> Dim i As Integer
>
> SplitMsg = Split(Message, vbCrLf, -1, vbTextCompare)
> For i = LBound(SplitMsg) To UBound(SplitMsg)
> Genie.Speak SplitMsg(i)
> Next i
>
> End Sub
>
> l'agent MS parle phrase par phrase, les phrases étant séparées par une
> nouvelle ligne.

Il me semble que Split est tout à fait approprié pour ce cas de figure.
Que cherche tu de plus ? ou que reproche tu à Split ?

--
Cordialement,

Jacques.



Avatar
Jacques93
SAISAS a écrit :
Je reproche à mon code de ne pas gérer correctement les différentes formes de
passage à la ligne. Dans la majorité des cas, le code inséré est vbCrLf, mais
de temps en temps, et sans que j'en connaisse la logique, on retrouve vbCr
tout seul, ou vbLf tout seul ...

Il semblerait néanmoins que l'option vbTextCompare traite correctement le
problème.




De toute façon, avec les fonctions de lecture de fichier, je pense que
tu aurais rencontré le même problème, le séparateur doit être vbCrLf.

--
Cordialement,

Jacques.
Avatar
Jean-Marc
"SAISAS" a écrit dans le message de
news:
Je reproche à mon code de ne pas gérer correctement les différentes


formes de
passage à la ligne. Dans la majorité des cas, le code inséré est


vbCrLf, mais
de temps en temps, et sans que j'en connaisse la logique, on retrouve


vbCr
tout seul, ou vbLf tout seul ...



Hello,

Dans ce cas, tu peux normaliser ta chaine en entrée:

Dim s as string

' ici s contient des trucs, séparés par ces cr, des lf et/ou des
crlf. tu fais:

s=replace(s, vbcr, vbcrlf)
s=replace(s, vblf, vbcrlf)

et hop, tu splites:

phrase=split(s, vbcrlf)

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Vincent Guichard
Jean-Marc a écrit :
s=replace(s, vbcr, vbcrlf)
s=replace(s, vblf, vbcrlf)



Tous les <CR> vont se retrouver remplacés par des <CR><CR><LF> avec ce
code, non? Ou il considérera que les séquences <CR><LF> ne contiennent
pas vbLf?


Vincent Guichard
Avatar
Vincent Guichard
Vincent Guichard a écrit :
Jean-Marc a écrit :
s=replace(s, vbcr, vbcrlf)
s=replace(s, vblf, vbcrlf)



Tous les <CR> vont se retrouver remplacés par des <CR><CR><LF> avec ce
code, non? Ou il considérera que les séquences <CR><LF> ne contiennent
pas vbLf?




J'aurais plutôt tendance à faire ainsi:

s=replace(s, vbCrLf, vbCr)
s=replace(s, vbLf, vbCr)

et a faire un split(s, vbCr)


Vincent Guichard
Avatar
Gloops
SAISAS a écrit :
Je reproche à mon code de ne pas gérer correctement les différentes formes de
passage à la ligne. Dans la majorité des cas, le code inséré est vbCrLf, mais
de temps en temps, et sans que j'en connaisse la logique, on retrouve vbCr
tout seul, ou vbLf tout seul ...



Bonjour,

Il me semble avoir rencontré ce problème un jour.
Il y a deux explications possibles : ou une chaîne provenant d'un
programme pas très bien écrit de ce point de vue, ou un fichier
provenant d'une autre plate-forme.

Je crois bien que je m'en étais sorti avec une routine de rectification,
un peu dans ce style-là (je dis ça de tête, il faudrait tester) :

'j'ai été tenté de mettre strTest plutôt que Test, mais ça faisait
'des lignes trop longues pour les newsgroups.

booTest = True
While booTest
booTest = False
For N = 1 to Len(Test) - 1
If Mid$(Test, N, 1) = vbCr And Mid$(Test, N + 1, 1) <> vbLf Then
Temp = Left$(Test, N) + vbLf + Mid$(Test, N + 1)
Test = Temp
booTest = True
End If
Next
For N = 2 to Len(Test)
If Mid$(Test, N - 1, 1) <> vbCr And Mid$(Test, N, 1) = vbLf Then
Temp = Left$(Test, N - 1) + vbCr + Mid$(Test, N)
Test = temp
booTest = True
End If
Next
Wend
Avatar
Jean-Marc
"Vincent Guichard" a écrit dans le message
de news:4423c4b0$0$20149$
Jean-Marc a écrit :
> s=replace(s, vbcr, vbcrlf)
> s=replace(s, vblf, vbcrlf)

Tous les <CR> vont se retrouver remplacés par des <CR><CR><LF> avec ce
code, non?



oui :-(

Ou il considérera que les séquences <CR><LF> ne contiennent
pas vbLf?



Hélas non!
Tu as raison bien sur et ta séquence est la solution.

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
1 2