Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1951 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1535956
darkbol
Pouf c'est tout....
Posté le 29-03-2007 à 16:57:52  profilanswer
 

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
mood
Publicité
Posté le 29-03-2007 à 16:57:52  profilanswer
 

n°1535986
aprilthe5i​th
Posté le 29-03-2007 à 17:24:25  profilanswer
 

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

n°1535989
darkbol
Pouf c'est tout....
Posté le 29-03-2007 à 17:28:02  profilanswer
 

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
n°1535991
aprilthe5i​th
Posté le 29-03-2007 à 17:31:14  profilanswer
 

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

n°1535993
aprilthe5i​th
Posté le 29-03-2007 à 17:32:45  profilanswer
 

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

n°1535997
aprilthe5i​th
Posté le 29-03-2007 à 17:35:58  profilanswer
 

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.

n°1535999
darkbol
Pouf c'est tout....
Posté le 29-03-2007 à 17:36:47  profilanswer
 

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

n°1536002
MagicBuzz
Posté le 29-03-2007 à 17:40:33  profilanswer
 

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

n°1536003
aprilthe5i​th
Posté le 29-03-2007 à 17:40:46  profilanswer
 

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

n°1536005
MagicBuzz
Posté le 29-03-2007 à 17:42:16  profilanswer
 

(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.

mood
Publicité
Posté le 29-03-2007 à 17:42:16  profilanswer
 

n°1536006
MagicBuzz
Posté le 29-03-2007 à 17:42:57  profilanswer
 

(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

n°1536009
aprilthe5i​th
Posté le 29-03-2007 à 17:46:26  profilanswer
 

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...
 
 

n°1536010
MagicBuzz
Posté le 29-03-2007 à 17:47:34  profilanswer
 

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

n°1536019
darkbol
Pouf c'est tout....
Posté le 29-03-2007 à 17:57:58  profilanswer
 

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
n°1536041
MagicBuzz
Posté le 29-03-2007 à 19:12:23  profilanswer
 

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
n°1536181
AprilThe5t​h
Posté le 30-03-2007 à 03:57:49  profilanswer
 

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

n°1536228
MagicBuzz
Posté le 30-03-2007 à 09:41:37  profilanswer
 

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

n°1536246
darkbol
Pouf c'est tout....
Posté le 30-03-2007 à 09:55:14  profilanswer
 

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

n°1536382
MagicBuzz
Posté le 30-03-2007 à 13:48:30  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
[Win32]GetTextExtentPoint32 ne me donne pas la bonne largeur de chaîne[c] liste simplement chainé==> pb [résolu==> merci]
Faire un substring d'une chaine de caractères largesTester le format d'une chaine & expressions régulieres
[Résolu] Remplacement d'une chaine par <BR/>[JS] Exécuter une fonction à partir de son nom en variable chaîne
Probleme simple ?[Java] Problème (simple ??!) d'ArrayList
[Java - Swing] Question simple : positionner l'applet avec setBounds() 
Plus de sujets relatifs à : [vbs] [SOLVED!!] Simple remplacement de chaine...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR