[vbs] [SOLVED!!] Simple remplacement de chaine...

Simple remplacement de chaine... [vbs] [SOLVED!!] - VB/VBA/VBS - Programmation

Marsh Posté le 29-03-2007 à 16:57:52    

Bonjour!
 
Je galère sur un script tout simple depuis plusieurs heures...
 
Il s'agit de trouver une chaine dans un fichier texte puis de le remplacer par une autre. Concrètement, username=bobo doit être remplacé par username="".
 
Voici mon code tout pourri :  
 
dim tbl,tblfilter
 
Set filesys = CreateObject("Scripting.FileSystemObject" )
Set objFile = filesys.OpenTextFile("C:\Documents and Settings\me\Mes documents\kiosk\config.ini", 1)
 
strText = objFile.ReadAll
tbl= split(strText,"'" )
tblfilter=filter(tbl,"usern" )
objFile.Close
 
strNewText = Replace(strText, tblfilter(0), "username=" )
 
Set objFile = filesys.OpenTextFile("C:\Documents and Settings\pn\Mes documents\kiosk\config.ini", 2)
objFile.WriteLine strNewText
objFile.Close
 
WScript.Quit
 
 
Ma dernière tentative fut de faire un split et un filter.
 
sinon avt j'avais tenté un replace avec un mid...
 
Je désespère...
 
Merci pour l'aide  
 
A plus
 
Dark
 
PS : au fait la chaine après username varie tout le temps... (sinon un replace aurait été facile)


Message édité par darkbol le 29-03-2007 à 17:59:24
Reply

Marsh Posté le 29-03-2007 à 16:57:52   

Reply

Marsh Posté le 29-03-2007 à 17:24:25    

Voila ce que je ferais (mais je ne comprends pas le coup su split sur "'" et le filtre sur usern...) en admettant qu'au final, tu veux simplement virer bobo de ton fichier texte :
 
 
strText = objFile.ReadAll
tbl= split(strText,"bobo'" ) 'On isole l'élément à soustraire
objFile.Close
 
Set objFile = filesys.OpenTextFile("C:\Documents and Settings\pn\Mes documents\kiosk\config.ini", 2)
objFile.Write tbl(0) & tbl(1)
'tbl(0)=tout ce qu'il y avait avant bobo (bobo exclu)
'tbl(1)=tout ce qu'il y avait après bobo (bobo exclu)
 
'Ajouter éventuellement un vbnewline entre tbl(0) et tbl(1)
 
objFile.Close

Reply

Marsh Posté le 29-03-2007 à 17:28:02    

Merci pour ta réponse, j'étais en train d'éditer le message...  :D  
 
Alors bobo n'est pas tjrs bobo... mais un nom qui varie tout le temps en fonction d'une session utilisée...
 
En fait j'ai rajouté un quote avant et après la ligne que je voulais isoler afin de le mettre dans un tableau séparé par les quotes. Et après je filtre sur username.
 
Mais bon ça marche pas très bien...
 
Je vais tester ton truc c tricky! (heu enfin si je pouvais savoir comment isoler bobo...)
 
Merci pour ton aide!!
 
Dark


Message édité par darkbol le 29-03-2007 à 17:29:57
Reply

Marsh Posté le 29-03-2007 à 17:31:14    

Par ailleurs si tu veux remplacer bobo par 2 double quotes :
 
objFile.Write tbl(0) & """""" & tbl(1)

Reply

Marsh Posté le 29-03-2007 à 17:32:45    

Et qu'est ce qui ne varie jamais dans ce bon sang de fichier texte qu'on peut isoler ?

Reply

Marsh Posté le 29-03-2007 à 17:35:58    

Si tu as la main sur ce fichier texte, au départ, tu n'as qu'a ajouter un bon vieux * à un endroit précis.. facile à repérer car unique.

Reply

Marsh Posté le 29-03-2007 à 17:36:47    

Je vois ce que tu veux dire. Je vais essayer un truc en rajoutant mes propres bornes genre faire un split sur 'banana que je rajoute avant et après ma ligne.
 
A plus!
 
Dark

Reply

Marsh Posté le 29-03-2007 à 17:40:33    

inspire-toi de ça :
 


Option Explicit
 
Const zeros = "0000000000000000000000000000000000000000"
Const workDir = "e:\loader\imp"
 
Call Main()
 
Function Numeric2Gnx(nb, digits)
  Dim a
   
  a = Int(Abs(nb))
  If nb >= 0 Then
    Numeric2Gnx = Right(zeros & CStr(a), digits)
  Else
    Numeric2Gnx = "-" & Right(zeros & CStr(a), digits - 1)
  End If
End Function
 
Function Date2Gnx(dte)
  Date2Gnx = CStr(Year(dte)) & Numeric2Gnx(CStr(Month(dte)), 2) & Numeric2Gnx(CStr(Day(dte)), 2)
End Function
 
