OVH Cloud OVH Cloud

for each file in collect file sélectif

23 réponses
Avatar
---DGI972---
Bonjour messieurs,

Il me manque une routine en vbs:

C:\TOTO\TATA\AA\
C:\TOTO\TATA\BB\
C:\TOTO\TATA\CC\
Dans le sous répertoire AA
j'ai des fichiers AAxx.001,AAxx.002,AAxx.003 et AAxx.dat
Dans le sous répertoire BB
j'ai des fichiers BBxx.001,BBxx.002,BBxx.003 et BBxx.dat
etc..
je voudrais lire uniquement les *.dat dans tous les sous répertoire de
TOTO du genre:

Set fso = CreateObject("Scripting.fileSystemObject")
Set fsofolder = fso.GetFolder("c:\TOTO\")
Set collec_file = fsofolder.files
for each fic_file in collec_file
DO
lire chaque ligne de chaque fichier dat
end

merci d'avance pour un début de code trouvé sous le coude.

10 réponses

1 2 3
Avatar
Méta-MCI
Bonjour !

for each fic_file in collec_file
If Right(fic_file.Name, 4) = ".dat"




Là, j'étais sûr de voir cette réponse ! Je ne l'avais pas suggéré, pour ne
pas avoir l'air condescendant ;-)

Sinon, AAxx.dAt ne sera pas pris en compte...

Inutile de réponse, un LCASE peut régler le problème. C'est juste pour le
(bad) fun.

@+

MCI



Avatar
Jean
Bonjour !

Juste par curiosité :
- comment se fait la conversion d'une majuscule accentuée, en minuscule ?
Avec d'autres langages, j'ai des comportement curieux, variables selon le
code-page utilisé (c-à-dire la même routine retourne des résultats pouvant
être différents, sur des machines différentes)


Il faudrait faire des tests.
Mais c'est effectivement différent d'un language et même parfois d'un
objet à l'autre.
Ennuyeux quad on doit faire des tris alphabétique.

- comment se fait la conversion, si l'extension contient des caractères
unicode ?



Il ne devrait pas y avoir de problèmes puisque tout les traitements
interne des moteurs de scripts se font en Unicode.
Maintenant ... est-il raisonnable de mettre des caractères unicode dans
le nom d'une extension ?
Personellement je n'en ai pas :-)

Retrouver les minuscules unicode, c'est... d'autres méthodes.


Effectivement.
A ce niveau là MSH se distingue en incluant la gestion Unicode étendue
dans les expressions régulière (les P et autres ...)

@+

MCI



--
Jean - JMST
Belgium

Avatar
Fred
Dans : news:%
Bonjour !


Bonjour,

Juste par curiosité :
- comment se fait la conversion d'une majuscule accentuée, en
minuscule ? Avec d'autres langages, j'ai des comportement curieux,
variables selon le code-page utilisé (c-à-dire la même routine
retourne des résultats pouvant être différents, sur des machines
différentes)


MsgBox Lcase("É")
La conversion se fait bien : É donne é
Le jeu de caractère utilisé est celui de windows.
Mais cela vient sans doute de l'enregistrement du vbs voir plus bas.
Je n'ai pas testé avec tous les caractères accentués.

- comment se fait la conversion, si l'extension
contient des caractères unicode ? Retrouver les minuscules unicode,
c'est... d'autres méthodes.


Je ne sais pas trop dans ce cas. Tout ce que je peux dire c'est qu'un
essai avec un caractère accentué de code supérieur à 255 fonctionne bien
(il n'y a pas ambiguïté comme avec le É qui a le même code en 1252 et en
Unicode).

MsgBox Lcase(ChrW(264))
ou
MsgBox LCase("Ĉ") (à condition d'enregistrer en Unicode bien sûr)

donne bien ĉ (264 est le code Unicode de Ĉ)
Cela semble se confirmer avec quelques autres essais.



--
Fred
http://www.cerbermail.com/?3kA6ftaCvT

Avatar
jbongran
Méta-MCI wrote:
Bonjour !

for each fic_file in collec_file
If Right(fic_file.Name, 4) = ".dat"




Là, j'étais sûr de voir cette réponse ! Je ne l'avais pas suggéré,
pour ne pas avoir l'air condescendant ;-)

Sinon, AAxx.dAt ne sera pas pris en compte...

Inutile de réponse, un LCASE peut régler le problème. C'est juste
pour le (bad) fun.

@+

MCI


Merci pour l'air con... descendant ;-)
Toi et Jean avez raison, mais je ne voulait pas "trop" en faire. J'ai
remarqué que si on fait trop de modifications, cela deroute (dégoute ?) les
personnes qui posent une question.




Avatar
Méta-MCI
'soir !

cela deroute (dégoute ?) les personnes qui posent une question




Aaaarrggghh... C'est vrai. J'avais oublié qu'il y avait (aussi) des
utilisateurs, dans les NG.
Désolé d'avoir troublé ta démarche.

MCI



Avatar
---DGI972---
jbongran a utilisé son clavier pour écrire :
---DGI972--- wrote:
Le 22/02/2006, Georges a supposé :
Bonjour,
Si vous faites

v_type=inputBox("Donnez le type de fichier à traiter (AA, BB ou CC)
....
for each fic_file in collec_file
If Right(fic_file.Name, 3) = "dat" and left(fic_file.Name,
2)=v_typeThen Do
...

Cordialement
Georges



"---DGI972---" <gilles.dermigny@*NO SPAM* laposte.net> a écrit dans
le message de news:
---DGI972--- wrote:
Bonjour messieurs,

Il me manque une routine en vbs:

C:TOTOTATAAA
C:TOTOTATABB
C:TOTOTATACC
Dans le sous répertoire AA
j'ai des fichiers AAxx.001,AAxx.002,AAxx.003 et AAxx.dat
Dans le sous répertoire BB
j'ai des fichiers BBxx.001,BBxx.002,BBxx.003 et BBxx.dat
etc..
je voudrais lire uniquement les *.dat dans tous les sous
répertoire de TOTO du genre:

Set fso = CreateObject("Scripting.fileSystemObject")
Set fsofolder = fso.GetFolder("c:TOTO")
Set collec_file = fsofolder.files
for each fic_file in collec_file
DO
lire chaque ligne de chaque fichier dat
end

merci d'avance pour un début de code trouvé sous le coude.


for each fic_file in collec_file
If Right(fic_file.Name, 3) = "dat" Then
Do

Ou alors executer dans un shell la commande dir o:n /b /s
C:TOTO*.dat > fichier.lst
Puis lire ce fichier qui contient la liste de tous les fichiers
.dat des sous repertoires ligne à ligne


Super, merci
Je peux vous demander une petite alternative ?
Si je pose une question avant du genre quel type de fichier voulez
vous traiter: les AA BB ou CC ?
commment traiter que les AAxx.dat ?
Merci


Super je rajoute cela à ma bibliothèque personnelle


Voici mon bout de code avec les routines demandées, mais je bute sur
une erreur Instruction attendue (voir à la fin).
Le but est d'extraire des zones dans des fichiers dat
C'est fichier ce trouve dans le répertoire C:DATAPACKAGE
et il y a 4 types de fichier dat à traiter indépendement:
TCH_AJxxx.dat
TCH_DIxxx.dat
TIP_DOxxx.dat
TIP_RIxxx.dat

Je pose la question quel traitement ?
Si c'est 1 c'est le ou les fichiers TCH_AJxxx.dat qu'il faut traiter
Je prépare les colonnes et mon fichier cvs
Je filtre les fichier avec l'extension dat et le f-type=TCH_AJ
J'extrait des zones selon l'identifiant du début de chaque lignes que
je recopie dans mon cvs.
Voici le code:

Option Explicit
Const ForReading = 1, ForWriting = 2
Dim fso, fsofolder, TRIB, collec_file, fic_file, f_type, vbCancel,
objShell, fileIn, fileOut, COLO, strIn, Sline,CE

Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")

TRIB=InputBox("Voulez vous lancer le traitement des ETATs ?"& vbCrLf
&"Tapez le Nom de l'état pour lequel vous voulez générer
L'impression." & vbCrLf & vbCrLf & "Taper :" & vbCrLf & vbCrLf & "1
pour les AJ " & vbCrLf & "2 pour les DI " & vbCrLf & "3 pour DO " &
vbCrLf & "4 pour les RI"& vbCrLf,"EASY2XLS","1")
If vbCancel = 2 Then Wscript.quit
If TRIB= "" Then Wscript.quit
If TRIB <> 1 or 2 or 3 or 4 then Wscript.quit 'oh c'est pas jolie
If TRIB=1 Then f_type = "TCH_AJ" 'la aussi c'est pas jolie
If TRIB=2 Then f_type = "TCH_DI"
If TRIB=3 Then f_type = "TIP_DO"
If TRIB=4 Then f_type = "TIP_RI"

COLO="Code Enregistrement;Type de traitement;Nom du lot;Sequence
Lot;Numéro Image" 'Entête du fichier csv Non des colonnes excel
Set fileOut = fso.OpenTextFile("C:RECAP.CSV", ForWriting , True)
fileout.WriteLine COL 'Fabrication des colonnes

Set fsofolder = fso.GetFolder("C:DATAPACKAGE")
Set collec_file = fsofolder.Files
for each fic_file in collec_file
If Right(fic_file.Name, 3) = "dat" and left(fic_file.Name, 5) >> f_type Then
Do
Set fileIn = fso.OpenTextFile(fic_file, True)
Do While Not fileIn.AtEndOfStream
SLine = fileIn.ReadLine
CE=Mid(SLine,1,2) 'CE = Code enregistrement
If CE= "50" Then
strIn=Mid(SLine,1,2)'CE = 50 Cheque Code enregistrement
strIn=strIn & ";" & Mid(SLine,3,2)
strIn=strIn & ";" & Mid(SLine,5,2)
strIn=strIn & ";" & Mid(SLine,7,11)
fileOut.WriteLine strIn
ElseIf CE="60" Then
strIn=Mid(SLine,1,2)
strIn=strIn & ";" & Mid(SLine,3,2)
strIn=strIn & ";" & Mid(SLine,10,2)
strIn=strIn & ";" & Mid(SLine,20,11)
fileOut.WriteLine strIn
ElseIf CE="65" Then
strIn=Mid(SLine,1,2)'CE = 50 Cheque Code enregistrement
strIn=strIn & ";" & Mid(SLine,8,2)
strIn=strIn & ";" & Mid(SLine,8,2)
strIn=strIn & ";" & Mid(SLine,88,11)
fileOut.WriteLine strIn
Else
fileOut.Close
End If
Loop
End If ' <<<ERREUR Instruction attendue
Next

Set fileIn = Nothing
Set fileOut = Nothing

Si quelqu'un peut me donner un coup de pouce SVP ?


J'ai essayé d'en refaire un bout ;-)
Non testé ;-(

Option Explicit
Const ForReading = 1, ForWriting = 2
Dim fso, fsofolder, collec_file, fic_file, f_type
Dim objShell, fileIn, fileOut, strIn, Sline, CE

Function Choix_etat()
Choix_etat = InputBox("Voulez vous lancer le traitement des ETATs ?" &
vbCrLf & "Tapez le N° de l'état pour lequel vous voulez générer
l'impression." & vbCrLf & vbCrLf & "Taper :" & vbCrLf & vbCrLf & "1> pour
les AJ " & vbCrLf & "2 pour les DI " & vbCrLf & "3 pour DO " & vbCrLf & "4
pour les RI" & vbCrLf, "EASY2XLS", "1")
Choix_etat = Trim(Choix_etat)
End Function

Select Case Choix_etat()
Case "1" f_type = "TCH_AJ"
Case "2" f_type = "TCH_DI"
Case "3" f_type = "TIP_DO"
Case "4" f_type = "TIP_RI"
Case Else
WScript.Echo "Traitement annulé !" ' Prévenir l'utilisateur de
l'annulation du script
WScript.Quit
End Select

Set fso = CreateObject("Scripting.FileSystemObject")
Set fileOut = fso.OpenTextFile("C:RECAP.CSV", ForWriting, True)
fileOut.WriteLine "Code enregistrement;Type de traitement;Nom du lot;Sequence
lot;Numéro Image"
Set fsofolder = fso.GetFolder("C:DATAPACKAGE")
Set collec_file = fsofolder.Files
For Each fic_file In collec_file
If Right(fic_file.Name, 3) = "dat" And Left(fic_file.Name, 6) = f_type
Then
Set fileIn = fso.OpenTextFile(fic_file, ForReading)
Do While Not fileIn.AtEndOfStream
SLine = Trim(fileIn.ReadLine)
CE= Left(SLine, 2) 'CE = Code enregistrement
If CE = "50" Then
strIn = CE
strIn = strIn & ";" & Mid(SLine, 3, 2)
strIn = strIn & ";" & Mid(SLine, 5, 2)
strIn = strIn & ";" & Mid(SLine, 7, 11)
ElseIf CE = "60" Then
strIn = CE
strIn = strIn & ";" & Mid(SLine, 3, 2)
strIn = strIn & ";" & Mid(SLine, 10, 2)
strIn = strIn & ";" & Mid(SLine, 20, 11)
ElseIf CE = "65" Then
strIn = CE
strIn = strIn & ";" & Mid(SLine, 8, 2)
strIn = strIn & ";" & Mid(SLine, 8, 2) ' ? étrange ?
strIn = strIn & ";" & Mid(SLine, 88, 11)
End If
Select Case CE
Case "50", "60", "65" fileOut.WriteLine strIn
End Select
Loop
End If
Next
fileIn.Close
fileOut.Close
Set fileIn = Nothing
Set fileOut = Nothing


d'abord merci à Fred et jbongran,

Carnaval oblige (et oui c'est sacré aux antilles, Fred m'a encore
démasqué) je retourne sur ce petit projet qu'aujourd'hui.Il faut que je
digère toutes les infos. J'aime beaucoup le Select Case Choix_etat() de
jbongran.
Mais il semblerait que j'ai un Pb avec mon format de fichier, il est de
longueur 1024 et en plus il contient des zéro binaires (au lieu de 20
en hexa) Tout pour plaire en quelque sorte.

gilles






Avatar
---DGI972---
Le 24/02/2006, Fred a supposé :
Dans : news:%
Bonjour !


Bonjour,

Juste par curiosité :
- comment se fait la conversion d'une majuscule accentuée, en
minuscule ? Avec d'autres langages, j'ai des comportement curieux,
variables selon le code-page utilisé (c-à-dire la même routine
retourne des résultats pouvant être différents, sur des machines
différentes)


MsgBox Lcase("É")
La conversion se fait bien : É donne é
Le jeu de caractère utilisé est celui de windows.
Mais cela vient sans doute de l'enregistrement du vbs voir plus bas.
Je n'ai pas testé avec tous les caractères accentués.

- comment se fait la conversion, si l'extension
contient des caractères unicode ? Retrouver les minuscules unicode,
c'est... d'autres méthodes.


Je ne sais pas trop dans ce cas. Tout ce que je peux dire c'est qu'un essai
avec un caractère accentué de code supérieur à 255 fonctionne bien (il n'y a
pas ambiguïté comme avec le É qui a le même code en 1252 et en Unicode).

MsgBox Lcase(ChrW(264))
ou
MsgBox LCase("Ĉ") (à condition d'enregistrer en Unicode bien sûr)

donne bien ĉ (264 est le code Unicode de Ĉ)
Cela semble se confirmer avec quelques autres essais.


Pas cool je me bat avec la routine

Set fso = CreateObject("Scripting.FileSystemObject")
Set fsofolder = fso.GetFolder("C:EASYMIXDATAPACKAGE")
Set collec_file = fsofolder.Files
For Each fic_file In collec_file
If Right(fic_file.Name, 3) = "dat" And Left(fic_file.Name, 6) =
f_type Then
fic_file.Copy ("C:TIP" & f_type & ".dat")
'Function 0bin(fich_file)
End If
Next

c'est pas récurcif cette routine.
Tous les sous répertoires ne sont pas scrutés avec "f-type"*.dat
cela fonctionne plus ou moins lorsqu'il y a un fichier dans PACKAGE.
je suis preneur de la version tous les répertoires et sous répertoires
SVP.
Merci


Avatar
Fred
Dans : news:,
---DGI972--- disait :


Pas cool je me bat avec la routine

Set fso = CreateObject("Scripting.FileSystemObject")
Set fsofolder = fso.GetFolder("C:EASYMIXDATAPACKAGE")
Set collec_file = fsofolder.Files
For Each fic_file In collec_file
If Right(fic_file.Name, 3) = "dat" And Left(fic_file.Name, 6) > f_type Then
fic_file.Copy ("C:TIP" & f_type & ".dat")
'Function 0bin(fich_file)
End If
Next

c'est pas récurcif cette routine.


Tu n'as pas cela dans tes tablettes ? ;-)

Tous les sous répertoires ne sont pas scrutés avec "f-type"*.dat
cela fonctionne plus ou moins lorsqu'il y a un fichier dans PACKAGE.
je suis preneur de la version tous les répertoires et sous répertoires


Il faut que tu crées un Sub pour pouvoir réaliser ton traitement
récursif.
Un début d'algo non testé : la procédure Traitement prend en paramètre
un répertoire.

Sub Traitement(oFolder)
For Each oFile In oFolder.Files
'Ici tu traites les fichiers du répertoire oFolder
'........
Next
For Each oSubFolder in oFolder.SubFolders
'Ici tu appelles le même traitement pour
'tous les sous-répertoires de oFolder
Traitement oSubFolder
Next
End Sub

Il suffit ensuite d'initialiser le traitement avec ton répertoire
racine.

Traitement fso.GetFolder("C:EASYMIXDATAPACKAGE")

Bonne continuation !

--
Fred
http://www.cerbermail.com/?3kA6ftaCvT

Avatar
---DGI972---
Dans : news:,
---DGI972--- disait :


Pas cool je me bat avec la routine

Set fso = CreateObject("Scripting.FileSystemObject")
Set fsofolder = fso.GetFolder("C:EASYMIXDATAPACKAGE")
Set collec_file = fsofolder.Files
For Each fic_file In collec_file
If Right(fic_file.Name, 3) = "dat" And Left(fic_file.Name, 6) >> f_type Then
fic_file.Copy ("C:TIP" & f_type & ".dat")
'Function 0bin(fich_file)
End If
Next

c'est pas récurcif cette routine.


Tu n'as pas cela dans tes tablettes ? ;-)

Tous les sous répertoires ne sont pas scrutés avec "f-type"*.dat
cela fonctionne plus ou moins lorsqu'il y a un fichier dans PACKAGE.
je suis preneur de la version tous les répertoires et sous répertoires


Il faut que tu crées un Sub pour pouvoir réaliser ton traitement récursif.
Un début d'algo non testé : la procédure Traitement prend en paramètre un
répertoire.

Sub Traitement(oFolder)
For Each oFile In oFolder.Files
'Ici tu traites les fichiers du répertoire oFolder
'........
Next
For Each oSubFolder in oFolder.SubFolders
'Ici tu appelles le même traitement pour
'tous les sous-répertoires de oFolder
Traitement oSubFolder
Next
End Sub

Il suffit ensuite d'initialiser le traitement avec ton répertoire racine.

Traitement fso.GetFolder("C:EASYMIXDATAPACKAGE")

Bonne continuation !


Merci fred
j'ai mis cela en pratique mais il y a tjs un mais Je voudrais
concatener en 1 seul fichier C:TIPTCH_AJ.dat tous les fichiers
TCH_AJXXXXXX.dat qui se trouve dans les sous répertoires du répertoire
de base C:EASYMIXDATAPACKAGE, puis je vais lire ce fichier est le
découper en zone pour l'écrire dans le fichier C:TIPRECAP.CSV (je
n'ai pas encore fait la découpe alors je lis complêtement je le recopie
dans le fichier C:TIPRECAP.CSV pour les test)
Il n'a pas de récursirvité dans la recherche des fichiers dat.
Même en mettant à la main un fichier C:TIPTCH_AJ.dat il ne se recopie
pas dans le fichier csv
je suis dégouté il y pas un deboguer de vbsript avec des points
d'arrêt, moi j'écris mes vbs avec Pspad et je craque

voici le début de code:


Option Explicit
Const ForReading = 1, ForWriting = 2
Dim fso, oFolder, oFile, oSubFolder, f_type
Dim objShell, fileIn, fileOut, strIn, Sline, CE

Function Choix_etat()
Choix_etat = InputBox("Voulez vous lancer l'impression des ETATs ?"
& vbCrLf & "Tapez le N° de l'état pour lequel vous voulez générer
l'impression." & vbCrLf & vbCrLf & "Taper :" & vbCrLf & vbCrLf & "1>
pour les AJ " & vbCrLf & "2> pour les DI " & vbCrLf & "3> pour DO " &
vbCrLf & "4> pour les RI" & vbCrLf, "EASY2XLS", "1")
Choix_etat = Trim(Choix_etat)
End Function

Select Case Choix_etat()
Case "1" f_type = "TCH_AJ"
Case "2" f_type = "TCH_DI"
Case "3" f_type = "TIP_DO"
Case "4" f_type = "TIP_RI"
Case Else
WScript.Echo "Traitement annulé !" ' Prévenir l'utilisateur de
l'annulation du script
WScript.Quit
End Select

Set fso = CreateObject("Scripting.FileSystemObject")

Sub Traitement(oFolder)
For Each oFile In oFolder.Files
If Right(oFile.Name, 3) = "dat" And Left(oFile.Name, 6) =
f_type Then
o_File.Copy ("C:TIP" & f_type & ".dat")
End If
Next
For Each oSubFolder in oFolder.SubFolders
Traitement oSubFolder
Next
End Sub

Traitement fso.GetFolder("C:EASYMIXDATAPACKAGE")

Set fileOut = fso.OpenTextFile("C:TIPRECAP.CSV", ForWriting, True)
fileOut.WriteLine "Code Enregistrement;Type de traitement;Nom du
Lot;Sequence Lot;Numéro Image;Intitulé du compte;Code Banque;Code
guichet;N° Compte;Code Emetteur;Montant"

Set fileIn = fso.OpenTextFile("C:TIP" & f_type & ".dat", ForReading)
Do While Not fileIn.AtEndOfStream
SLine = fileIn.Readline
fileOut.Write strIn
Loop
fileOut.Close
Set fileIn = Nothing
Set fileOut = Nothing


Avatar
jbongran
---DGI972--- wrote:
[...]
Sub Traitement(oFolder)
For Each oFile In oFolder.Files
If Right(oFile.Name, 3) = "dat" And Left(oFile.Name, 6) > f_type Then
o_File.Copy ("C:TIP" & f_type & ".dat")
End If
Next
For Each oSubFolder in oFolder.SubFolders
Traitement oSubFolder
Next
End Sub

Traitement fso.GetFolder("C:EASYMIXDATAPACKAGE")


il sort d'où le o_File de o_File.Copy ("C:TIP" & f_type & ".dat") ?
Essaye en mettant Option Explicit (obligation de déclarer les variables
avant de pouvoir les utiliser) en début de script
Egalement, pour faire les debug, ne pas utiliser (lire mettre een
commentaire) les eventuels On Error ...

Voici le copier/coller de l'aide vbscript concernant la méthode copie:
Copie un fichier spécifié d'un emplacement à un autre.
object.Copy( destination[, overwrite] );
Arguments
object
Requis. Doit toujours correspondre au nom d'un objet File ou Folder.
destination
Requis. Emplacement de destination où le fichier doit être copié. Les
caractères génériques ne sont pas acceptés.
overwrite
Facultatif. Valeur booléenne qui est True (vraie) par défaut si les fichiers
ou les dossiers existants doivent être écrasés ; False (fausse) dans le cas
contraire.

1 2 3