Lecture/ecriture de données dans des fichiers
Résolucarbon3 Messages postés 471 Statut Membre -
J'aurais besoin d'une aide en programmation.
Dans le cadre de mon travail, je doit reprendre une grande série de fichier pour en modifié une ligne.
Ce sont des fichiers de commande numérique pour un atelier, et la norme DSTV qui régis ces fichier ne place pas la valeur que je souhaiterais et je doit donc la remplacer à la main, quand il y en à 5 ou 6, ça va, mais mes projets finis donnent en moyenne une 50aine de fichiers...
Un vrai calvaire!!!
Mais je sais demander au logiciel de me faire un tableau de 2 colonnes avec en 1er le nom du fichier (sans extension, mais cela sera toujours un .nc1) et en 2 l'information à recopier. Dans un fichier .xsr ouvrable avec un notepad.
Donc, j'aimerais à partir d'un tableau qui comporte 2 colonnes, du type:
------------------------
CV25 ; ABC
FP19 ; ABC
GS1 ; BCD
AP12 ; BCD
etc
...
...
...
------------------------
ouvrir les fichiers qui se nomme comme le premier champ pour aller y remplacer un terme (qui se trouve à la 3éme ligne exactement) par le deuxième champ du tableau.
Dans mon exemple ci dessous, ouvrir à partir de la liste le fichier CV25.nc1 et aller y remplacer 3496 par la valeur ABC reprise du tableau.
-----------------------
ST
** CV25.nc1
3496
1
A1
A1
E24-2
2
PL220*10
B
-----------------------
ce qui donnerais un fois fait :
-----------------------
ST
** CV25.nc1
ABC
1
A1
A1
E24-2
2
PL220*10
B
-----------------------
Et ainsi de suite jusqu'a la fin de la liste.
Je sais pas si c'est assez clair??
Ensuite, créer des répertoire relatif à ces textes remplacés ( ABC et BCD dans l'exemple) et trier les fichier pour les distribuer dans chaque répertoire.
Si quelqu'un pouvait me venir en aide, il m'ôterait une très grosse (énorme même...) épine du pied!
Merci d'avance.
Raynald.
Configuration: Windows XP Firefox 2.0.0.12
17 réponses
Un script basé sur VBScript automatise le remplacement d'une valeur dans une grande série de fichiers .nc1 selon un tableau à deux colonnes (nom de fichier et valeur à recopier) dans DSTV. La solution lit modif.xsr, découpe chaque ligne au séparateur ';', construit le nom du fichier (ex. CV25.nc1) et la valeur cible, puis crée le dossier DSTV\nom et copie le fichier modifié. Le script écrase la troisième ligne par la valeur correspondante et réécrit le reste du fichier dans la copie, en générant des répertoires par catégorie et en prévoyant l'option nettoyage. D'autres détails gèrent les fichiers manquants et la suppression progressive des sources, et des ajustements restent possibles selon le nommage des dossiers et les chemins sous XP.
-
alors voilà le code qui créer les copies dans chaque répertoire idoine.
fichier.vbs et fichier.xsr sont au même niveau que rep DSTV
il ne restera plus qu'à décider de la suppression des sources dans le DSTV qd on sera sûr du résultat ;-)dim FSO: Set FSO = CreateObject("Scripting.FileSystemObject") Dim modifier: set modifier = FSO.opentextfile("modif.xsr",1) do while not modifier.atendofstream lect = modifier.readline separateur=InStr(lect, ";") dafile=Mid(lect,1,separateur-2) dafile=dafile & ".nc1" damod=Mid(lect,separateur+2) if FSO.FolderExists("DSTV\"+damod)<>true then makit=FSO.CreateFolder("DSTV\"+damod) end if set tempfold = FSO.GetFolder("DSTV\"+damod) set infile = FSO.opentextfile("DSTV\"+dafile,1) set dacopy = FSO.opentextfile(tempfold+"\"+dafile,8,true) nbrline=0 do while not infile.atendofstream readline = infile.readline nbrline=nbrline+1 if nbrline=3 then dacopy.writeline(damod) else dacopy.writeline(readline) end if loop loop modifier.close infile.close dacopy.close msgbox "~=. Modifications terminées .=~",64,"~= NC1 Modif =~" -
slt
L'erreur Mid semble être provoquée par la présence de ligne vide à la fin du fichier.xsr
Peut-on les éviter ? -
slt
si tu place le fichier.vbs dans le répertoire qui contient les fichier.nc1
tu obtiendras un répertoire contenant les copies modifiées de tout les fichiers.nc1
Dans un deuxième temps, je peux coder le remplacement des originaux par les copies.
Mais, comme je l'ai dit, pour l'instant c'est fonctionnel si tous les fichiers.nc1 sont dans le même répertoire.
Sinon, je vais avoir besoin de plus d'info sur la hierarchie ;-p
voici le code à insérer dans un fichier modifier_nc1.vbsdim FSO: Set FSO = CreateObject("Scripting.FileSystemObject") Dim modifier: set modifier = FSO.opentextfile("modif.xsr",1) set tempfold = FSO.CreateFolder("nc1_copy") do while not modifier.atendofstream lect = modifier.readline separateur=InStr(lect, ";") dafile=Mid(lect,1,separateur-2) dafile=dafile & ".nc1" damod=Mid(lect,separateur+2) set infile = FSO.opentextfile(dafile,1) set dacopy = FSO.opentextfile(tempfold+"\"+dafile,8,true) nbrline=0 do while not infile.atendofstream readline = infile.readline nbrline=nbrline+1 if nbrline=3 then dacopy.writeline(damod) else dacopy.writeline(readline) end if loop loop modifier.close infile.close dacopy.close msgbox "~=. Modifications terminées .=~",64,"~= NC1 Modif =~"
Ensuite, pour la création des répertoire relatifs aux modifs, sont-ce les copies modifiées des fichiers.nc1 que tu veux envoyer dedans ?
Il reste toujours la question de savoir où créer les répertoires...-
Merci pour ta précieuse aide.
Effectivement, tous le fichiers .nc1 sont dans le même répertoire, nommé DSTV, le fichier .xsr est au même rang que ce répertoire. Il me faudra juste placer le .vbs au bon endroit ( la ou cela te semblera le plus judicieux ).
Pour les répertoires destination, ils se nommeront comme les modifs ( ABC, BCD, ... dans l'exemple ), et leur emplacement peut être dans le répertoire DSTV.
Au final, c'est vrai que les fichiers.nc1 source peuvent être supprimé, mais c'est pas obligatoire.
Cependant, j'ai bien fais comme tu le dis, mais j'ai une erreur :
Windows me dit :
----------------
Script : chemin\modifier_nc1.vbs
Ligne : 7
Caract. : 1
Erreur : Argument ou appel de procédure incorrect :'Mid'
Code : 800A0005
Source : Erreur d'exécution microsoft VBScript
----------------
Merci encore!!
Raynald
-
-
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
bon, alors à ce stade tout devrait fonctionner
mon test bloque sur L1.nc1 parce qu'il n'est pas dans DSTV
les fichiers manquants dans DSTV génèrent une erreur
L1-L2...L18->L22 etc... il semble qu'il en manque pas mal ;-(
à partir de là, il faudra effacer les répertoires créés avant de pouvoir relancer la procéduredim FSO: Set FSO = CreateObject("Scripting.FileSystemObject") Dim modifier: set modifier = FSO.opentextfile("modif3.xsr",1) do while not modifier.atendofstream lect = modifier.readline separateur=InStr(lect, ";") dim recurs:recurs=7 dim linkto:linkto="" do while FSO.FileExists(linkto)<>true recurs=recurs-1 dafile=Mid(lect,3,recurs) dafile=dafile & ".nc1" linkto="DSTV\"+dafile 'msgbox dafile loop damod=Mid(lect,separateur+2) if FSO.FolderExists("DSTV\"+damod)<>true then makit=FSO.CreateFolder("DSTV\"+damod) end if set tempfold = FSO.GetFolder("DSTV\"+damod) set infile = FSO.opentextfile("DSTV\"+dafile,1) set dacopy = FSO.opentextfile(tempfold+"\"+dafile,8,true) nbrline=0 do while not infile.atendofstream readline = infile.readline nbrline=nbrline+1 if nbrline=3 then dacopy.writeline(damod) else dacopy.writeline(readline) end if loop loop modifier.close infile.close dacopy.close msgbox "~=. Modifications terminées .=~",64,"~= NC1 Modif =~"
j'ai pris pour base que les fichiers.nc1 ne dépassent pas 6 caractères -
j'ai vérifié le process en supprimant de modif.xsr les fichiers qui ne sont pas dans DSTV et j'arrive au bout...
Il ne reste plus qu'à faire correspondre modif.xsr et le contenu de DSTV
(je l'aurai, un jour, je l'aurai... :o) -
j'utilise la dernière version xsr, celle avec moins d'espaces.
... to be continued -
Il ne te reste qu'à valider le problème comme étant résolu...
bonne continuation -
petite modif et ajout de l'option nettoyage
.../... loop infile.close dacopy.close cleanorifile=FSO.DeleteFile(linkto) loop modifier.close .../...
test ok chez moi -
Salut Sgane,
tu penses bien que je vais y travailler...
Je t'envoie la fonction dès qu'elle est vérifiée opérationnelle. -
Ca yest, c'est prêt.
Bon je te remets tout le code parce qu'il a fallu que je change de stratégie.
Les liste des fichiers manquants est stockée dans M_DSTV(date et heure).txt au même niveau que modifs.xsr et le script.vbs
j'espère que t'auras d'aussi bons résultats que moidim FSO: Set FSO = CreateObject("Scripting.FileSystemObject") Dim modifier: set modifier = FSO.opentextfile("modif.xsr",1) dim pas_dans_rep dajh=Cstr(Date()) hajh=Cstr(Time()) sjour=Mid(dajh,1,2) smois=Mid(dajh,4,2) san=Mid(dajh,7,4) sdate=sjour+smois+san sheure=Mid(hajh,1,2) smin=Mid(hajh,4,2) ssec=Mid(hajh,7,4) stime=sheure+smin+ssec recept_missing="M_DSTV"+sdate+stime+".txt" do while not modifier.atendofstream lect = modifier.readline separateur=InStr(lect, ";") dim recurs:recurs=7 dim linkto:linkto="" dim char_blank:char_blank=" " dim lkat:lkat=recurs do while lkat<>0 'msgbox "lkat " & lkat recurs=recurs-1 dafile=Mid(lect,3,recurs) lkat=Instr(dafile,char_blank) 'msgbox "next tour with "+dafile loop dafile=dafile+".nc1" linkto="DSTV\"+dafile if not FSO.FileExists(linkto) then set pas_dans_rep=FSO.opentextfile(recept_missing,8,true) pas_dans_rep.writeline linkto pas_dans_rep.close else damod=Mid(lect,separateur+2) if FSO.FolderExists("DSTV\"+damod)<>true then makit=FSO.CreateFolder("DSTV\"+damod) end if set tempfold = FSO.GetFolder("DSTV\"+damod) set infile = FSO.opentextfile("DSTV\"+dafile,1) set dacopy = FSO.opentextfile(tempfold+"\"+dafile,8,true) nbrline=0 do while not infile.atendofstream readline = infile.readline nbrline=nbrline+1 if nbrline=3 then dacopy.writeline(damod) else dacopy.writeline(readline) end if loop infile.close dacopy.close cleanorifile=FSO.DeleteFile(linkto) end if loop modifier.close msgbox "~=. Modifications terminées .=~",64,"~= NC1 Modif =~"
... Et c'est môa qui l'aie fait... ;o) -
-
Je rajoute ceci :
Liens vers les fichiers, pour faire des tests.
les fichiers .nc1 à mettre dans un répertoire DSTV:
http://sgane.chez-alice.fr/1_dstv/DSTV.zip
Le fichier .xsr au même rang que le répertoire:
http://sgane.chez-alice.fr/1_dstv/modif.xsr
le fichier .vbs:
http://sgane.chez-alice.fr/1_dstv/modifier_nc1.vbs -
houlala, je viens de visionner le modif.xsr ;-/
si les espaces ne peuvent être supprimés, peut-on être sûr qu'à l'avenir les xsr seront tous formatés ainsi ?
autrement je peux aussi essayer de réécrire le xsr...
comment est-il créée au départ ?-
Oui, je te confirme que les emplacements seront toujours comme ça!
Le logiciel qui fait cette liste est en fait un éditeur de gabarit de liste et de croquis, l'emplacement de chaque champ est donc fixe.
le premier, peut varier en longueur, mais, pas plus de 6 caractères, le séparateur, lui ne bougera pas, sauf si tu veux le virer, et le dernier champ sera toujours une suite de 3 lettres.
voila!
Raynald.
-
-
J'ai repris le fichier.xsr
pour en réduire le nombre d'espace.
http://sgane.chez-alice.fr/1_dstv/modif.xsr -
Merci à toi de m'avoir donné l'occasion d'être utile...
Pour ce qui est de marquer le problème comme étant résolu, c'est moi qui ait besoin d'aide :-)
A+-
Salut à tous.
Je sollicite à nouveau une aide!!
Est ce que l'on pourrais éviter le plantage quand il manque des fichiers par rapport à la liste.
Et en faire une synthèse à la fin des modifications.
On pourrais ajouter la liste des fichiers manquants avec le message de fin?
Merci d'avance!
Raynald.
je remes ici le code:
dim FSO: Set FSO = CreateObject("Scripting.FileSystemObject")
Dim modifier: set modifier = FSO.opentextfile("modif.xsr",1)
do while not modifier.atendofstream
lect = modifier.readline
separateur=InStr(lect, ";")
dim recurs:recurs=7
dim linkto:linkto=""
do while FSO.FileExists(linkto)<>true
recurs=recurs-1
dafile=Mid(lect,3,recurs)
dafile=dafile & ".nc1"
linkto="DSTV\"+dafile
loop
'msgbox dafile
damod=Mid(lect,separateur+2)
if FSO.FolderExists(damod)<>true then
makit=FSO.CreateFolder(damod)
end if
set tempfold = FSO.GetFolder(damod)
set infile = FSO.opentextfile("DSTV\"+dafile,1)
set dacopy = FSO.opentextfile(tempfold+"\"+dafile,8,true)
nbrline=0
do while not infile.atendofstream
readline = infile.readline
nbrline=nbrline+1
if nbrline=3 then
dacopy.writeline(" "+damod)
else
dacopy.writeline(readline)
end if
loop
infile.close
dacopy.close
cleanorifile=FSO.DeleteFile(linkto)
loop
modifier.close
msgbox "~=. Modifications terminées .=~",64,"~= NC1 Modif =~"
-
-