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. #41
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    entre la version d'l_autodidacte et celle ci-dessus, laquelle est la plus rapide ?
    Même si la mienne est plus rapide, les deux sont longues faute de conception ad'hoc mon Capitaine !

    Avec les fichiers tests de l_autodidacte, elles ont l'air véloce mais,
    vu le dernier message de YLKweb, j'ai généré un fichier texte source de 17000 lignes et
    un classeur de conversion de 65536 codes (ancienne version d'Excel) : cela se chiffre alors en minutes !

    Pour le code de l_autodidacte, cela s'explique par la boucle pour la recherche du code de conversion;
    pour mon script, c'est le temps nécessaire à Excel pour calculer les formules générées …

    Nouvelle conception afin de réduire le traitement à moins de dix secondes (relatives selon la puissance du PC) :
    • juste lire la table de conversion dans le classeur et rien d'autre côté Excel
    • afin d'accélérer la conversion, utiliser un objet Dictionary déjà évoqué à juste titre par ProgElecT !

    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
    Const REP = "D:\Tests4Noobs\Data\"
          SRC = REP & "Data .txt":  TBL = REP & "Conversion .xls"
     
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(SRC) And .FileExists(TBL) Then
            With CreateObject("Excel.Application")
                TC = .Workbooks.Open(TBL).Worksheets(1).Cells(1).CurrentRegion.Value
                .Quit
            End With
     
            With .OpenTextFile(SRC, 1):  SPQ = Split(.ReadAll, vbCrLf):  .Close:  End With
            If SPQ(UBound(SPQ)) = "" Then Redim Preserve SPQ(UBound(SPQ) - 1)
            For R = 0 To UBound(SPQ):  SPQ(R) = "0" & SPQ(R):  Next
              RES = REP & "Result.txt"
            With .OpenTextFile(RES, 2, True):  .WriteLine Join(SPQ, vbCrLf):  .Close:  End With
     
            With CreateObject("Scripting.Dictionary")
                For R = 1 to UBound(TC):  .Item(TC(R, 1)) = TC(R, 2):  Next
                                          Erase TC
                For R = 0 To UBound(SPQ)
                    SPQ(R) = .Item(Left(SPQ(R), 6)) & Mid(SPQ(R), 7)
                Next
                             .RemoveAll
            End With
     
            With .OpenTextFile(RES, 8):  .Write Join(SPQ, vbCrLf):  .Close:  End With
        End If
    End With
    Certes, un peu moins à la portée d'un débutant mais le concept du dictionnaire n'est pas difficile à appréhender !

    _____________________________________________________________________________________________________

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

    _____________________________________________________________________________________________________
    La meilleure façon de ne pas avancer est de suivre une idée fixe. (Jacques Prévert)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  2. #42
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    D'aucun pourrait affirmer la célérité de mon script due à la lecture et à l'écriture des données par bloc.
    « Que nenni ! » rétorquerais-je alors. Car la raison en est bien l'utilisation d'un dictionnaire et,
    pour preuve, voici un script comme celui de l_autodidacte en lecture / écriture ligne par ligne
    et créant le fichier résultat à l'identique par paire ligne source / ligne convertie,
    la création du dictionnaire et son utilisation pour la conversion étant bien distinctes :

    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
    Const REP = "D:\Tests4Noobs\Data\"
          SRC = REP & "Data .txt":  TBL = REP & "Conversion .xls"
     
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(SRC) And .FileExists(TBL) Then
            With CreateObject("Excel.Application")
                TC = .Workbooks.Open(TBL).Worksheets(1).Cells(1).CurrentRegion.Value
                .Quit
            End With
     
            Set Dict = CreateObject("Scripting.Dictionary")
               For R = 1 to UBound(TC):  Dict.Item(TC(R, 1)) = TC(R, 2):  Next
                             Erase TC
            Set oRes = .OpenTextFile(REP & "Result.txt", 2, True)
     
            With .OpenTextFile(SRC, 1)
                Do
                    S = .ReadLine
                    S = "0" & S & vbCrLf & Dict.Item("0" & Left(S, 5)) & Mid(S, 6)
                    If .AtEndOfStream Then oRes.Write S: Exit Do Else oRes.WriteLine S
                Loop
                          .Close
            End With
                      oRes.Close:      Set oRes = Nothing
                      Dict.RemoveAll:  Set Dict = Nothing
        End If
    End With
    Utiliser un fichier texte de conversion ferait gagner le temps d'ouverture / fermeture d'Excel
    mais avec l'extraction des codes des lignes pour alimenter le dictionnaire, ce devrait être équivalent …
    L'avantage d'utiliser un fichier texte de conversion réside dans le fait de ne pas devoir disposer d'Excel sur le PC.

    En comparant ces deux scripts, le deuxième lancé sera forcément plus rapide que le premier à cause du cache disque.
    Relancer le premier après le second alors pour comparer; l'idéal étant de redémarrer le PC après le premier,
    laisser le temps à Windows de bien tout charger avant de tester le second …

    _____________________________________________________________________________________________________

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

    _____________________________________________________________________________________________________
    Pour apprendre quelque chose aux gens, il faut mélanger ce qu’ils connaissent avec ce qu’ils ignorent. (Pablo Picasso)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  3. #43
    Nouveau membre du Club
    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
    Points : 26
    Points
    26
    Par défaut
    Salut !

    Je m’apprêtais justement à te répondre à la question "lequel des deux scripts est plus rapide".
    Et il est vrai que le script de l_autodidacte, bien qu'efficace, est très long.
    Les deux scripts que tu as fourni en dernier afin d'améliorer ce temps de traitement sont juste bluffant en terme de vitesse, par contre, en les essayant avec les fichiers tests ou même avec les fichiers réels (de 17000 et 99000 lignes), il y a un petit soucis.

    En effet, avec les fichiers tests, le 0 est bien ajouté devant chaque ligne initiale mais la conversion ne semble pas marcher et les lignes sont simplement réécrites avec le dernier chiffre du code initial à 5 chiffres devant, suivi d'une tabulation...

    Avec les fichiers réels, c'est mieux, il manque juste le code converti sur la ligne créée. En fait il réécrit la première ligne avec le 0 devant (jusque là nickel) et réécrit ensuite la ligne modèle en ôtant simplement le code à 5 chiffres mais sans rajouter le code récupéré dans le tableau Excel.
    Je ne comprends pas trop.

    Dois-je retoucher quelque chose pour ça ?
    Avais-tu obtenu un résultat correct de ton côté ?

  4. #44
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    Aucun souci de mon côté avec mes fichiers comme avec le fichier TEST.txt et le classeur de conversion de l_autodidacte !

    Regarde ce que renvoie la variable tableau TC …
    Sinon tester le script en VBA pour pouvoir suivre le code en mode pas à pas (touche F8)
    tout en contrôlant le contenu de la fenêtre Variables locales.

    Cela pourrait aussi provenir de tes fichiers, ouvre ton fichier texte avec un éditeur hexadécimal
    et confirme la séquence de fin de ligne.

    Sans pouvoir tester tes fichiers texte source et classeur de conversion, c'est tout pour moi comme cela fonctionne de mon côté …
    Et si d'autres intervenants de ce forum peuvent tester mes scripts …

    _____________________________________________________________________________________________________
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que l'on ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : rien ne fonctionne … et personne ne sait pourquoi ! (Albert Einstein)

    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  5. #45
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 185
    Points
    17 185
    Par défaut
    On (j') en apprend tous les jours, la programmation (sans parler des différents languages) est un vaste domaine, pour moi le tableur Excel est quasiment un inconnu, mais ......
    Citation Envoyé par Marc-L
    Cela pourrait aussi provenir de tes fichiers, ouvre ton fichier texte avec un éditeur hexadécimal
    et confirme la séquence de fin de ligne.
    vbCrLf ----> vbNewLine ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                     S = "0" & S & vbCrLf & Dict.Item("0" & Left(S, 5)) & Mid(S, 6)
    Citation Envoyé par Script56.CHM Aide VBScript
    vbNewLine: Chr(13) et Chr(10) ou Chr(10)
    Caractère de nouvelle ligne spécifique à la plate-forme, adapté à celle-ci.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  6. #46
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    vbNewLine sert à différencier la plateforme / OS : si PC / Windows → vbCrLf (#13#10), si MAC → vbLf (#10) …
    Mais bon j'ai déjà vu de tout sur PC ! On m'a même demandé de créer un import avec détection automatique de fin de ligne !

    Si tu peux par exemple récupérer les fichiers de l_autodidacte du post #26 (TEST.txt & Correspond.xls)
    et tester mes scripts car, comme de mon côté tutti va bene, je n'entrevois ni raison ni piste …

    Je vais voir sur un autre portable disposant d'une version différente d'Excel …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  7. #47
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    Résultat sur un autre ordinateur : pas de souci côté conversion, juste un message d'Excel jamais eu sur la version antérieure,
    « Voulez-vous enregistrer les modifications apportées » …

    Désactivable en insérant avant de quitter Excel : .DisplayAlerts = False

    Mais pas plus avancé sur la problématique que je ne reproduis pas !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

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

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    Avec le dernier code voici ce que j'obtiens :
    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. #49
    Nouveau membre du Club
    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
    Points : 26
    Points
    26
    Par défaut
    Salut !

    Oui, après test avec les fichiers du post #26 comme recommandé par Marc-L, j'obtiens la même chose... Bizarre....
    Et avec mes fichiers réels, je n'ai rien juste plus aucun code devant la ligne créée.

    J'ai tout retourné et testé en faisant autant de modification que possible dans le fichier source, le tableau de correspondance, mais rien, je ne comprends pas d'où ça vient...
    Et je n'arrive pas à remodeler le code... Je n'arrive pas trop à le saisir...
    En ouvrant les fichiers avec un éditeur hexa ça donne ça, je ne sais pas si ça te parle, à moi pas trop...

    Nom : 2015-07-04_09-14-08.png
Affichages : 173
Taille : 29,3 Ko


    Marc-L, comment fais-tu pour le tester en VBA ?
    Je suppose qu'il faut légèrement remanier le code ?
    Tes tests ont été fait en VBA ?

  10. #50
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    Séquence hexa fin de ligne 0d 0a → 13 10 décimal → c'est bien la constante vbCrLf.

    Donc le problème serait du côté d'Excel, testé sans souci avec les versions 2003 & 2007,
    j'en déduis vous deux utiliser une version 2010 ou 2013 ramant peut-être avec un gros fichier
    ou serait-ce dû alors au mode de compatibilité avec un fichier .xls au lieu d'un .xlsx ou .xlsb (à tester).

    Pour le vérifier, juste après le End With de la partie Excel, insérer ces deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MsgBox UBound(TC)
    WScript.Quit
    Le message indique le nombre de lignes lues dans le fichier de conversion et,
    s'il ne correspond pas au nombre total de lignes de conversion, cela confirme bien l'origine du problème.
    Dans ce cas uniquement, palliatif temporisant vos versions d'Excel :
    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
    Const REP = "M:\YLKweb\"
          SRC = REP & "TEST.txt":  TBL = REP & "Correspond.xls"
     
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(SRC) And .FileExists(TBL) Then
            With CreateObject("Excel.Application")
                         .Workbooks.Open(TBL)
                Do Until .Ready:  Loop
                    TC = .Worksheets(1).Cells(1).CurrentRegion.Value
                         .DisplayAlerts = False
                         .Quit
            End With
     
            Set Dict = CreateObject("Scripting.Dictionary")
               For R = 1 to UBound(TC):  Dict.Item(TC(R, 1)) = TC(R, 2):  Next
                             Erase TC
            Set oRes = .OpenTextFile(REP & "Result.txt", 2, True)
     
            With .OpenTextFile(SRC, 1)
                Do
                    S = .ReadLine
                    S = "0" & S & vbCrLf & Dict.Item("0" & Left(S, 5)) & Mid(S, 6)
                    If .AtEndOfStream Then oRes.Write S: Exit Do Else oRes.WriteLine S
                Loop
                          .Close
            End With
                      oRes.Close:      Set oRes = Nothing
                      Dict.RemoveAll:  Set Dict = Nothing
        End If
    End With
    Si le résultat est celui attendu, tester de nouveau sans la ligne n°8. (Ready)

    Enfin, si ce dernier script est encore un échec de votre côté, autant se passer d'Excel
    et lire un fichier texte de conversion créé à partir du classeur Excel …

    Un script vbs peut se tester tel quel au sein d'une procédure VBA (bloc Sub / End Sub)
    et mes tests concernent bien des scripts vbs sans passer par VBA …

    En attendant vos retours, bon dimanche !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

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

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    Je tiens à signaler que j'utilise Exel 2003.
    Si sous la ligne S = "0" & S & vbCrLf & Dict.Item("0" & Left(S, 5)) & Mid(S, 6),
    tu ajoutes MsgBox Dict.Item("0" & Left(S, 5)), tu auras un message vide. Je présume que le problème se pose à ce niveau
    Le résultat est le même si on enlève "0" & pour avoir MsgBox Dict.Item(Left(S, 5)).
    Dans le dernier code, la ligne 22 devrait être remplacée par :
    S = "0" & S & vbCrLf & "0" & Left(Dict.Item(Left(S, 6)),5) & Mid(S, 6) pour obtenir le bon résultat

    Eh oui, on n'est jamais à l’abri d'un oubli et/ou inattention.
    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

  12. #52
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    Avec ta modification de la ligne 22, j'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    000010AAAAAAAAAAAAAAAAAA    31256014536584
    0AAAAAAAAAAAAAAAAAA    31256014536584
    C'est normal car le classeur de conversion est sur 6 chiffres mais le fichier texte source sur cinq chiffres (voir le post #37).
    Mea Culpa, j'ai totalement oublié d'indiquer la conversion de ton fichier TEST.txt sur 5 chiffres …

    Avec ton fichier texte original, la ligne de code de conversion est S = S & vbCrLf & Dict.Item(Left(S, 6)) & Mid(S, 7)

    Du coup YLKweb cela expliquerait aussi tes difficultés : j'attends confirmation du nombre de chiffres dans chacun de tes fichiers.
    Et en les joignant, ce serait tellement plus simple ‼
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  13. #53
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    YLKweb, vu l'image de ton post #49, ton fichier texte de données est sur 6 chiffres et non pas sur 5
    comme l'indiquent pourtant clairement tes posts #35 & 37 ‼

    Qui plus est la première phrase de mon post #40 l'annonce pourtant clairement :

    Citation Envoyé par Marc L
    Voici mon script adapté au code de cinq chiffres
    Donc mes scripts suivant restent sur cette base de cinq chiffres comme tu l'avais demandé …
    En relisant ton post #35, le classeur de conversion est lui aussi sur 5 chiffres, la source du problème initial !

    Voici un script convertissant les fichiers en entrée de 5 chiffres (données + classeur de conversion)
    vers un fichier texte en sortie sur 6 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
    Const REP = "D:\Tests4Noobs\Data\"
          SRC = REP & "Data .txt":  TBL = REP & "Conversion .xls"
     
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(SRC) And .FileExists(TBL) Then
            With CreateObject("Excel.Application")
                SPQ = .Workbooks.Open(TBL).Worksheets(1).Cells(1).CurrentRegion.Value
                .Quit
            End With
     
            Set Dict = CreateObject("Scripting.Dictionary")
            For R = 1 To UBound(SPQ):  Dict.Item(SPQ(R, 1)) = SPQ(R, 2):  Next
            With .OpenTextFile(SRC, 1):  SPQ = Split(.ReadAll, vbCrLf):  .Close:  End With
     
            With .OpenTextFile(REP & "Result.txt", 2, True)
                For R = 0 To UBound(SPQ) + (SPQ(UBound(SPQ)) = "")
                    .WriteLine "0" & SPQ(R) & vbCrLf & Dict.Item(Left(SPQ(R), 5)) & Mid(SPQ(R), 6)
                Next
                    .Close
            End With
                     Dict.RemoveAll:  Set Dict = Nothing
        End If
    End With
    Allez, cette fois c'est la bonne ! Sauf si tu restes sur un fichier de données de 6 chiffres ? …

    _____________________________________________________________________________________________________

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

    _____________________________________________________________________________________________________
    La perfection est atteinte non pas quand il n’y a plus rien à ajouter, mais quand il n’y a plus rien à retirer ! (Antoine de St Exupéry)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  14. #54
    Nouveau membre du Club
    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
    Points : 26
    Points
    26
    Par défaut
    Bravo, ça marche du tonnerre et en un temps record !
    Le talent à l'état pur ! Je ne peux qu'être admiratif... Qui plus est si on prend en compte mes maladresses...

    En effet, j'ai rebalancé un fichier de test sur 6 chiffres au post 49... A force de jongler avec mes fichiers tests et les réels, je me suis embrouillé tout seul et je t'ai embrouillé par la même occasion, mea culpa...

    En tous les cas, bien joué à toi d'avoir trouvé le grain de sable dans l'engrenage à force de relecture et d'épluchage des posts... Je m’apprêtais à poster une "version retouchée" des fichiers "officiels" (étant d'ordre professionnel, ces fichiers ne pouvaient décemment pas se balader tel quel sur le web, d'où ma frilosité à les joindre à mes précédents posts, désolé) car pour essayer de dénouer tout ça, je ne voyais plus d'autre solution.

    Je valide ton travail et remercies ton brio, ainsi que celui de l_autodidacte (toujours aussi brillant dans ses scripts qui ont résolu plus d'une fois mes problématiques) et de ProgElecT (à l'origine de l'idée qui aura finalement été retenue). Vous n'avez rien lâché pour m'aider à trouver une solution et ça, c'est une qualité qui se fait rare.

    Bref, je m'excuse encore de vous avoir fait perdre du temps inutilement sur une simple incompréhension et je vous suis vraiment reconnaissant, j'aurais vraiment été incapable de pondre de tels VBS (ou même VBA).
    D'autant que je suis aussi une sombre buse avec Excel...

    Bref, longue vie à ce forum d'entraide, de savoir et d’apprentissage et à bientôt amis dev' !

  15. #55
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut


    Citation Envoyé par YLKweb Voir le message
    En tous les cas, bien joué à toi d'avoir trouvé le grain de sable dans l'engrenage à force de relecture et d'épluchage des posts...

    C'est en fait l_autodidacte dans son post #51 qui nous a remis sur les rails, rendons à César …


    _____________________________________________________________________________________________________
    Connaître son ignorance est la meilleure part de la connaissance.
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

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

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    C'est en fait l_autodidacte dans son post #51 qui nous a remis sur les rails, rendons à César ...
    Oh, Je t'en prie, ce n'est qu'une idée qui a pu être utile. En fait, j'ai appris de ton code et la façon dont tu jongles avec.

    Mais il reste quand même une chose que je n'arrive pas à saisir : à la ligne 16(dernier code) tu as écrit :
    For R = 0 To UBound(SPQ) + (SPQ(UBound(SPQ)) = "").
    L'expression (SPQ(UBound(SPQ)) = "") est un booléen si j'ai bien compris et vaut soit 0 soit 1 ?!?!
    En testant le code sans cette expression, il donne le bon résultat(avec mes fichiers modifiés pour 5 digits et non 6).
    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

  17. #57
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    Sans ton intervention du post #51 et sans fichier joint de YLKweb, on y serait encore !
    Qui plus est j'avais loupé le fichier de conversion sur cinq caractères au lieu de six …

    La variable tableau SPQ est alimentée via la ligne n°13 par chaque ligne du fichier texte source.
    Comme la dernière ligne de données de ton fichier n'a pas de retour à la ligne, cette expression s'avère effectivement inutile …
    Mais dans le cas contraire, comme dans mon fichier test de 17000 lignes, elle sert à ne pas traiter la dernière ligne vide !

    N° de la dernière ligne (vide) = 17001 → UBound(SPQ)

    SPQ(UBound(SPQ)) = "" → VRAI → -1 (et non pas 1 !) …

    UBound(SPQ) + (SPQ(UBound(SPQ)) = "") → 17001 + (-1) = 17000 …


    Cette ligne For R = 0 To UBound(SPQ) + (SPQ(UBound(SPQ)) = "") est l'équivalent de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                             U = UBound(SPQ)
                      If SPQ(U) = "" Then U = U - 1
                For R = 0 To U
    … ou encore évite au sein de la boucle un test If SPQ(R) > "" Then .WriteLine

    Ce style d'écriture est un héritage direct du BASIC ! …

    _____________________________________________________________________________________________________
    La rigueur vient toujours à bout de l’obstacle. (Leonard de Vinci)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

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

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    Merci pour l'éclaircissement.

    Pourtant, dans certains langages, True équivaut à 1, dans d'autre c'est(comme tu l'as dit) -1
    Par exemple en Pascal(sous ses différentes versions), quand on écrit Write(Ord(True)), on obtient 1.
    Merci encore.
    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

  19. #59
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut





    Oui c'est juste, j'aurais dû préciser en BASIC & dérivés …




    _____________________________________________________________________________________________________
    Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  20. #60
    Nouveau membre du Club
    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
    Points : 26
    Points
    26
    Par défaut
    Euh... Je n'aurais pas dis mieux...

    En tous cas merci en effet à l_autodidacte, je suis loin de minimiser son implication dans la résolution du problème.
    Un grand merci à tous et à très bientôt.

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

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