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

Scripts/Batch Discussion :

Générer un fichier à partir d'un autre [Batch]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Par défaut Générer un fichier à partir d'un autre
    Bonjour,

    Je dois écrire un script batch sous Windows, mais ce n'est pas mon fort et j'ai vraiment besoin de votre aide.
    En Input j'ai un fichier qui contient deux valeurs(Valeur1 et Valeur2) séparées par une virgule ou pas (au choix).
    Je dois générer un fichier en OUTPUT qui contient:
    Une clé unique sur 16 caractères incrémentées par 1 pour chaque nouvelle ligne créée.
    Puis j’insère la valeur1 à une position précise colonne 45.
    La Valeur2 doit s’insérer en colonne 97.
    Particularité la valeur1 peut contenir de 4 à 16 caractères et sur une ligne il peut y avoir la Valeur1 mais pas de valeur2.
    J'ai via, différents sites, écris un premier script mais le positionnement de mes valeur1 et Valeur2 n'est pas correct sans doute à cause de la valeur1 à taille "flexible".
    Exemple de fichier INPUT:
    AAAA,
    BBBBBBBB,
    AAAAA,JJJJJJ
    AAAAAAAAA,HHHHHHH
    AAAAAA,EEEEEEE
    BBBBBBBBBBBBBBBB,ZZZZZZ
    Le script ecrit:
    Code Batch : 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
    @echo off
    setlocal enabledelayedexpansion
     
    set source=input1.txt
    set sortie=output.txt
     
    set debut_cle=000000000000
    set fin_cle=1000
    set AAA=A001
    set BBB=O001
     
    set _24caracteres=                        
    set _36caracteres=                                    
    ::--------------------------
     
    for /f "skip=1 usebackq tokens=1,2 delims=," %%a in ("%source%") do (
     
    set /a fin_cle+=1
    set cle_unique=%debut_cle%!fin_cle!
    set valeur1=%%a
    set valeur2=%%b
     
    if not defined valeur2 (echo !cle_unique!%AAA%%_24caracteres%!valeur1!%_36caracteres%!valeur2!
     
    ) else (
    echo !cle_unique!%BBB%%_24caracteres%!valeur1!%_36caracteres%!valeur2!)
     
     
    )>>"%sortie%"
     
    )
    endlocal
    PAUSE

    Merci par avance de votre aide.

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Pourrions nous avoir le OUTPUT souhaité pour cette exemple.
    Ainsi que ce que génère ton script ?

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Par défaut
    Bonjour,

    Voici en synthèse mon besoin suite à mon projet d’écriture d'un script:
    INPUT fichier TXT
    Une ou Deux variables séparées par un espace (valeur1 et valeur2).
    AAAAAA
    AAAAAA BBBBBBBB
    CCCCCCCCCC
    CCCCCCCCCC DDDDDDDD
    EEEEEEE FFFFFFFF

    Valeur1 peut avoir une longueur entre 7 et 16
    Valeur2 a une longueur entre 2 et 8
    Valeur1 doit être positionnée en colonne 45
    Valeur2 doit être positionnée en colonne 97
    Dans fichier Input, soit il n'y a que la valeur1, soit il y a valeur1 et valeur2.
    En debut de ligne Cle unique sur 16 caractères incrémentés de 1.
    Puis sur 4 caracteres typeA si uniquement valeur1
    ou TypeB si valeur1 et Valeur2
    TYPEA=X001
    TYPEB=Z001
    TYPEC=A001
    TYPED=B000

    Mon problème sur deux demandes d'utilisateurs:
    1 cas:
    je cherche à insérer après le TYPEA ou TYPEB le champ "LISTE valeur1" ou "Liste Valeur2".
    la valeur1 étant variable entre 7 et 16 et valeur2 entre 2 et 8 je ne trouve pas de moyen pour "caler" Valeur1 ou Valeur2 et respecter l'insertion en colonne 45 de Valeur1 et 97 valeur2.
    EXEMPLE OUTPUT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MON TITRE
    CLE UNIQUE      TITRE LIBRE 
    CLE UNIQUE      X001LISTE Valeur1           AAAAAA
    CLE UNIQUE      Z001LISTE Valeur2           AAAAAA                                              BBBBBBBB
    CLE UNIQUE      X001LISTE Valeur1           CCCCCCCCCC                                          
    CLE UNIQUE      Z001LISTE Valeur2           CCCCCCCCCC                                          DDDDDDDD
    CLE UNIQUE      Z001LISTE Valeur2           EEEEEEE                                             FFFFFFFF
    Second cas:
    Regrouper toutes les lignes Valeur1 et insérer une clé unique avec un titre TYPEA et idem pour valeur2.
    Exemple
    Fichier OUTPUT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    MON TITRE
    CLE UNIQUE      TITRE LIBRE 
    CLE UNIQUE      TYPEC
    CLE UNIQUE      X001LISTE Valeur1           AAAAAA
    CLE UNIQUE      X001LISTE Valeur1           CCCCCCCCCC                                          
    CLE UNIQUE      TYPED
    CLE UNIQUE      Z001LISTE Valeur2           AAAAAA                                             BBBBBBBB
    CLE UNIQUE      Z001LISTE Valeur2           CCCCCCCCCC                                      DDDDDDDD
    CLE UNIQUE      Z001LISTE Valeur2           EEEEEEE                                             FFFFFFFF
    Voici le script que j'ai réussi à écrire en respectant ces contraintes de colonage mais je dois le compléter en prenant en compte les nouvelles demandes CAS 1 ou CAS 2.
    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    @echo off
    setlocal enabledelayedexpansion
     
    set source=input.txt
    set sortie=output.lst
     
    set debut_cle=000000000000
    set fin_cle=1000
    set typeA=X001LISTEXXXXXXXXXXXXXXXXXX
    set typeB=Z001LISTEXXXXXXXXXXXXXXXXXX
     
     
     
    set avant_valeur1= 
     
     
    :: apres_valeur1
    :: est créée dans le else
    :: étant donné que sa longueur est dépendante
    :: de la longueur de valeur1
     
    ::--------------------------
     
    (
    echo Mon titre 
    )>>"%sortie%"
     
    for /f "usebackq tokens=1,2 delims= " %%a in ("%source%") do (
     
        set /a fin_cle+=1
        set cle_unique=%debut_cle%!fin_cle!
        set valeur1=%%a
        set valeur2=%%b
     
        if not defined valeur2 (
     
            (
                echo !cle_unique!%typeA%%avant_valeur1%!valeur1!
            )>>"%sortie%"
     
        ) else (
     
            set longueur_valeur1=0
     
            for /l %%n in (0,1,16) do (
                set fin_chaine=!valeur1:~%%n,1!
                if not "!fin_chaine!"=="" (
                    set /a longueur_valeur1+=1
                )
            )
     
     
            set /a longueur_de_apres_valeur1= 96 - 44 - !longueur_valeur1!
     
            for /l %%n in (1,1,!longueur_de_apres_valeur1!) do (
                if %%n==1 (
                    set apres_valeur1= 
                ) else (
                    set apres_valeur1=!apres_valeur1! 
                )
            )
     
            (
                echo !cle_unique!%typeB%%avant_valeur1%!valeur1!!apres_valeur1!!valeur2!
            )>>"%sortie%"
        )
     
    )
    endlocal
    pause


    MERCI beaucoup par avance de votre aide.

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut


    Tu peux décomposer ton problème et le poser simplement ? J'ai du mal à comprendre.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Par défaut
    Bonjour,

    Désolé si mon post n'est pas clair. je vais tenter d'être plus explicite.
    En Input j'ai un fichier .txt qui peut contenir une ou deux valeurs (Valeur1 et Valeur2) séparées par un espace.
    En Output, je dois générer un fichier qui reprend cette ou ces valeurs en y ajoutant une clé unique.
    A ce jour et grâce à différents forum, j'ai réussi à écrire un script, (copie dans mon précédent post), qui génère le fichier output en y insérant une clé unique devant chaque cas.
    Le besoin serait de pouvoir regrouper dans le fichier output toutes les valeur1 uniquement et toutes les valeurs1 et valeur2.
    Mon problème aujourd'hui:
    Modifier le script, pour:
    insérer après la clé unique, un titre avec la variable "valeur1" ou la "valeur2".
    Grouper tous les cas ayant que Valeur1 sous un autre titre et idem pour les cas ayant Valeur1 et valeur2.
    Ce qui donnerait en output:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MON TITRE
    CLÉ UNIQUE TITRE LIBRE groupe cas valeur1 only
    CLE UNIQUEX001TITRE  AAAAAA                     AAAAAA
    CLE UNIQUEX001LISTE BBBBBBBBBBB                BBBBBBBBBBB
    CLÉ UNIQUE TITRE LIBRE groupe cas valeur1 et 2 
    CLE UNIQUEZ001LISTE BBBBBBBB                      AAAAAA                                              BBBBBBBB
    CLE UNIQUEZ001LISTE ZZZ                             CCCCCCCCCCC                                     ZZZ
    J’espère avoir été un peu plus clair dans ma demande.
    Merci de votre aide.

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Une première idée pour simplifier le traitement.
    Tu t'occupe déjà des cas 1 et après des cas 2. Cela te permet de les grouper simplement.
    Essaie d'adapter

    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @echo off
     
    set source=input.txt
    set sortie=output.txt
     
    (
    echo Mon titre 
    echo CLÉ UNIQUE TITRE LIBRE groupe cas valeur1 only
    for /f "usebackq tokens=1,2 delims= " %%a in (`type "%~dp0%source%" ^| findstr /V /C:" "`) do echo CLE UNIQUEX001TITRE %%~a %%~a
    echo CLÉ UNIQUE TITRE LIBRE groupe cas valeur1 et 2 
    for /f "usebackq tokens=1,2 delims= " %%a in (`type "%~dp0%source%" ^| findstr /C:" "`) do echo CLE UNIQUEZ001LISTE %%~b %%~a %%~b
    )>"%~dp0%sortie%"
     
    pause

    Le nombre de caractère de chaque colonne semble définit tu peux utiliser une "fonction" comme cela qui complétera par des espaces le nombre de caractère manquant
    Code batch : 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
    @echo off
    setlocal enabledelayedexpansion
     
    call :setlong "abcde" "10"
    echo #%result%#
     
    call :setlong "abcdeefghikl" 5
    echo #%result%#
     
    goto fin
     
    :setlong
    set txt=%~1
    set /a long=%~2
    FOR /L %%a IN (0, 1, %long%) DO set txt=!txt! 
    set result=!txt:~,%long%!
    goto :eof
     
    :fin
    pause

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

Discussions similaires

  1. générer une date à partir d'une autre date
    Par Melody Nelson dans le forum 4D
    Réponses: 2
    Dernier message: 20/08/2007, 16h59
  2. [MySQL] Générer un fichier à partir d'une requête mySQL
    Par sara21 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 11/05/2007, 08h10
  3. Comment faire pour générer un fichier à partir d'une BD MySQL
    Par dessinateurttuyen dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/07/2006, 20h39
  4. Générer plusieurs fichiers à partir d'un fichier excel
    Par yas2006 dans le forum Documents
    Réponses: 3
    Dernier message: 02/06/2006, 17h54
  5. Générer des fichiers à partir d'un état
    Par laurent35 dans le forum Access
    Réponses: 3
    Dernier message: 02/05/2006, 02h54

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