IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBScript Discussion :

Extraction d'informations dans les noms de fichiers - Problèmes avec StrComp, InStr, Left et Right


Sujet :

VBScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Géologue
    Inscrit en
    Septembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Niger

    Informations professionnelles :
    Activité : Géologue
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 41
    Par défaut Extraction d'informations dans les noms de fichiers - Problèmes avec StrComp, InStr, Left et Right
    Bonjour,
    Je viens vers vous avec une question trivial ... mais dont je ne me sort pas.

    Je cherche à faire un script pour vérifier des noms de fichiers.

    Ces noms doivent tous être au même format et contenir +/- les mêmes informations. Ils sont du type (du moins en partie) :
    FFFFXXXB_SSS(S)XXX(X)_AAMMDD_U/DN avec :
    FFFFXXXB : Nom du forage (4 lettres) et n° du forage (3 chiffres) et un B dans le cas des forages bis.
    SSS(S)XXX(X) : Sonde (mnémonique 3/4 lettres) et n° de série (3/4 chiffres),
    AAMMDD : Date au format Année, Mois, Jour,
    U/D : U pour log UP (à la montée) et D pour log down (à la descente),
    N : nombre de 1 à n. Facultatif, n’est utilisé que si l’on est obligé de faire plusieurs enregistrements avec la même sonde, à la descente
    et/ou à la montée.

    Les fichiers quand a eux sont répartis, en fonction de leurs types et contenu dans divers répertoires et sous répertoires.
    - L’ensemble des données est rangé dans un répertoire DATA
    - Il contient les sous répertoires suivant :
    o Un répertoire par forage
     Un répertoire DB
     Un répertoire DI
     Un répertoire DT
     Un répertoire GYRO

    Pour le moment j’en suis au début ... et je reviens à l’écriture après une longue absence et une toute petite expérience précédente.

    Mon script sait parcourir les répertoires et extraire le nom du forage.

    Je bute dans mon premier Sub sur l’extraction des données de la seconde partie du nom.
    J’ai essayé 2 manières différentes et aucune ne fonctionne pas.
    - La première ligne 85 à 89
    - La seconde ligne 94 à 96 en remarque '

    Les MsgBox me servent à voir si j’ai les bonnes informations et ce qui est donné aux lignes 82 à 84 est bon ...

    Mais ce sont les lignes mentionnés qui M.... Pouvez vous me dire ou se trouve le problème, Je vous remercie par avance, du fond du désert, pour votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
    Option Explicit 'Déclaration obligatoire des variables
    'Corps de script
    DIM obFolder, objShell, FSO, PATH
    'Sub ProcessFolder
    DIM obSubFolder, StrFolderName
     
    'Sub Db
    DIM obFolder2, nDeFichiers, strParFolderName, obFile, strFileName
    DIM strP1Nomfichier, strP2NomFichier, strP3Nomfichier 
    DIM TnomFichier, StrP2aNomFichier, StrP2bNomFichier
     
    'Corps de script
    'Get Application object of the Windows shell.
    	Set objShell = WScript.CreateObject("Shell.Application")
    'Get access to script folder And create the resulting file in it
    	Set FSO = CreateObject("Scripting.FileSystemObject")
    	PATH = FSO.GetParentFolderName(wscript.ScriptFullName) & "\"
     
    'Ask the user to select a folder - Répertoire à partir duquel va débuter le traitement
    	set obFolder = objShell.BrowseForFolder (0,"Select the folder to process",1)
     
    	If Not obfolder IS Nothing Then 'si obfolder n'est pas rien!
    		'MsgBox "1 - je suis la"
    		ProcessFolder FSO, PATH, obFolder.self.Path
    		MsgBox "End !" 'à laisser
    	Else
    		MsgBox "Cancel" 'à laisser
    	End If
     
     
    Sub ProcessFolder(FSO, PATH, FolderPath) 'PATH indispensable
    	'Get access to the folder
    	Set obFolder = FSO.GetFolder(FolderPath) 'si actif obfolder devient le chemin!
     
    	'Loop on all the subFolders And process each of them
    	For Each obSubFolder In obFolder.SubFolders
    		'StrFolderName = FSO.GetParentFolderName (obSubFolder) ' Cette ligne donne le bon rep dans le sub, mais ne fait que Db!
    		StrFolderName = obSubFolder.Name 'Cette ligne ne donne pas le bon rep dans le sub, mais fait tous les sub!
    		'MsgBox "Sub Proc fold - repertoire : " & StrFolderName 'liste bien les noms des répertoires
    		If (InStr(1, StrFolderName, "DB", 1) > 0) Then Db FSO, FolderPath
    		If (InStr(1, StrFolderName, "LAS20", 1) > 0) Then Las20 FSO, FolderPath
    		If (InStr(1, StrFolderName, "DI", 1) > 0) Then Di FSO, FolderPath
    		If (InStr(1, StrFolderName, "DT", 1) > 0) Then Dt FSO, FolderPath
    		If (InStr(1, StrFolderName, "2018", 1) > 0) Then Gyro FSO, FolderPath 'attention utilisation d'une année!!!!
    	Next
    	'Loop on all the subFolders And process each of them
    	For Each obSubFolder In obFolder.SubFolders
    		ProcessFolder FSO, PATH, obSubFolder.Path
    	Next
    End Sub
     
    SUB Db (FSO, FolderPath)
    	MsgBox "Yes ... sub Db!"
    	'Get access to the folder / Est-ce utile, oui car si non on reste dans le repéertoire précédant!! cf. remarque ci-dessous!!
    	Set obFolder2 = FSO.GetFolder(FolderPath & "\DB") 'si actif obFolder2 devient le chemin!
    	strParFolderName = Right(obFolder2, 11)
    	'Extraire le nom du réppertoire parent qui est en fait le nom du forage de 7 à 8 caractères
    	If Left (strParFolderName,1) = "\" Then strParFolderName = Mid(strParFolderName,2,7) Else strParFolderName = Mid(strParFolderName,1,8)
    	'Extraire le nombre de fichier du repertoire	
    	nDeFichiers = FSO.GetFolder(FolderPath& "\DB").Files.Count
     
    		'Verifier si nombre paire (en principe toujours 2 fichiers par log dans les DB! un fichier hed et un fichier log
    		If ((nDeFichiers/2)-CInt(nDeFichiers/2))<>0	Then MsgBox "ATTENTION il y a " & nDeFichiers & " fichiers. C'est un nombre impaire!",16
     
    		'Vérifie la première partie du nom
    		For Each obFile In obFolder2.Files
    		strFileName = obFile.Name
    		'Coupe le nom de fichier en utilisant _ comme séparateur (3 parties...)
    		TnomFichier = Split(obFile.Name,"_",-1)
    		'Attribut aux variable une partie du non de fichier
    			strP1Nomfichier = TnomFichier(0)
    			strP2Nomfichier = TnomFichier(1)
    			strP3Nomfichier = TnomFichier(2)
    			If strParFolderName <> strP1Nomfichier Then MsgBox "Sub Db - attention au nom du fichier : " & obFile.Name, 16 '16 affiche message critique ....
    'Ajouter une possibilité de correction
    'Si pas correction demander si on efface le fichier - Voir si on peut le déplacer dans la corbeille au cas ou!
    'voir si on peut revenir en début de boucle
     
    		'Vérification de la seconde partie du nom du fichier 8 car ou moins, et avant un_
    		'Extraction
    		MsgBox "str a Traiter : " & strP2NomFichier 'Renvoie le bon nom
    		MsgBox "Debut : " & Left(strP2NomFichier,4) ' renvoie bien DGGG ou DILx ....
    		MsgBox "Fin : " & Right(strP2NomFichier,4) ' renvoie bien le n° de serie
    		If (StrComp(Right(strP2NomFichier,4),"DGGG",1) = 0) Then MsgBox "1 - A traiter : " & strP2NomFichier : StrP2aNomFichier = Left(strP2NomFichier,4) AND strP2bNomFichier = Right(strP2NomFichier,4)
    		MsgBox "2nd partie : " & strP2bNomFichier 'Vide!
    		If (StrComp(Right(strP2NomFichier,3),"DIL",1) = 0) Then MsgBox "2 - A traiter : " & strP2NomFichier : StrP2aNomFichier = Left(strP2NomFichier,3) AND strP2bNomFichier = Right(strP2NomFichier,4)
    		MsgBox "2nd partie : " & strP2bNomFichier 'Vide!
    		If (StrComp(Left(strP2bNomFichier,1),"L",1) = 0) Then MsgBox "3 - A traiter : " & strP2NomFichier : StrP2aNomFichier = Left(strP2NomFichier,3)AND strP2bNomFichier = Right(strP2NomFichier,3) 
    		MsgBox "2nd partie : " & strP2bNomFichier 'Vide!
    		MsgBox "str a traiter : " & strP2NomFichier 'Ok!!!
    		MsgBox "sonde : " & StrP2aNomFichier & "  N de serie : " & strP2bNomFichier 'Tout est vide ... les lignes 97, 99 et 101 ne fonctionnent pas 
     
    		'If (InStr(1, strP2NomFichier, "DGGG", 1) = 0) Then MsgBox "1 - A traiter : " & strP2NomFichier : StrP2aNomFichier = Left(strP2NomFichier,4) AND strP2bNomFichier = Right(strP2NomFichier,4) Else
    		'If (InStr(1, strP2NomFichier, "DIL", 1) = 0) Then MsgBox "2 - A traiter : " & strP2NomFichier : StrP2aNomFichier = Left(strP2NomFichier,3) AND strP2bNomFichier = Right(strP2NomFichier,4) Else
    		'If (InStr(1, strP2bNomFichier, "L", 1) = 0) Then MsgBox "2 - A traiter : " & strP2NomFichier : StrP2aNomFichier = Left(strP2NomFichier,3) AND strP2bNomFichier = Right(strP2NomFichier,4)
    		'DGGG passe à la ligne 122 et renvoie type incompatible string DGG! code 800A00D ....
    		'MsgBox "2nd partie : " & strP2bNomFichier
    		'MsgBox "str a traiter : " & strP2NomFichier 
    		'MsgBox "sonde : " & StrP2aNomFichier & "  N de serie : " & strP2bNomFichier
     
    		Next
     
    	'En fin de Sub effacement des variables
    End Sub
     
    SUB Las20 (FSO, FolderPath)
    	MsgBox "Yes ... sub Las20!"
    	'Utiliser une variable obFolderX pour chaque sub!
    End Sub
     
    SUB Di (FSO, FolderPath)
    	MsgBox "Yes ... Sub Di!"
    End Sub
     
    SUB Dt (FSO, FolderPath)
    	MsgBox "Yes ... Sub Dt!"
    End Sub
     
    SUB Gyro (FSO, FolderPath)
    	MsgBox "Yes ... Sub Gyro!"
    	'Trouver un moyen simple pour aller dans le sous dossier ....
    End Sub

  2. #2
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 420
    Par défaut
    Salut
    Quelques remarques à propos de ton code :
    - Ligne 64 : La boite de message ne sera jamais affichée car, et jusqu'à preuve du contraire, a - a = 0 toujours et jamais <> 0
    Pour palier à cela, on utilisera If nDeFichiers Mod 2 <> 0 Then.
    - Lignes 84 à 92 : StrP2aNomFichier = Left(strP2NomFichier,4) AND strP2bNomFichier = Right(strP2NomFichier,4) : Là c'est difficile à comprendre : Tu affecte au d'un fichier une valeur booléenne !!!!!!
    S'il s'agit de concaténer les termes utilise plutôt l'opérateur + ou bien & à la place du AND
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  3. #3
    Membre averti
    Homme Profil pro
    Géologue
    Inscrit en
    Septembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Niger

    Informations professionnelles :
    Activité : Géologue
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 41
    Par défaut
    Bonsoir !

    Je te remercie rapidement pour ta réponse tant qu’internet fonctionne !

    Concernant la ligne 64, elle fonctionne ! Pour moi si tu prend la division d’un nombre impaire (avec des chiffre après la virgule donc) et que tu lui enlève la partie entière tu as bien une valeur différente de zéro. Non ? En tout les cas, ne t’en déplaise, cela fonctionne si le nombre de fichiers est impaire.

    Je vais tout de même tester le Mod et ta ligne de code.

    Concernant la suite, la je suis largué. Pourquoi parles-tu de valeur booléenne ?
    Les noms de fichier ne sont pas des string ? Les lignes 82 à 84 me renvoient via les MsgBox ce que je veux ou presque et je l’affine en suite dans les lignes 85, 87 et 89
    Dans le doute j’avais essayé Cstr pour transformer ma « variable » (est-ce le bon terme ?) en chaîne. Mais la non plus cela ne fonctionnait pas.

    Je ne veux pas concaténer, mais découper pour avoirs les deux partie, la première 3 ou 4 char en lettre et la seconde 3 ou 4 composée de 4 chiffres.

    Voili, voila !
    Bonne soirée à toi.

  4. #4
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 420
    Par défaut
    Une valeur booléenne peut aussi être obtenue avec des chaînes de caractères; essaie par exemple MsgBox "a"="b" Or "a" <> "b".
    Si ton but est d'avoir une partie du nom du fichier, remplace alors le (AND) par 2 points (:).
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  5. #5
    Membre averti
    Homme Profil pro
    Géologue
    Inscrit en
    Septembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Niger

    Informations professionnelles :
    Activité : Géologue
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 41
    Par défaut
    Re ....

    Cela ne fonctionne pas mieux avec les : ...
    Ci dessous un extrait du code.

    Ligne 1 à 3 j’ai les bonnes réponses.

    Aucune MsgBox pour les lignes 5 à 7 ... (et apparement un problème de boucle aussi car sur le second fichier il me manque une lettre !)

    La ligne 9 donne la bonne réponse comme la ligne 10.
    Les lignes 5 à 7 n’ayant pas fonctionnées la ligne 11 est vide !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    		MsgBox "str a Traiter : " & strP2NomFichier
    		MsgBox "Debut : " & Left(strP2NomFichier,4) ' renvoie bien DGGG ou DILx ....
    		MsgBox "Fin : " & Right(strP2NomFichier,4)
     
    		If (InStr(1, strP2NomFichier, "DGGG", 1) = 0) Then MsgBox "1 - A traiter : " & strP2NomFichier : StrP2aNomFichier = Left(strP2NomFichier,4) : strP2bNomFichier = Right(strP2NomFichier,4) Else
    		If (InStr(1, strP2NomFichier, "DIL", 1) = 0) Then MsgBox "2 - A traiter : " & strP2NomFichier : StrP2aNomFichier = Left(strP2NomFichier,3) : strP2bNomFichier = Right(strP2NomFichier,4) Else
    		If (InStr(1, strP2bNomFichier, "L", 1) = 0) Then MsgBox "2 - A traiter : " & strP2NomFichier : StrP2aNomFichier = Left(strP2NomFichier,3) : strP2bNomFichier = Right(strP2NomFichier,4)
    		'DGGG passe à la ligne 122 et renvoie type incompatible string DGG! code 800A00D ....
    		MsgBox "2nd partie : " & strP2bNomFichier
    		MsgBox "str a traiter : " & strP2NomFichier 
    		MsgBox "sonde : " & StrP2aNomFichier & "  N de serie : " & strP2bNomFichier

  6. #6
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 420
    Par défaut
    Tu es sûr que tous les noms sont en majuscule ?
    Sinon remplace dans les lignes 5 , 6 et 7 : If (InStr(1, strP2NomFichier, "DGGG", 1) = 0) Then par
    If (InStr(1, UCase(strP2NomFichier), "DGGG", 1) = 0) Then en utilisant UCase.
    D'autre part, à la fin des lignes 5 et 6, il y a un "Else" qui traine sans "End If" !?!?
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. support des espaces dans les noms de fichiers
    Par menuge dans le forum Langage
    Réponses: 9
    Dernier message: 25/10/2006, 09h02
  2. suppression des espaces dans les noms de fichiers
    Par menuge dans le forum Général Python
    Réponses: 8
    Dernier message: 22/10/2006, 12h01
  3. Permettre "/" dans les noms de fichier
    Par rodj dans le forum Administration système
    Réponses: 10
    Dernier message: 23/08/2006, 09h44
  4. [BATCH] Espaces dans les noms de fichiers :|
    Par andlio dans le forum Windows
    Réponses: 1
    Dernier message: 03/08/2006, 03h42
  5. Réponses: 6
    Dernier message: 03/05/2006, 11h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo