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 :

Copier les resultat de comparaison entre des chaines de caractères dans un fichier


Sujet :

VBScript

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Copier les resultat de comparaison entre des chaines de caractères dans un fichier
    Bonjour

    Je vous expose mon problème

    J’ai un fichier .txt avec plusieurs lignes en format (Date;CountryKey) par exemple (012008;FR),
    j’ai un dossier « Y:\Source\Tests\Ajustement\FF_Sales_Line_Items\" » qui contient des fichiers .csv qui ont tous ou presque les même formats xx_xxxx_xxxx_xxxxx_FR_200801.csv (c’est un exemple)

    Dans mon script je voudrai écrire dans un fichier cible « Y:\Targe t\tgt ODS_Record_Date_Country_Key_exist.txt » les lignes dont la Date;CountryKey égale à la chaîne (FR_200801) dans les fichiers du repertoire!!!!!!

    Le script est le suivant :

    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
     
    Dim FSO, Fld, fileName
    Const ForAppending = 8
    ' lecture du dossier
    Set FSO = CreateObject("Scripting.FileSystemObject")
    srcRep = "Y:\Source\Tests\Ajustement\FF_Sales_Line_Items\"
    Set       f = FSO.OpenTextFile("Y:\Target\tgt ODS_Record_Date_Country_Key.txt", 1)
    Set ffWrite = FSO.OpenTextFile("Y:\Target\tgt ODS_Record_Date_Country_Key_exist.txt", ForAppending, true)
    	For each fileFld in FSO.GetFolder(srcRep).files
    		nameDate = ""
    		CountryKey = ""
    		if Right(fileFld.Name,3) = "csv" then   'les fichiers  *.csv
                    	'la date  
    			CountryKey = Mid(fileFld.Name,21,2)
    			nameDate   = Mid(fileFld.Name,28,2) & Mid(fileFld.Name,24,4)
                             	    while Not f.AtEndOfStream
                                         if  f.readLine  =  nameDate & ";" & countryKey then
                                             ffWrite.write ( f.readLine & vbCrlf )
                                          end if
                             	    Wend
    		end if
    		fileFld = ""
    	Next
    ffWrite.close
    f.close
    Le problème est que le programme ne boucle pas sur le deuxième fichier du dossier? Je n'arrive pas à trouver l'erreur

    Merci pour vos réponses

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Est ce qu'il y a un On Error Resume Next qui traine quelque part ? Si oui, vire le, relance le script, et donne nous l'erreur et la ligne incriminé.

    Vérifie à l'aide de MSGBOX que la premiere boucle se termine correctement.

    Note au passage que la boucle suivante t'amène à la fin du fichier dès le premier passage de la boucle foreach :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while Not f.AtEndOfStream
                   if  f.readLine  =  nameDate & ";" & countryKey then
                       ffWrite.write ( f.readLine & vbCrlf )
                   end if
             Wend
    Et comme tu ne fermes pas le fichier et ne le reouvres pas dans la boucle foreach, au deuxième passage, tu ne passes plus dans ton while.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    j'ai fait quelques modifications mais toujours pas de résultats :
    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
     
    Dim FSO, Fld, fileName
    Const ForWriting = 2
    ' lecture du dossier
    Set FSO = CreateObject("Scripting.FileSystemObject")
    srcRep = "Y:\Source\Tests\Ajustement\FF_Sales_Line_Items\"
    Set       f = FSO.OpenTextFile("Y:\Target\tgt ODS_Record_Date_Country_Key.txt", 1)
    	For each fileFld in FSO.GetFolder(srcRep).files
    		'les fichiers  *.csv
    		nameDate = ""
    		CountryKey = ""
    		'if Right(fileFld.Name,3) = "csv" then   ' ne prend pas les fichiers......"*a.csv"
                    	'la date
    			CountryKey = Mid(fileFld.Name,21,2)
    			nameDate   = Mid(fileFld.Name,28,2) & Mid(fileFld.Name,24,4)
                             while Not f.AtEndOfStream
                                LineF = f.readLine
                                if LineF = nameDate & ";" & countryKey then
                                   'msgbox LineF  & " -----" & nameDate & ";" &  CountryKey 
                                   Set ffWrite = FSO.OpenTextFile("Y:\Target\tgt_ODS_Record_Date_Country_Key_exist.txt", ForWriting, true)
                                   ffWrite.write ( LineF & vbCrlf )
                                   ffWrite.close
                                End if
                            Wend
    		'end if
    	Next
    f.close
    set f = nothing
    set ffWrite = nothing
    set FSO = nothing
    Je remarque deux choses :
    La condition if ne marche pas même s'il y a des correspondances;
    La boucle foreach renvoie Les comparaisons juste pour la première ligne du dossier (premier fichier) et s'arrête

    Sinon je n'ai pas d'erreur du type On Error Resume Next

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    rebonjour

    j'ai encore modifié mon script et ça marche cette fois si par contre les performances sont minimes surtout quand je l'intègre dans mon mapping SSIS

    Si vous pouvez l'optimiser je serai preneur

    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
     
    Dim FSO, Fld, fileName
    Const ForAppending = 8
    ' lecture du dossier
    Set FSO = CreateObject("Scripting.FileSystemObject")
    srcRep = "Y:\Source\Tests\Ajustement\FF_Sales_Line_Items\"
    Set       f = FSO.OpenTextFile("Y:\Target\tgt ODS_Record_Date_Country_Key.txt", 1)	
     while Not f.AtEndOfStream
            LineF = f.readLine
            For each fileFld in FSO.GetFolder(srcRep).files
    	   'les fichiers  *.csv
    	    nameDate = ""
    	    CountryKey = ""
    	    'if Right(fileFld.Name,3) = "csv" then   ' ne prend pas les fichiers......"*a.csv"
                    'la date
    		CountryKey = Mid(fileFld.Name,21,2)
    		nameDate   = Mid(fileFld.Name,28,2) & Mid(fileFld.Name,24,4)
    		Set ffWrite = FSO.OpenTextFile("Y:\Target\tgt_ODS_Record_Date_Country_Key_exist.txt", ForAppending, true)
                     if LineF = nameDate & ";" & countryKey then
                      'msgbox LineF  & " -----" & nameDate & ";" &  CountryKey
                        'msgbox LineF
                      ffWrite.write ( LineF & vbCrlf )
                     End if
                    ffWrite.close
    	    'end if
    	Next
      Wend
    f.close
    set f = nothing
    set ffWrite = nothing
    set FSO = nothing
    Merci

  5. #5
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Le On Error Resume Next est une ligne de code !!!
    Je n'ai aucune idée si tu m'as donnés tout ton script ou une portion, c'est pour cela que je t'ai demandé de l'enlevée si tu en as mis.
    Bon cela m'étonnerais que tu ais fait cela vu que tu ne savais pas ce que c'était.

    Pour le code suivant :
    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
    Dim FSO, Fld, fileName
    Const ForWriting = 2
    ' lecture du dossier
    Set FSO = CreateObject("Scripting.FileSystemObject")
    srcRep = "Y:\Source\Tests\Ajustement\FF_Sales_Line_Items\"
    Set       f = FSO.OpenTextFile("Y:\Target\tgt ODS_Record_Date_Country_Key.txt", 1)
    	For each fileFld in FSO.GetFolder(srcRep).files
    		'les fichiers  *.csv
    		nameDate = ""
    		CountryKey = ""
    		'if Right(fileFld.Name,3) = "csv" then   ' ne prend pas les fichiers......"*a.csv"
                    	'la date
    			CountryKey = Mid(fileFld.Name,21,2)
    			nameDate   = Mid(fileFld.Name,28,2) & Mid(fileFld.Name,24,4)
                             while Not f.AtEndOfStream
                                LineF = f.readLine
                                if LineF = nameDate & ";" & countryKey then
                                   'msgbox LineF  & " -----" & nameDate & ";" &  CountryKey 
                                   Set ffWrite = FSO.OpenTextFile("Y:\Target\tgt_ODS_Record_Date_Country_Key_exist.txt", ForWriting, true)
                                   ffWrite.write ( LineF & vbCrlf )
                                   ffWrite.close
                                End if
                            Wend
    		'end if
    	Next
    f.close
    set f = nothing
    set ffWrite = nothing
    set FSO = nothing
    J'aurais plutôt fait cela :
    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
    Dim FSO, Fld, fileName
    Const ForWriting = 2
    ' lecture du dossier
    Set ffWrite = FSO.OpenTextFile("Y:\Target\tgt_ODS_Record_Date_Country_Key_exist.txt", ForWriting, true) 'Il est très bien là, inutile de le mettre dans la boucle.
    Set FSO = CreateObject("Scripting.FileSystemObject")
    srcRep = "Y:\Source\Tests\Ajustement\FF_Sales_Line_Items\"
    	For each fileFld in FSO.GetFolder(srcRep).files
    Set       f = FSO.OpenTextFile("Y:\Target\tgt ODS_Record_Date_Country_Key.txt", 1) 'tu as besoin d'ouvrir le fichier à chaque tour de boucle. 
    		'les fichiers  *.csv
    		nameDate = ""
    		CountryKey = ""
    		'if Right(fileFld.Name,3) = "csv" then   ' ne prend pas les fichiers......"*a.csv"
                    	'la date
    			CountryKey = Mid(fileFld.Name,21,2)
    			nameDate   = Mid(fileFld.Name,28,2) & Mid(fileFld.Name,24,4)
                             while Not f.AtEndOfStream
                                LineF = f.readLine
                                if LineF = nameDate & ";" & countryKey then
                                   'msgbox LineF  & " -----" & nameDate & ";" &  CountryKey 
                                   ffWrite.write ( LineF & vbCrlf )
                                End if
                            Wend
                            f.close 'Si tu le fermes ici au prochain tour de boucle tu peux le réouvrir et tu es au début du fichier ;)
    	Next
    ffWrite.close 'ffWrite sert à stocker toutes les données pendant tout le script, il ne faut certainement pas le fermer dans le While
    set f = nothing
    set ffWrite = nothing
    set FSO = nothing
    Bon le plus propre aurait été de stocker le fichier f dans un tableau 1 fois et de parcourir ce tableau dans les boucles, mais bon c déjà cela.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  6. #6
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Merci
    J'avais procédé comme suit; et ça me donne les mêmes resultats par contre c'est pas top en temps de réponse.

    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
     
    Dim FSO, Fld, fileName
    Const ForAppending = 8
    ' lecture du dossier
    Set FSO = CreateObject("Scripting.FileSystemObject")
    srcRep = "Y:\Source\Tests\Ajustement\FF_Sales_Line_Items\"
    Set       f = FSO.OpenTextFile("Y:\Target\tgt ODS_Record_Date_Country_Key.txt", 1)	
     while Not f.AtEndOfStream
            LineF = f.readLine
            For each fileFld in FSO.GetFolder(srcRep).files
    	   'les fichiers  *.csv
    	    nameDate = ""
    	    CountryKey = ""
    	    'if Right(fileFld.Name,3) = "csv" then   ' ne prend pas les fichiers......"*a.csv"
                    'la date
    		CountryKey = Mid(fileFld.Name,21,2)
    		nameDate   = Mid(fileFld.Name,28,2) & Mid(fileFld.Name,24,4)
    		Set ffWrite = FSO.OpenTextFile("Y:\Target\tgt_ODS_Record_Date_Country_Key_exist.txt", ForAppending, true)
                     if LineF = nameDate & ";" & countryKey then
                      'msgbox LineF  & " -----" & nameDate & ";" &  CountryKey
                        'msgbox LineF
                      ffWrite.write ( LineF & vbCrlf )
                     End if
                    ffWrite.close
    	    'end if
    	Next
      Wend
    f.close
    set f = nothing
    set ffWrite = nothing
    set FSO = nothing
    ton code marche aussi et il est plus rapide

    Merci

  7. #7
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    oui je pense que le pc parcours plus rapidement un fichier texte que l'ensemble d'un répertoire et ses sous réprtoires, donc il vaut mieux répéter x fois la boucle du parcours du fichier de texte que celle du parcours du répertoire.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

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

Discussions similaires

  1. Mettre des chaines de caractères dans un tableau.
    Par dinaing dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 18/06/2010, 12h09
  2. Extraire des chaines de caractères dans un fichier
    Par cycy75 dans le forum Scripts/Batch
    Réponses: 16
    Dernier message: 27/03/2009, 14h56
  3. gestion des chaines de caractères dans champ memo
    Par pascalourox dans le forum IHM
    Réponses: 1
    Dernier message: 07/08/2008, 20h32
  4. Réponses: 2
    Dernier message: 17/06/2008, 21h14

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