Detection et remplacement string - VB/VBA/VBS - Programmation
Marsh Posté le 21-04-2017 à 10:42:48
Bonjour,
ouverture du bon fichier, lecture d'une ligne - voir l'aide VBA de Line Input # par exemple - puis fonction Replace …
Marsh Posté le 21-04-2017 à 22:44:26
Bonsoir
j'ai un peu avancé
j'ouvre le premier fichier vdi.txt
je lis les lignes
si elle ne contienne pas bgf je les reecrit tel quel dans le fichier 2
si elle contienne bgf, je les traite
j'isole donc le n° que je veux comparer
Code :
|
me reste plus qu'a la reecrire tel quel si le n° est présent dans IPC.txt
ou la convertir (remplacer /d par /x par exemple (c'est le plus simple)
si le n° est absent de ipc.txt
mais là je sèche, car si je fait à ma méthode je vais ouvrir et fermer le fichier 10000 fois
ça, cela marche
'ligne = Replace(ligne, "d53113031", "dxxxxxxxx"
bref
comment changer ipc.txt en mémoire
et faire sorte qu'il me dise si la séquence isolé est ou n'est pas dans ipc.txt
ex:
si Mid(ligne, InStr(ligne, "bgf" - 13, 9) est présent dans ipc.txt alors beep
comment traduire cela ?
Marsh Posté le 22-04-2017 à 02:43:03
Lire d'abord le fichier IPC afin de charger dans un dictionnaire les séquences précédant "bgf"
(soit via l'objet Dictionary (VBA / VBScript, consulter la doc VBA ou encore celle sur MSDN)
soit via une Collection du VBA mais là il faut prévoir une gestion d'erreur car il n'y pas de fonction testant l'existence d'une clef) …
Lors du traitement du fichier VDI comparer avec le dictionnaire …
Possibilité d'accélérer la lecture & l'écriture des fichiers textes via ADODB.Stream (cf doc sur MSDN).
Marsh Posté le 22-04-2017 à 17:19:06
ça y est cela fonctionne (presque)
j'ai utilisé le dictionnaire au lieu d'une boucle pour la lecture d'un des fichiers
forcement je suis passé d'une exécution de 5mn a 20s
il me reste 2 soucis
-les séparateurs en fin de ligne
-les lignes qui contiennent plusieurs fois bgf
Marsh Posté le 23-04-2017 à 21:42:15
Sans information technique précise, je dirais de voir déjà du côté de la fonction Split …
Marsh Posté le 25-04-2017 à 17:12:13
Bonjour
j'ai des string qui ressemblent a cela et que j'ai isolé
geometry {"home/sb30/d21212099000-flx03.bgf"}
geometry {"home/bes/asna3323-223.bgf"}
geometry {"home/sb3020/f53114036-200.bgf"}
Comment isoler facilement les caractères entre le dernier / et le point avant bgf
pour qu'en retour je reçoive :
d21212099000-flx03
asna3323-223
d53114036200
Code :
|
ca, ça marche, mais comme je peux avoir une autre lettre que d après le / je cherche une autre solution
Marsh Posté le 26-04-2017 à 00:44:46
Exemple avec la fonction Split :
Code :
|
Marsh Posté le 03-05-2017 à 13:50:27
Suite au contexte technique précisé par messages privés, voici dans un premier temps une procédure VBA Excel
devant être située dans un module ne contenant pas l'instruction Option Compare Text sinon l'exécution en sera plus longue …
Code :
|
Marsh Posté le 03-05-2017 à 17:18:08
Merci
cela fonctionne
je vais étudier la méthode que tu as utilisée
je ne pense pas être capable de la refaire actuellement, mais il y a par ci par là des fonction nouvelle pour moi
j'ai remarqué que cette macro ne mettait pas la zizanie dans la mise en forme de mon fichier, c'est aussi un plus
Marsh Posté le 04-05-2017 à 00:28:15
Comme attendu, cette procédure remplace juste l'extension des .bgf non désirés …
Et du côté du temps d'exécution, cela donne quoi ?
Marsh Posté le 04-05-2017 à 19:16:07
Connaissant déjà la réponse avec des fichiers d'un volume important …
Voici la version VBScript du code précédent (but final, VBA utile juste pour dégrossissage),
quelques remaniements pour les particularités de VBScript mais aussi à cause d'une mauvaise gestion de Windows en 64 bits …
Code :
|
J'ai dû découper des lignes de code sur plusieurs lignes à cause de l'affichage du code balisé,
ces lignes pouvant être regroupées en une seule dans le fichier final …
Marsh Posté le 04-05-2017 à 23:38:23
Les 2 fonctionnent, mais en essayant de comprendre en faisant du pas a pas sur des petit fichier, j'ai des chose bizarres
ex:
je mets QUE cela dans un fichier vdi
geometry {"home/sb30/d53110391-200.bgf"}
logiquement il devrait me rendre
geometry {"home/sb30/d53110391-200.err"}
mais sur le gros fichier vdi, ce même n° est bien converti
Marsh Posté le 05-05-2017 à 00:33:47
Je viens de tester de mon côté via Notepad++ à partir d'un fichier .vdi
afin de respecter la séquence de fin de ligne (LF) : aucun souci !
Donc je soupçonne ton fichier ne respectant pas cette norme des fichiers originaux …
Marsh Posté le 05-05-2017 à 08:44:04
je pense aussi que c'est ça
le VBA n'arrive pas a le trouver
par contre le VBS y arrive
Marsh Posté le 05-05-2017 à 08:58:01
Cette dernière précision le confirme !
En effet le code VBA recherchant les lignes se terminant par .bgf"} via l'opérateur Like
tandis qu'en VBScript est cherché la présence de .bgf dans les lignes via la fonction InStr …
Utiliser NotePad++ (téléchargeable et gratuit), il permet de vérifier le résultat par exemple
en comptant le nombre de .bgf ou de .err; il permet aussi de s'entraîner aux expressions rationnelles …
Marsh Posté le 06-05-2017 à 17:44:54
Suite à ton autre discussion, ceci est plus rapide de mon côté :
Code :
|
Marsh Posté le 20-04-2017 à 21:02:57
Bonsoir
j'ai 2 fichiers txt
-VDI.txt (15mo, 30000 lignes)
-IPC.txt (5mo, 100 000 lignes)
je voudrais, dans le fichier VDI.txt remplacer toutes les séquences de caractères situées devant bgf
ex : {"home/sb30/d53113317-200.bgf"}
a remplacer par
{"home/sb30/d00000000-200.bgf"}
par contre si le n° est dans le fichier IPC.txt, je ne veux pas y toucher
{"home/sb30/d53113320-200.bgf"} doit rester tel quel
j'imagine que c'est faisable en 10-20 lignes, mais je ne sais pas par ou commencer
vbs, vba
je sais déjà ouvrir un fichier et l'afficher ligne par ligne
tester si la ligne contient bgf
me reste plus que isoler le n° avant bgf, ouvrir le 2eme fichier, comparer, remplacer, reecrire
je sens que je vais faire une usine a gaz