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 :

Suppression lignes et caractères sur chaque ligne


Sujet :

VBScript

  1. #21
    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 : 71
    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
    J’espère que ce qui suit répond à tes attentes(avec en plus les fichiers utilisés pour le test) :
    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
    Option Explicit
    ' Si la langue de l'OS est l'anglais, on doit remplacer "Feuil1" par "Sheet1" à la ligne 26.
        Const ForReading = 1
        Const ForWriting = 2
        Const FichExcel = "C:\Repertoire\Correspond.xls"
        Dim oFso, objFile, strLine, arrLines, NewText
        Dim I, oFile, xlTemp, Contenu
        Dim temp, oXL, oSheet, oBook
        ProcessFile
        DelEmptyLine
    '===========================
        Sub ProcessFile()
            Set oFso = CreateObject("Scripting.FileSystemObject")
            Set oXL = CreateObject("Excel.Application")
            Set oBook = oXL.Workbooks.Open(FichExcel)
            oXL.Visible = False
            Set oFso = CreateObject("Scripting.FileSystemObject")
            Set objFile = oFso.OpenTextFile("C:\Repertoire\TEST.txt", ForReading)
            Set oFile = oFso.OpenTextFile("C:\Repertoire\RESULTEST.txt", ForWriting, True)
            I = 1 ' Ici on doit mettre le numéro correct de la ligne de début du fichier excel
            While Not objFile.AtEndOfStream  
                strLine = objFile.ReadLine
                If strLine <> "" Then
                    oFile.WriteLine strLine ' On écrit la ligne telle qu'elle est
                    temp = Mid(strLine, 7)  ' On supprime les 6 premiers caractères de la ligne lue
                    xlTemp = oBook.Worksheets("Feuil1").Cells(I, 2) ' on récupère le code à 6 caractères
                    oFile.WriteLine xlTemp & temp ' on écrit une autre ligne avec le code au début
                    I = I + 1 ' on incrémente le numéro de la ligne dans le fichier excel            .
                End If
            Wend
            oFile.Close
            objFile.Close
            oXL.Quit    
        End Sub
    '=====================
        Sub DelEmptyLine() ' On supprime la dernière ligne vide
            Dim oFso
            NewText = ""
            Set oFso = CreateObject("Scripting.FileSystemObject")
            Set oFile = oFso.OpenTextFile("C:\Repertoire\RESULTEST.txt", ForReading, False)
           Contenu = oFile.ReadAll
           oFile.Close
           Set oFile = oFso.OpenTextFile("C:\Repertoire\RESULTEST.txt", ForWriting, True)
            arrLines = Split(Contenu, vbCrLf)
           For i = 0 To UBound(arrLines) - 2
             NewText = NewText & arrLines(i) & vbCrLf
           Next
            NewText = NewText & arrLines(UBound(arrLines)-1)
            oFile.Write NewText
            oFile.Close
            Set oFile = Nothing
            Set oFso = Nothing
        End Sub
    Fichiers attachés Fichiers attachés
    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

  2. #22
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par YLKweb Voir le message
    Je me vois mal repartir à zéro via Excel. Sans compter que le fichier initial n'est pas formaté pour s'ouvrir sous Excel
    Comme VBA & VBScript sont cousins de VB, tu ne repars pas de zéro, loin de là !
    Car VBA peut lire un fichier comme en VBScript, pas obligé de le lire dans une feuille de calculs.
    Qui plus est c'est du niveau d'un débutant …
    Et comme le tableau de correspondance est un fichier Excel, c'est plutôt évident !

    Mais bon, j'ai juste l'impression qu'à chaque fois qu'on te demande de modifier quelque chose,
    tu viens directement sur le forum pour le faire réaliser …

    _____________________________________________________________________________________________________
    L'effort fait les forts …

  3. #23
    Membre averti
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    36
    Détails du profil
    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2013
    Messages : 36
    Par défaut
    tu viens directement sur le forum pour le faire réaliser …
    @ Marc-L

    Bonjour à toi,

    Bah en fait, c'est tout à fait ça.

    Je n'ai aucune honte à dire que je ne suis pas développeur et que j'ai énormément d'autres sujets critiques et chronophages à traiter.
    Néanmoins, au départ d'un de mes collègues, je me suis retrouvé contraint de superviser certaines de ses applications bourrées de moulinettes de ce genre.
    Les gens du métier, comme la plupart d'entre vous, sauront à quel point il est difficile de remettre les mains dans le travail de quelqu'un d'autre, surtout en développement... Alors pour quelqu'un sans formation initiale en dev, imaginez !
    Alors, je préfère me tourner vers des professionnels aguerris du développement pour qui toute cette gymnastique coule de source plutôt que de tâtonner des semaines pour pondre une usine à gaz complètement bancale.

    La plupart du temps, je serre les dents et espère que tout aille pour le mieux sur ces applis, mais lorsqu'il y a problème ou une demande d'évolution ça se complique pour moi...
    Ce forum est orienté dev et entraide, alors oui, j'ai naïvement pensé pouvoir en bénéficier.
    Je ne force personne à me venir en aide, chacun est libre de passer son chemin. Surtout si l'idée est ici d'aider uniquement les gens capable de le faire eux-même (même si ça sonne un peu contre-sens pour le coup).
    Je comprendrais que ma demande puisse paraitre exagérée ou insurmontable. Et dans ce cas, aucun soucis, je n'en voudrais à personne et croirais de bonne foi les dire de personnes dotées de compétences que je n'ai pas la prétention de posséder.

    Mais si ne serait-ce qu'une personne daigne m'accorder cinq minutes de son temps (qui équivaudraient pour moi à 5 semaines pour arriver à un résultat même pas au même niveau) alors je lui en serais vraiment reconnaissant.

    Et au vu de mes précédentes expériences sur ce forum, je sais qu'il y a des personnes ayant cette mentalité, et je les en remercies encore.

    Pour en revenir à ta proposition en elle-même, soit.
    VBS et VBA sont effectivement très proches. Il est certainement faisable de reprendre le tout sur du VBA, mais encore une fois, je n'en ai pas la connaissance et j'ai même encore moins manipulé le VBA que le VBS... Je sais, je suis une sombre buse en dev... Quel qu'il soit (le seul semblant de dev que je suis capable de faire se limite au batch).
    Ceci dit, tu as très probablement plus de recul que moi là-dessus et je ne rentrerais pas dans ce débat avec toi.

    Par contre, quand je parlais du fichier initial non formaté pour s'ouvrir sous excel, je ne parlais pas du script initial mais bien de mon fichier source, celui dont je cherche à modifier le contenu.
    Mais bon, je supposes que tu l'avais saisi.

    En bref, je suis preneur si tu as une idée sur ta proposition, si tu as un peu de temps à perdre bien entendu, sinon, pas de problème, je comprendrais.

    @ l_autodidacte

    Bonjour à toi !

    Tu m'impressionnes toujours autant !
    Je ne sais pas si ton pseudo a un fond de vérité, mais si c'est le cas, c'est encore plus bluffant (enfin, pour un néophyte du développement comme moi en tous cas).

    Merci pour ce script aux petits oignons si rapidement pondu. En un post tu as réussi à cibler le besoin.
    Je l'ai testé avec mes fichiers et ça fonctionne pratiquement. Mais c'est de ma faute le "pratiquement".
    En fait, j'ai juste oublié de préciser un détail dont je me suis aperçu en testant ton script.

    Le truc c'est que mon exemple n'était pas forcément très représentatif car les codes que j'ai mis se suivaient parfaitement tout comme dans le fichier excel.
    En réalité, les codes sont tous dans le fichier excel mais pas nécessairement dans le fichier texte...
    Donc on ne peut pas simplement suivre le fil du fichier en incrémentant de 1 à chaque fois au risque de créer un décalage et des incohérences.

    Je m'explique en image en reprenant tes fichiers :

    Nom : 2015-06-29_17-22-04.png
Affichages : 220
Taille : 77,3 Ko

    En clair, il faudrait pouvoir récupérer le code de début de ligne dans une variable, le rechercher dans toute la première colonne du fichier excel et récupérer la valeur correspondante dans la colonne d'en face (une sorte de rechercheV mais portée sur du VBS)...
    C'est là que ça se corse.

    Dis-moi si tu as une idée sur ce point, sinon, ce n'est pas grave, merci déjà pour le travail fourni.


    D'avance merci à tous, même si vous décidez finalement de passer votre chemin (parce qu'il en faut du courage pour arriver au bout de mon post déjà).

  4. #24
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 140
    Par défaut
    Salut

    Je ne sais pas si j'ose je ne connais n'y ne pratique Excel.
    Mais cela semble plutôt de la logique à mettre en place, moi j'utiliserai un objet Dictionary.
    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
    	Sub ProcessFile()
    		Set oFso = CreateObject("Scripting.FileSystemObject")
    		Set oXL = CreateObject("Excel.Application")
    		Set oBook = oXL.Workbooks.Open(FichExcel)
    		oXL.Visible = False
    		Set oFso = CreateObject("Scripting.FileSystemObject")
    		Set objFile = oFso.OpenTextFile("C:\Repertoire\TEST.txt", ForReading)
    		Set oFile = oFso.OpenTextFile("C:\Repertoire\RESULTEST.txt", ForWriting, True)
    		I = 1 ' Ici on doit mettre le numéro correct de la ligne de début du fichier excel
    		'********************************************************************
    		Dim TblDico
    		Set TblDico = CreateObject("Scripting.Dictionary")
    		Do I <= oBook.Worksheets.Count  
    			TblDico.Add oBook.Worksheets("Feuil1").Cells(I, 1),  oBook.Worksheets("Feuil1").Cells(I, 2)
    			I = I + 1 ' on incrémente le numéro de la ligne dans le fichier excel
    		Loop
    		'********************************************************************
    		'I = 1 ' Ici on doit mettre le numéro correct de la ligne de début du fichier excel
    		While Not objFile.AtEndOfStream  
    			strLine = objFile.ReadLine
    			If strLine <> "" Then
    				oFile.WriteLine strLine ' On écrit la ligne telle qu'elle est
    				xlTemp = TblDico.Item(left(strLine,6)) ' on récupère le code à 6 caractères *****************
    				temp = Mid(strLine, 7)  ' On supprime les 6 premiers caractères de la ligne lue
    				'xlTemp = oBook.Worksheets("Feuil1").Cells(I, 2) ' on récupère le code à 6 caractères
    				oFile.WriteLine xlTemp & temp ' on écrit une autre ligne avec le code au début
    				'I = I + 1 ' on incrémente le numéro de la ligne dans le fichier excel			.
    			End If
    		Wend
    		oFile.Close
    		objFile.Close
    		oXL.Quit	
    	End Sub
    Je n'ai pas fait l'essai, mais l_autodidacte sera à même de faire les corrections adéquates, si l'utilisation de l'objet Dictionary lui semble une solution pratique.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  5. #25
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Si le fichier source est un quelconque fichier texte, VBA - et non pas Excel - peut lire directement le fichier comme en VBScript
    sans passer par la case feuille de calculs, ce qui peut-être dommage question commodité, rapidité, …
    Il m'arrive de d'abord créer une procédure en VBA afin de contrôler les points cruciaux avant de la basculer en VBScript …

    Ceci re-précisé, un objet dictionary est une possibilité tout comme tout piloter en Excel
    ou encore utiliser ADODB donc sans ouvrir Excel, etc …

    Sinon avec un fichier source, le fichier Excel et un fichier du résultat désiré, ce serait plus simple …

    _____________________________________________________________________________________________________
    Découvrir, c’est voir la même chose que les autres et penser autrement. (Albert von Szent-Györgyi)

  6. #26
    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 : 71
    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
    Pour l'utilisation de l'objet Dictionay, c'est une possibilité parmi d'autres. Mais dans le cas présent, je n'en vois pas l'utilité puisqu'on passe par l'objet Excel.Application.(A vrai dire, je n'ai que très peu utilisé cet objet Dictionay)
    Ici, il est question de rechercher la ligne du fichier Excel qui correspond à une entrée du fichier source(Test.txt).
    Dans cette perspective, j'ai un peu manié le code précédent pour avoir :
    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
    Option Explicit
    ' Si la langue de l'OS est l'anglais, on doit remplacer "Feuil1" par "Sheet1" à la ligne 27.
        Const ForReading = 1
        Const ForWriting = 2
        Const FichExcel = "C:\Repertoire\Correspond.xls"
        Dim oFso, objFile, strLine, arrLines, NewText
        Dim I, oFile, xlTemp, Contenu
        Dim temp, oXL, oSheet, oBook
        ProcessFile
        DelEmptyLine
    '===========================
        Sub ProcessFile()
            Set oFso = CreateObject("Scripting.FileSystemObject")
            Set oXL = CreateObject("Excel.Application")
            Set oBook = oXL.Workbooks.Open(FichExcel)
            oXL.Visible = False
            Set oFso = CreateObject("Scripting.FileSystemObject")
            Set objFile = oFso.OpenTextFile("C:\Repertoire\TEST.txt", ForReading)
            Set oFile = oFso.OpenTextFile("C:\Repertoire\RESULTEST.txt", ForWriting, True)
            I = 1 ' Ici on doit mettre le numéro correct de la ligne de début du fichier excel
            While Not objFile.AtEndOfStream  
                strLine = objFile.ReadLine
                If strLine <> "" Then
                    oFile.WriteLine strLine ' On écrit la ligne telle qu'elle est
                    temp = Mid(strLine, 7)  ' On supprime les 6 premiers caractères de la ligne lue
                     ' on récupère le code à 6 caractères
                    xlTemp = Rechercher_Correspondance(Left(strLine,6),oBook.Worksheets("Feuil1").Cells(I, 1))
                    oFile.WriteLine xlTemp & temp ' on écrit une autre ligne avec le code au début
                    I = I + 1 ' on incrémente le numéro de la ligne dans le fichier excel            .
                End If
            Wend
            oFile.Close
            objFile.Close
            oXL.Quit    
        End Sub
    '===============================
    Function Rechercher_Correspondance(strValueFromSource,strFromCorrespond)
            Dim Ret
            I = 1
            Do While strFromCorrespond <> "" ' tant qu'une ligne contienne des données
              strFromCorrespond = oBook.Worksheets("Feuil1").Cells(I, 1) ' ligne n°I de la colonne 1
              If strFromCorrespond = strValueFromSource Then ' si OK on récupère la valeur
                 Ret = oBook.Worksheets("Feuil1").Cells(I, 2) ' valeur de la colonne 2 correspondant
                 ' au code de 6 caractères de la colonne 1. Puis on sort de la boucle
                 Exit Do
              End If
              I = I + 1 ' On passe à la ligne suivante si pas trouvé
            Loop
            Rechercher_Correspondance = Ret
    End Function
    '=====================
        Sub DelEmptyLine() ' On supprime la dernière ligne vide
            Dim oFso
            NewText = ""
            Set oFso = CreateObject("Scripting.FileSystemObject")
            Set oFile = oFso.OpenTextFile("C:\Repertoire\RESULTEST.txt", ForReading, False)
           Contenu = oFile.ReadAll
           oFile.Close
           Set oFile = oFso.OpenTextFile("C:\Repertoire\RESULTEST.txt", ForWriting, True)
            arrLines = Split(Contenu, vbCrLf)
           For i = 0 To UBound(arrLines) - 2
             NewText = NewText & arrLines(i) & vbCrLf
           Next
            NewText = NewText & arrLines(UBound(arrLines)-1)
            oFile.Write NewText
            oFile.Close
            Set oFile = Nothing
            Set oFso = Nothing
        End Sub
    Fichiers attachés Fichiers attachés
    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

  7. #27
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Bonjour, bonjour !

    YLKweb, quel est le nombre de lignes maximum du fichier texte source ?


    Citation Envoyé par YLKweb Voir le message
    […] créer ensuite un ligne identique (qui peut être en fin de fichier d'ailleurs)
    Je l'ai donc appliqué dans la p'tite procédure VBScript suivante
    (adapter les constantes des noms du répertoire et des fichiers source ainsi que le nom du fichier résultat en ligne n°35) :

    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
    Const REP = "D:\Tests4Noobs\Data\", DOC = "Correspond.xls", TXT = "TEST.txt"
     
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(REP & DOC) And .FileExists(REP & TXT) Then
            With CreateObject("Excel.Application")
                With .Workbooks.Open(REP & DOC).Worksheets(1)
                    AD = .Cells(1).CurrentRegion.Address
     
                    With .QueryTables.Add("TEXT;" & REP & TXT, .Cells(6))
                               .AdjustColumnWidth = False
                              .PreserveFormatting = True
                                    .RefreshStyle = 0
                               .TextFileParseType = 2
                         .TextFileColumnDataTypes = Array(2, 2)
                       .TextFileFixedColumnWidths = Array(6)
                       .Refresh False
                    End With
     
                    With .Cells(6).CurrentRegion
                        With .Offset(.Rows.Count).Columns
                             .Item(1).Formula = "=VLOOKUP(F1," & AD & ",2,FALSE)"
                             .Item(2).Formula = "=G1"
                        End With
     
                        With .CurrentRegion.Columns(1).Offset(, 5)
                             .Formula = "=F1&G1"
                                    T = Join(.Application.Transpose(.Value), vbCrLf)
                        End With
                    End With
                                 .Parent.Close False
                End With
                                 .Quit
            End With
     
            With .OpenTextFile(REP & "Result.txt", 2, True):  .Write T:  .Close:  End With
        End If
    End With
    J'attends un retour avant d'envisager la voie sans ouvrir Excel mais peut-être quelque peu gazéifière

    _____________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

  8. #28
    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 : 71
    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
    J'attends un retour avant d'envisager la voie sans ouvrir Excel mais peut-être quelque peu gazéifière
    D'après ce que j'ai pu comprendre, le résultat devrait être comme indiqué sur l'image A(selon mon code simpliste) alors que l'exécution de ton code donne celui de l'image B.
    Images attachées Images attachées   
    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

  9. #29
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut




    Non vu ses propres explications dans le post #16 du 25/06 dont l'extrait cité dans mon précédent message
    ainsi que dans son post #18 le lendemain, d'où mon intervention du post suivant signalant la simplicité sous Excel …
    J'en ai donc profité évidemment, ma procédure s'en trouvant de facto bien allégée !

  10. #30
    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 : 71
    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
    Si chacun de nous deux a compris quelque chose de différent que l'autre, ce sera à l'intéressé de le préciser.

    Moi, je me suis basé sur l'image qu'il a envoyé. C'est pour cela que j'ai dit que trop d'explications fait parfois perdre le bout du fil(post #17).
    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

  11. #31
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Les posts #16 & 18 indiquent les deux cas possibles …

    Mon autre procédure sans passer par Excel fonctionne déjà en pur VBA
    (pas d'ouverture de la source dans Excel ni recours à son modèle objet)
    mais avant de tenter la migration vers VBScript (autant un script se transfère sans souci en VBA,
    une procédure VBA ne passe pas toujours directement en VBScript, parfois il faut contourner …),
    j'attends le retour du demandeur et un ordre de grandeur du nombre de lignes maximum du fichier texte source, sa version d'Excel, …

  12. #32
    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 : 71
    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
    Il y a des gens qui se la coulent douce : Nous deux, nous débattons le problème sous différents angles et l'intéressé ne donne même pas signe de vie !!!
    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

  13. #33
    Membre averti
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    36
    Détails du profil
    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2013
    Messages : 36
    Par défaut
    Bonjour bonjour amis développeurs de l'impossible !

    Et désolé pour ce temps de réponse qui a pu vous sembler long mais j'avoues que c'était un peu le feu au boulot ces derniers temps...
    Cela dit, je suis passé sur le forum hier et j'ai vu vos réponses.
    De plus, je voulais prendre le temps de tester chacune de vos propositions, et c'est un minimum je pense, étant donné que de votre côté, vous aviez pris le temps de les formuler.

    Et je suis (une fois de plus) sur le ***... Ça marche du tonnerre.
    Encore merci, c'est exactement ce qu'il me fallait.

    Pour répondre à vos questions, c'est vrai que j'ai fourni un exemple montrant les lignes créées juste sous les lignes "modèles".
    Ceci dit, c'est vrai aussi que j'ai précisé que cela n'était pas du tout une obligation. Car au final, le fichier est intégré dans une base de donnée (donc l'ordre des lignes n'importe pas).

    Bref, les deux cas répondent parfaitement à la demande.

    Pour le reste, mon fichier texte initial fait près de 17000 lignes et est susceptible de croître avec le temps (assez lentement tout de même, il gagne tout au plus 200 ou 300 lignes par an en visant large).
    Sinon, j'utilises Excel 2010.

    D'autres questions ?

    Moi j'en aurais une par la suite.

  14. #34
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Merci du retour !

    De mon côté cela sent le sapin pour l'adaptation en VBScript de ma version sans ouvrir Excel mais accédant à un fichier xls …

    L'idéal alors serait d'exporter le fichier Excel dans un fichier texte,
    le script utilisant ce fichier pour la conversion, pas besoin d'Excel …

    Sinon quelle est ta question ?

  15. #35
    Membre averti
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    36
    Détails du profil
    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2013
    Messages : 36
    Par défaut
    Merci bien en tous les cas !
    Et à l_autodidacte aussi d'ailleurs, vous avez fait en un temps record un script que j'imaginais à peine faisable (avec mes maigres compétences dans le domaine tout du moins).
    Bravo les gars.

    Alors ma question va vous paraitre con mais le truc c'est que je me suis aperçu que les valeurs initiales que j'ai dans mon fichier source (le code sur 5 digit) et celles de la première colonne dans mon fichier excel sont réellement sur 5 caractères (et non 6 comme dans mes exemples où j'ai ajouté un 0 devant).
    Rien de bien sorcier pour adapter vos scripts afin qu'il lise les 5 premiers et non les 6 me direz-vous (enfin, j'imagines que je devrait pouvoir trouver ça).

    Par contre, afin que l'intégration puisse se faire comme il faut en base, un nombre fixe de caractère doit impérativement être lu sur chaque ligne du fichier final.
    Et si certaines lignes ont une combinaison de 5 et les autres de 6 ça va bloquer...
    Du coup, j'aimerais savoir s'il est compliqué de recopier la première ligne lue en y ajoutant un 0.

    Par exemple :

    Il lit 00010 dans le fichier TEST, il ecrit 000010 dans le RESULTEST et en dessous (ou en fin de fichier) il créé la ligne 259876 correspondante.

    Si vous n'avez rien compris (j’avoue qu'à expliquer, c'est pas forcément simple), ne vous en faites pas, je penses que je devrais pouvoir m'en tirer à force de bidouilles successives.
    Merci déjà du travail fourni, vous êtes vraiment des bêtes.
    Je ne suis pas orienté développement, mais j’avoue que cette compétence me rend admiratif, en toute honnêteté.

    Alors merci encore.

    Sinon, je n'avais pas répondu à ProgElecT, mais j'ai testé aussi ton code.
    Il m'affiche une erreur que je saisi mais n'arrive pas à corriger de moi-même...
    Visiblement tu n'as pas terminé la clause "Do".

    Nom : 2015-07-01_14-16-35.png
Affichages : 198
Taille : 18,3 Ko

    Mais merci de ton aide en tous cas !

  16. #36
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Comme déjà évoqué, c'est du niveau d'un débutant donc ce n'est pas difficile …

    Du moment qu'il y a une logique : cela veut dire que le fichier texte source est toujours sur 5 chiffres
    à convertir dans le fichier final sur 6 chiffres ?

    Et y-a-t-il donc la possibilité de lire la table de conversion dans un fichier texte et non pas dans un fichier Excel ?

    En en toute logique, le traitement devrait être effectué directement par le logiciel de la base de données !

  17. #37
    Membre averti
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    36
    Détails du profil
    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2013
    Messages : 36
    Par défaut
    Oui c'est du niveau d'un débutant, c'est pour ça que je précisais que ma question vous paraitrais con...

    En effet, le fichier source est toujours sur 5 chiffres et le final sera toujours sur 6 (plus simple de demander ensuite l'intégration des 6 premiers caractères dans la base).
    Et oui, la table de conversion peut être sous forme de fichier texte classique via une petite manip à mon niveau (oui oui il y en a).

    Pour le reste, je suis d'accord avec toi, toute cette usine à gaz pour alimenter la base ne devrait même pas exister sous cette forme... Mais ça, il faudrait le dire à mon collègue à l'origine du projet (et maintenant parti de la société).

    Sinon, je viens de bidouiller avec mes modestes notions et j'ai réussi à modifier vos scripts pour lire les combinaisons de 5 et non de 6 puis ajouter le 0 devant la première ligne retranscrite pour n'avoir que des combinaisons de 6 dans le fichier final.
    Bref, ça tourne parfaitement, et tout ça grâce à vous.

    Merci à vous et encore bravo !

    Je finalise malgré tout quelques tests pour être sûr et je repasse le topic en résolu.

  18. #38
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut




    Quel est le nombre de codes dans la table de conversion du fichier Excel actuel ?

    Sinon pour créer cette table en fichier texte, c'est simple via Enregistrer sous d'Excel,
    soit en Texte séparateur tabulation soit en CSV séparateur point-virgule, une préférence ?

    Autre point : que faire si le code d'une ligne du fichier source n'est pas dans la table de conversion ?

  19. #39
    Membre averti
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    36
    Détails du profil
    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2013
    Messages : 36
    Par défaut
    Salut salut !

    Ah pardon, tu voulais faire un essai en remodelant ton script pour le traiter avec une table de conversion en format texte ?
    Je n'avais pas saisi ça, mais j’avoue que ça peut m’intéresser car après quelques tests, ça fonctionne mais c'est très long...
    Je pense que le passage par l'excel n'est pas le plus simple surtout par rapport à la volumétrie (les 17000 lignes ça pique...).

    Et j’avoue que j'avais réussi à retoucher le script de l_autodidacte sans problème (car d'une structure qui m'est plus familière et en plus totalement commenté, merci à lui) mais le tiens me posait plus de problèmes...
    Il semble très expéditif et passe par des raccourcis qui me sont totalement inconnu ! Bref, si tu parviens à le remodeler, j'en serais enchanté.

    Après en effet, je peut faire un bête enregistrer sous mais je voulais automatiser la conversion du fichier.
    Pas de préférence par contre pour le choix du format, le plus léger des deux ! Même si entre le CSV et le texte-TAB pas de grosse différence à priori.

    Actuellement, la table de conversion excel compte la totalité des combinaisons à 5 chiffres, à savoir 99999...
    Il y a donc près de 100000 lignes dans ce tableau...
    Il n'y a donc aucune possibilité pour que le code du fichier source n’existe pas dans l'excel.
    A l'heure actuelle, seules 17000 combinaisons sont utilisées sur les 99999, mais ce chiffre grossit au fil du temps.

    Si ça peut aider, je post le script de l_autodidacte dans sa version revisitée par mes soins afin de convenir parfaitement aux besoins (ça change assez peu au final) :

    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
    Option Explicit
    ' Si la langue de l'OS est l'anglais, on doit remplacer "Feuil1" par "Sheet1" à la ligne 27.
        Const ForReading = 1
        Const ForWriting = 2
        Const FichExcel = "C:\Repertoire\Correspond.xlsx"
        Dim oFso, objFile, strLine, arrLines, NewText
        Dim I, oFile, xlTemp, Contenu
        Dim temp, oXL, oSheet, oBook
        ProcessFile
        DelEmptyLine
    '===========================
        Sub ProcessFile()
            Set oFso = CreateObject("Scripting.FileSystemObject")
            Set oXL = CreateObject("Excel.Application")
            Set oBook = oXL.Workbooks.Open(FichExcel)
            oXL.Visible = False
            Set oFso = CreateObject("Scripting.FileSystemObject")
            Set objFile = oFso.OpenTextFile("C:\Repertoire\TEST.txt", ForReading)
            Set oFile = oFso.OpenTextFile("C:\Repertoire\RESULTEST.txt", ForWriting, True)
            I = 2 ' Ici on doit mettre le numéro correct de la ligne de début du fichier excel
            While Not objFile.AtEndOfStream  
                strLine = objFile.ReadLine
                If strLine <> "" Then
                    oFile.WriteLine "0" & strLine ' On écrit la ligne telle qu'elle est en ajoutant un 0 devant
                    temp = Mid(strLine, 6)  ' On supprime les 5 premiers caractères de la ligne lue
                     ' on récupère le code à 5 chiffres
                    xlTemp = Rechercher_Correspondance(Left(strLine,5),oBook.Worksheets("Feuil1").Cells(I, 1))
                    oFile.WriteLine xlTemp & temp ' on écrit une autre ligne avec le code 5 au début
                    I = I + 1 ' on incrémente le numéro de la ligne dans le fichier excel            .
                End If
            Wend
            oFile.Close
            objFile.Close
            oXL.Quit    
        End Sub
    '===============================
    Function Rechercher_Correspondance(strValueFromSource,strFromCorrespond)
            Dim Ret
            I = 1
            Do While strFromCorrespond <> "" ' tant qu'une ligne contient des données
              strFromCorrespond = oBook.Worksheets("Feuil1").Cells(I, 1) ' ligne n°I de la colonne 1
              If strFromCorrespond = strValueFromSource Then ' si OK on récupère la valeur
                 Ret = oBook.Worksheets("Feuil1").Cells(I, 2) ' code 6 chiffres de la colonne 2 correspondant
                 ' au code de 5 chiffres de la colonne 1. Puis on sort de la boucle
                 Exit Do
              End If
              I = I + 1 ' On passe à la ligne suivante si pas trouvé
            Loop
            Rechercher_Correspondance = Ret
    End Function
    '=====================
        Sub DelEmptyLine() ' On supprime la dernière ligne vide
            Dim oFso
            NewText = ""
            Set oFso = CreateObject("Scripting.FileSystemObject")
            Set oFile = oFso.OpenTextFile("C:\Repertoire\RESULTEST.txt", ForReading, False)
           Contenu = oFile.ReadAll
           oFile.Close
           Set oFile = oFso.OpenTextFile("C:\Repertoire\RESULTEST.txt", ForWriting, True)
            arrLines = Split(Contenu, vbCrLf)
           For i = 0 To UBound(arrLines) - 2
             NewText = NewText & arrLines(i) & vbCrLf
           Next
            NewText = NewText & arrLines(UBound(arrLines)-1)
            oFile.Write NewText
            oFile.Close
            Set oFile = Nothing
            Set oFso = Nothing
        End Sub

  20. #40
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Voici mon script adaptée au code de cinq chiffres :
    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
    Const REP = "D:\Tests4Noobs\Data\"
          DOC = REP & "Correspond.xls":  TXT = REP & "TEST.txt"
     
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(DOC) And .FileExists(TXT) Then
            With CreateObject("Excel.Application")
                .ScreenUpdating = False
     
                With .Workbooks.Open(DOC).Worksheets(1)
                    AD = .Cells(1).CurrentRegion.Address
     
                    With .QueryTables.Add("TEXT;" & TXT, .Cells(6))
                               .AdjustColumnWidth = False
                              .PreserveFormatting = True
                                    .RefreshStyle = 0
                               .TextFileParseType = 2
                         .TextFileColumnDataTypes = Array(2, 2)
                       .TextFileFixedColumnWidths = Array(5)
                       .Refresh False
                    End With
     
                    With .Cells(6).CurrentRegion
                        .Columns(1).Offset(, -1).Formula = "=""0""&F1"
     
                        With .Offset(.Rows.Count).Columns
                             .Item(1).Offset(, -1).Formula = "=VLOOKUP(E1," & AD & ",2,FALSE)"
                             .Item(2).Formula = "=G1"
                        End With
     
                        With .CurrentRegion.Columns(1).Offset(, 6)
                             .Formula = "=E1&G1"
                                    T = Join(.Application.Transpose(.Value), vbCrLf)
                        End With
                    End With
                                 .Parent.Close False
                End With
                                 .Quit
            End With
     
            With .OpenTextFile(REP & "Result.txt", 2, True):  .Write T:  .Close:  End With
        End If
    End With
    Pour le coup, en terme de code, le passage par Excel simplifie la tâche en utilisant de simples formules de calculs !
    Le B-A-BA d'Excel comme par exemple RECHERCHEV ligne 26 pour la conversion des codes, donc à la portée d'un débutant …
    80% du code est de la manipulation d'Excel : il a été généré en moins d'une minute via l'Enregistreur de macros d'Excel !
    Ensuite il faut juste nettoyer ce code ainsi généré … J'aurais pu directement développer le script mais avec plus de temps …

    Mais avant de continuer plus loin, n'ayant pas de fichiers source réels,
    entre la version d'l_autodidacte et celle ci-dessus, laquelle est la plus rapide ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Réponses: 10
    Dernier message: 02/09/2010, 09h19
  2. [Toutes versions] [débutant] condition sur une case par ligne, et action sur chaque ligne
    Par touille dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/06/2010, 17h17
  3. Réponses: 13
    Dernier message: 20/11/2006, 17h46
  4. Réponses: 5
    Dernier message: 28/07/2006, 08h16
  5. [vb.net][dataView] test sur chaque lignes
    Par arnolem dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/02/2006, 10h52

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