Optimisation d'un code de manipulation de chaine de caractere

waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013 - 1 déc. 2004 à 15:17
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013 - 2 déc. 2004 à 03:55
bonjour a tous,

voila, j'ai créé dans un tit programme une procedure (voir ci-dessous) qui permet:
- ouvrir un fichier text (c) contenant une chaine de caractere hexadecimaux.
- de convertir les caracteres nuls "00" en caractere espace "20".
- de suprimer les caracteres "0A" et "0D".
- de reduire les successions de caracteres "20" à seulement "2020".
- de convertir alternativement ces doubles "20" en:
* "0A"
* "3B"
- enfin de convertir cette chaine de caractere hexa en une chaine de caractere ascii.

----------------------------------------------------------------------------------
Private Sub generale()
s1 = ""
s2 = ""
s3 = ""

Open c For Input As #1
s1 = Input(LOF(1), #1)
Close #1

lettre = ""
i = 1
While i <= Len(s1)
lettre = Mid(s1, i, 2)
If lettre = "00" Then
s2 = s2 & "20"
Else
s2 = s2 & lettre
End If
i = i + 2
Wend

s1 = s2
m = InStr(1, s1, "0A")
n = InStr(1, s1, "0D")
If m <> 0 Or n <> 0 Then
s2 = ""
i = 1
lettre = ""
While i <= Len(s1)
lettre = Mid(s1, i, 2)If lettre "0A" Or lettre "0D" Then
s2 = s2 & ""
Else
s2 = s2 & lettre
End If
i = i + 2
Wend
s1 = s2
End If
i = 1
s2 = ""
While i <= Len(s1)
lettre = Mid(s1, i, 2)
lettre2 = Mid(s1, i + 4, 2)If lettre2 "20" And lettre "20" Then
s2 = s2 & ""
Else
s2 = s2 & lettre
End If
i = i + 2
Wend
s1 = s2
T = Split(s1, "2020")
s2 = ""
For i = 0 To UBound(T)
If i Mod 2 Then
s2 = s2 & T(i) & "0A"
Else
s2 = s2 & T(i) & "3B"
End If
Next
s1 = s2
s2 = ""
i = 1
While i <= Len(s1)
lettre = Mid$(s1, i, 2)
s2 = s2 & Chr(Val("&h" & lettre & "&"))
i = i + 2
Wend

Open c For Output As #1
Print #1, s2;
Close #1
MsgBox "fini"
End Sub
-----------------------------------------------------------------------------------
voila ma question:
comment optimiser ce code car pour:
- petit fichier (qq dizaine de ko)=> tres rapide
- grd fichier (qq centaine de ko)=> extrement lent
y a pas moyen d'optimiser la vitesse d'execusion en faisant une ouverture sequentielle du fichier? mais ca je sais pas faire

a l'avance, merci de votre aide

9 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
1 déc. 2004 à 15:56
Vu le nombre de boucles que tu fais, mets des DoEvents de temps en temps, tu devrais éviter de bloquer le système trop longtemps.

Tu peux également remplacer les : If lettre "0A" Or lettre "0D" Then
s2 = s2 & ""
Else
s2 = s2 & lettre
End If

Par :If not(lettre "0A" Or lettre "0D") then s2 = s2 & lettre

_______________________________________

DarK Sidious

[Responsable API/VB du site www.ProgOtoP.com]
Téléchargez ProgOtoP API Viewer
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
1 déc. 2004 à 15:56
Vu le nombre de boucles que tu fais, mets des DoEvents de temps en temps, tu devrais éviter de bloquer le système trop longtemps.

Tu peux également remplacer les : If lettre "0A" Or lettre "0D" Then
s2 = s2 & ""
Else
s2 = s2 & lettre
End If

Par :If not(lettre "0A" Or lettre "0D") then s2 = s2 & lettre

_______________________________________

DarK Sidious

[Responsable API/VB du site www.ProgOtoP.com]
Téléchargez ProgOtoP API Viewer
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
1 déc. 2004 à 16:22
Je sais pas si ca va fonctionner mais je t'ai fait un truc en une seule boucle.
Open c For Input As #1
s1 = Input(LOF(1), #1)
Close #1

lettre = ""
i = 1
S2 = ""
S3 = "0A"
While i <= Len(s1)
lettre = Mid$(s1, i, 2)If Lettre "00" then Lettre "20"
Select case lettre
case "0A","0D"
Lettre = ""
case "20"
if right$(s2,2)="0A" Or right$(s2,2)="3B" then Lettre = ""		End Select
s2 = s2 & lettre
If Right$(s2,4)="2020" Then 
S2 = Left$(S2,Len(s2)-4) & s3
S3 = Iif(s3="0A","3B","0A)
End If
i = i + 2
Wend

Open c For Output As #1
Print #1, s2
Close #1
MsgBox "fini"

A tester car j'ai fait cela sans vérifier avec VB !

Christophe R.
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
1 déc. 2004 à 16:40
Salut tout le monde,

Est ce que ici l utilisation de la fonction Replace ne serait pas la bienvenue?
@+
Julien
-----------------------------------------------------------
:big) Essai ca sinon on trouvera autre chose ;)
-----------------------------------------------------------
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
1 déc. 2004 à 16:53
Par exemple :

lettre = ""
i = 1
While i <= Len(s1)
lettre = Mid(s1, i, 2)
If lettre = "00" Then
s2 = s2 & "20"
Else
s2 = s2 & lettre
End If
i = i + 2
Wend

peut se remplacer par

Replace(s1,"00","02",,,vbTextCompare)

Manu
-------------------------------------------
Une question bien posée, c'est une chance de réponse bien adaptée.
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
1 déc. 2004 à 16:54
J'ai comparé les deux façons de procéder sur une chaine de 0 et de 2 et çà rend le même résultat... j'avais quelques doutes, mais non ... en fait !
:)

Manu
-------------------------------------------
Une question bien posée, c'est une chance de réponse bien adaptée.
0
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013
1 déc. 2004 à 18:32
merci a tous pour votre aide,

grâce à vous g divisé le temps de traitement des fichier par.....10 !!!!! environ 20s pour un fichier de 120ko contre 240s avant.

encore merci a tous
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
1 déc. 2004 à 18:38
Re,

De rien,

Alors tu a remplacer ton code par quel code au final?
@+
Julien
-----------------------------------------------------------
:big) Essai ca sinon on trouvera autre chose ;)
-----------------------------------------------------------
0
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013
2 déc. 2004 à 03:55
ben g repris le code de crenaud76 avec quelques modif car c se qui donne les meilleurs resultats, voili
0
Rejoignez-nous