Sub Main()
  Dim fso
  Dim fol
  Dim fil
  Dim filename
  Dim filerena
  Dim oldfil
  Dim newfil
  Dim line
  Dim dateve
  Dim sigdep
 
  Set fso = CreateObject("Scripting.FileSystemObject" )
  Set fol = fso.GetFolder(workdir)
 
  For Each fil in fol.Files
    If LCase(Right(fil.Name, 4)) = ".csv" Then
 
      MsgBox("Traitement du fichier : " & fil.name)
 
      filename = fil.Name
      dateve = Date2Gnx(DateAdd("d", CDate("20" & Left(filename, 2) & "-" & "01-01" ), CInt(Mid(filename, 3, 3))))
      sigdep = "20" & Mid(filename, 7, 2)
      filerena = Left(filename, 9) & "old"
      fil.Move(workdir & "\" & filerena)
      Set oldfil = fso.OpenTextFile(workdir & "\" & filerena, 1, False, 0)
      Set newfil = fso.CreateTextFile(workdir & "\" & filename, True, False)
      Do While Not oldfil.AtEndOfLine
        newfil.WriteLine(oldfil.ReadLine() & ";" & sigdep & ";" & dateve)
      Loop
      oldfil.Close
      newfil.Close
    End If
  Next
End Sub

Reply

Marsh Posté le 29-03-2007 à 17:40:46    

fais attention quand même, si un utilisateur s'appelle banana, ca va planter...

Reply

Marsh Posté le 29-03-2007 à 17:42:16    

(y'a que ça qui t'intéresse d'ailleurs ;))
 


      Set oldfil = fso.OpenTextFile(workdir & "\" & filerena, 1, False, 0)  
      Set newfil = fso.CreateTextFile(workdir & "\" & filename, True, False)  
      Do While Not oldfil.AtEndOfLine  
        newfil.WriteLine(oldfil.ReadLine() & ";" & sigdep & ";" & dateve)  
      Loop  
      oldfil.Close  
      newfil.Close  


 
=> tu rajoute un test dans la boucle lorsque les premiers caractères d'un trim sur le readline ramène username=, et tu remplaces la fin de la ligne par la valeur que tu veux.

Reply

Marsh Posté le 29-03-2007 à 17:42:16   

Reply

Marsh Posté le 29-03-2007 à 17:42:57    

(en tout cas, quand je vois les solutions que vous avez testez, je comprends pourquoi la réputation de VB et VBS :sweat:)
 
ca va pas un peu la tête ? :o

Reply

Marsh Posté le 29-03-2007 à 17:46:26    

Quoi ????
Mais t'as vu la longueur de ton code pour un malheureux remplacement de chaine ?
 
Donne des solutions, plutot que de te foutre gentilment de nous ?
C'est comme pour mon "gif sur userform", j'attends tjs ta solution plus rapide et plus simple...
 
 

Reply

Marsh Posté le 29-03-2007 à 17:47:34    

et 3 lignes plus haut, c'est quoi ? du chocolat fondu ?

Reply

Marsh Posté le 29-03-2007 à 17:57:58    

Re,  
 
ça marche du feu de dieu, j'ai enfin plié mon mode kiosk
 
dim strtext
 
Set filesys = CreateObject("Scripting.FileSystemObject" )  
Set objFile = filesys.OpenTextFile("chemin de mon ini", 1)  
strText = objFile.ReadAll
 
tbl= split(strText,"'banane" ) 'On prend un banana split
objFile.Close
 
Set objFile = filesys.OpenTextFile("le chemin de mon ini qui change pas", 2)
objFile.Write tbl(0)&"'banane"&vbnewline&"username="&vbnewline&"'banane"&vbnewline&tbl(2)
 
objFile.Close

 
Et ça suffit largement pour le résultat que j'en attends. Merci bien april the hokage the fifth, je déploie sur des postes pilotes demain.  
 
Je testerai pour moi la soluce de magicbuzz l'éclair
 
Allez tout le monde il est bo, je vous aime tous
 
Tchao!
 
Dark


Message édité par darkbol le 29-03-2007 à 18:00:13
Reply

Marsh Posté le 29-03-2007 à 19:12:23    

Mais vire-moi ce ReadAll et ce split :o
 
Tu fais quoi le jour où :
-> T'as un autre banane dans ton fichier ?
-> Ton banane n'est plus présent ?
-> Ton fichier fait 16 Go ? (dans ce cas là ma solution reste lente, mais au moins, ne consomme pas plus de 1Ko de mémoire, là où ta solution fait exploser WSH)


Message édité par MagicBuzz le 29-03-2007 à 19:13:07
Reply

Marsh Posté le 30-03-2007 à 03:57:49    

Allez, sois beau joueur... ca marche
 
... Et le jour où :
 
il a un autre banane dans son fichier : il fait un milkshake
sa banane n'est plus présente : il trouve d'autres fruits
son fichier fait 16 Go : il chope un core 2 duo
 
 
bonne nuit

Reply

Marsh Posté le 30-03-2007 à 09:41:37    

le jour où je vois passer ton CV, broyeur + désinfectant

Reply

Marsh Posté le 30-03-2007 à 09:55:14    

salut!
 
- le jour où yaura banane dans mon fichier, je veux bien payer une glace à toute la boite
- Pq ma banane serait plus présente?
- mon fichier ini sert pour le lancement d'un client léger; il fait 15 lignes soit 800 ko à peu près...  
 
Et pis c'est qu'une solution de temp (un ispèce de kiosk avt d'acheter des boitiers...)
 
Et pis vous allez l'air de bien vous connaitre c marrant
 
et pis à plus!
 
Dark

Reply

Marsh Posté le 30-03-2007 à 13:48:30    

Que ce soit un prototype, une micro application ou quoi que ce soit d'autre, rien n'empêche de travailler proprement quand on en a les moyens.
Il se trouve que j'ai fourni une solution propre, qui nécessite moins de code, sera capable de s'adapter si un jour les besoins évoluent, et surtout, qui est sémantiquement correcte. Je ne parle pas non plus de refactorisation, qui éviterait de revenir ici le jour où il vous aurez le même besoin pour une application qui ne permet pas d'utiliser la solution batarde du split.
 
La solution adpotée fonctionne, ça c'est sûr. Tout comme je peux atteler un beouf à ma voiture si je sais pas mettre le contact. Mais après faut pas s'étonner si on a un truc bancale et qu'aucun garagiste ne veut s'en approcher.
 
L'informatique c'est pareil. Y'a toujours moyen de trouver la pire solution qui existe. Faut pas venir se plaindre le jour où ça ne marche pas.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed