Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ecraser une valeur dans un csv avec une autre valeur dans d'autres csv

3 réponses
Avatar
---DGI972---
Bonjour,

J'aimerais avoir vos avis sur la faisabilité et l'accompagnement dans un vbscript.
Je suis en train de faire un VBScript pour faire une transformation de fichier csv pour passer d'un système à un autre.
Je suis presque au bout de mon Script mais, ce fichier une fois converti, contient quelques 'malformations' connues.
Pour tenter de les rectifier, je dois écraser une valeur (Champ N°7) du fichier1 (si la valeur du champ N°6 est supérieur à 100000)
avec une autre valeur a récupérer dans autre fichier csv (fichier2) a condition que 3 valeurs soit correctes (champ1,Champ2,champ4)
dans l'autre fichier et si la valeur récupérée dans le dernier champ n'est pas bonne (pasdimage) il faut la récupérer
dans un 3 ième fichier (fichier3).
NB: j'ai moyen de concatener le fichier2 et fichier3 en un seul fichier2 si c'est plus facile
de rechercher dans les lignes suivantes.

Je m'arrache les cheveux et je me demande même si c'est réalisable ...

je m'explique par un exemple que j'ai décortiquer (avec soin pour avoir tous les cas de figure) depuis plusieurs jours
pour essayer de trouver une logique pour pouvoir le traduire en VBS:

fichier1:

A;TOTO;20080929;20080930;M;2;15;1
T;0212308;908881238888;101191230000;000001206178;000020001;1020001;0
R;5712316;000000000020;900241231077;000001206178;000020002;1020002;0
C;2402504;972011239908;305051230010;000000009775;000020003;1020003;0
C;2712353;971011239908;000121232200;000000264126;273816915;274816915;0
C;8536003;972011231908;000641230417;000000004345;000020004;1020004;0
C;8506018;972011231908;001211231117;000000012365;000020005;1020005;0
R;4003958;000000000042;900331235159;000000009756;273816916;274816916;0

fichier2:

0;TOTO;29/09/2008
1;5712316;000000000020;900241231077;000001206178;1000020002;19401;images\29-09-2008\1\MARE\89\0001\000020002.tif
2;2402504;972011239908;305051230010;000000009775;1000020003;300908E29141120003000000;0; ;images\29-09-2008\1\MARE\89\0001\000020003.tif
2;8536003;972011231908;000641230417;000000004345;1000020004;300908E29141120004000000;0; ;images\29-09-2008\1\MARE\89\0001\000020004.tif
2;2712353;971011239908;000121232200; 264126;0000200133;300908E29141116915000000;0; ;images\29-09-2008\1\MARE\89\0000\000200133.tif
2;8536003;972011231908;000641230417;000000004345;1000020004;300908E29141120004000000;0; ;images\29-09-2008\1\MARE\89\0001\000020004.tif
2;8506018;972011231908;001211231117;000000012365;1000020005;300908E29141120005000000;0; ;images\29-09-2008\1\MARE\89\0001\000020005.tif
1;4003958; 42;900331235159; 9756;0273816916;99380;Pasdimage

fichier3:

0;TOTO;29/09/2008
1;4003958; 42;900331235159; 9756;0273816916;99380;images\29-09-2008\1\MARE\89\0000\000200001.tif
1;4058270; 42;900331230864; 178049;0273816917;19401;images\29-09-2008\1\MARE\89\0000\000200002.tif

Dans le fichier1 (en exemple) il y a 2 rectifications a faire:

ligne N°5 et la ligne N°8.

Dans la ligne N°5 dans le fichier1 (C;2712353 ....) le champ N°6 a une valeur qui est supérieure à 100000.
Il faut ouvrir le fichier2 et rechercher dans la ligne qui contient un 2 (Champ N°1 car un C dans le fichier1 est égal a un 2 dans le fichier2
et un 1 est égal a un R et il n'y a que deux de ces valeur qui sont possibles pour l'écrasement) et 2712353 (champ N°2) et 000121232200 pour récupérer le
dernier champ (images\29-09-2008\1\MARE\89\0000\000200133.tif) et extraire la valeur 000200133.
Je voudrais aditionner cette valeur à 1000000 (1000000+200133=1200133) et replacer le résultat (sur 9 caractères) dans le champ N°7 dans le fichier1 pour
avoir comme résultat:

C;2712353;971011239908;000121232200;000000264126;273816915;1200133;0

Dans la ligne N°8 dans le fichier1 (R;4003958 ...) le champ N°6 a une valeur est supérieure à 100000.
En recherchant dans le fichier2 avec les éléments 1 (champ1=R donc un 1 dans fichier2) et 4003958 (champ2) et 900331235159 (champ4) on retrouve
ces éléments dans la ligne 8 du fichier2.Mais le dernier champ=Pasdimage il faut donc rechercher dans le fichier3 (dans la ligne2) et on extrait le dernier
champ images\29-09-2008\1\MARE\89\0000\000200001.tif la valeur 200001 ou il faut aditionner 1000000 et ecraser le champ7 du fichier1 pour avoir le résultat:

R;4003958;000000000042;900331235159;000000009756;273816916;1200001;0

Cela vous semble t-il réalisable en VBS ?
Comment rechercher dans un csv avec plusieurs critères issu de la lecture d'un csv ?
Comment aller dans le dernier champ d'un csv sans connaitre a l'avance le nombre de champ ?

Merci d'avance

3 réponses

Avatar
Gilles LAURENT [MVP]
"---DGI972---" <gilles.dermigny@*NO SPAM*laposte.net> a écrit dans le
message de
news:
| Bonjour,

Bonjour,

| Cela vous semble t-il réalisable en VBS ?
[...]

Le script VBScript ci-dessous devrait répondre à votre besoin. Les
fichiers de données fichier[1..3].txt se situent ici dans le même
dossier que le script. Le résultat est simplement affiché dans la
console :

--- CodeSnippet.vbs ---
Set oFs=CreateObject("Scripting.FileSystemObject")
Set oMainFile=oFs.OpenTextFile("fichier1.txt")
Set oDic=CreateObject("Scripting.Dictionary")
oDic("C")=2: oDic("R")=1

While Not oMainFile.AtEndOfStream
arrMainData=Split(oMainFile.ReadLine, ";")
If CDbl(arrMainData(5))>100000 Then
sNumber=GetImageNumber("fichier2.txt")
If sNumber="" Then sNumber=GetImageNumber("fichier3.txt")
arrMainData(6)=sNumber
End If
WScript.Echo Join(arrMainData, ";")
Wend

Function GetImageNumber(sFileName)
Set oFile=oFs.OpenTextFile(sFileName)
While Not oFile.AtEndOfStream
sLine=oFile.ReadLine
arrData=Split(sLine, ";")
If UBound(arrData)>3 Then
If _
CByte(arrData(0))Ëyte(oDic(arrMainData(0))) And _
arrData(1)=arrMainData(1) And _
arrData(3)=arrMainData(3) _
Then
sImageNumber=oFs.GetBaseName(sLine)
If sImageNumber<>sLine Then
GetImageNumber=CStr(CDbl(sImageNumber)+1000000)
Exit Function
End If
End If
End If
Wend
End Function
--- CodeSnippet.vbs ---

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
Avatar
---DGI972---
Après mûre réflexion, Gilles LAURENT [MVP] a écrit :
"---DGI972---" <gilles.dermigny@*NO SPAM*laposte.net> a écrit dans le
message de
news:
Bonjour,



Bonjour,

Cela vous semble t-il réalisable en VBS ?


[...]

Le script VBScript ci-dessous devrait répondre à votre besoin. Les
fichiers de données fichier[1..3].txt se situent ici dans le même
dossier que le script. Le résultat est simplement affiché dans la
console :

--- CodeSnippet.vbs ---
Set oFs=CreateObject("Scripting.FileSystemObject")
Set oMainFile=oFs.OpenTextFile("fichier1.txt")
Set oDic=CreateObject("Scripting.Dictionary")
oDic("C")=2: oDic("R")=1

While Not oMainFile.AtEndOfStream
arrMainData=Split(oMainFile.ReadLine, ";")
If CDbl(arrMainData(5))>100000 Then
sNumber=GetImageNumber("fichier2.txt")
If sNumber="" Then sNumber=GetImageNumber("fichier3.txt")
arrMainData(6)=sNumber
End If
WScript.Echo Join(arrMainData, ";")
Wend

Function GetImageNumber(sFileName)
Set oFile=oFs.OpenTextFile(sFileName)
While Not oFile.AtEndOfStream
sLine=oFile.ReadLine
arrData=Split(sLine, ";")
If UBound(arrData)>3 Then
If _
CByte(arrData(0))Ëyte(oDic(arrMainData(0))) And _
arrData(1)=arrMainData(1) And _
arrData(3)=arrMainData(3) _
Then
sImageNumber=oFs.GetBaseName(sLine)
If sImageNumber<>sLine Then
GetImageNumber=CStr(CDbl(sImageNumber)+1000000)
Exit Function
End If
End If
End If
Wend
End Function
--- CodeSnippet.vbs ---



Désolé pour le délais pour le retour mais, je suis tjrs en train de
l'adapter pour mon Script.

Mais j'ai testé et cela me parait nickel ...

J'envoie la facture a quel non ? Et en ti-punch cela fait combien ?

J'aurais été imcapable de réaliser cela, mais je sais ce que je veux et
cela fait 3 mois que je suis sur cette convertion et je vois enfin le
du tunnel.

merci merci gilles c'est génial.
Avatar
Gilles LAURENT [MVP]
"---DGI972---" wrote:

Désolé pour le délais pour le retour mais, je suis tjrs en train de
l'adapter pour mon Script.

Mais j'ai testé et cela me parait nickel ...



Merci pour ce retour !

--- CodeSnippet.GiL ---
J'envoie la facture a quel nom ? Et en ti-punch cela fait combien ?



Loop: Ti-punch ... On négociera en Décembre hein ?

merci merci gilles c'est génial.



Goto Loop
--- CodeSnippet.GiL ---

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr