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 :

Renommer des fichiers en fonction de leur contenu [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Points : 51
    Points
    51
    Par défaut Renommer des fichiers en fonction de leur contenu
    Bonjour,
    J'ai un répertoire contenant des fichiers au format .csv qui sont créés par un logiciel de manière séquentielle (001.csv, 002.csv etc...).
    Je voudrais réaliser un batch permettant d'ouvrir chaque fichier de ce répertoire, récupérer les information de la première ligne uniquement (Ou exclure les autres) et renommer le fichier en fonction de ce que j'ai récupéré.

    Voici un exemple du contenu du fichier CSV à ma disposition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    H;000093496499;0100;500;0;PC;
    A;99;0100;500;0;PC;
    C;6499;0100;500;0;PC;
    Le but est donc d'avoir un fichier en sortie qui se nommera: ZCONF_000093496499_0100.csv au lieu de 001.csv

    J'ai donc essayé de faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    cd\
    echo on
    set prefix=ZCONF_
    FOR %%g IN (c:\*.csv) DO (FOR /F "eol=A tokens=2,3 delims=;" %%i in (%%g) DO set name=%%i_%%j)
    pause
    echo %%prefix%%%%name%%.csv
    pause
    Quand j'essaye en ligne de commande de manière plus simple cela marche très bien mais dans le .bat la ligne "echo %%prefix%%%%name%%.csv" plante.
    Et j'ai essayé beaucoup de syntaxes...Et l'imbrication des 2 boucles FOR plante également...

    Voici en ligne de commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    C:\>FOR /F "eol=A tokens=1,2,3 delims=;" %i in (c:\test.csv) DO set name=%j_%k
    C:\>set name=000093496499_0100
    C:\>set name=6499_0100
    
    C:\>set prefix=ZCONF_
    
    C:\>echo %prefix%%name%.csv
    ZCONF_6499_0100.csv
    Au détail près que je ne veux pas récupérer le contenu de la ligne commencant par "C" mais celle qui commence par "H"...
    Mais si je copie tel quel (En mettant %% devant les variables car à ce que j'ai compris, dans un .bat c'est nécessaire) ca ne fonctionne pas.

    Première question: est-ce que je peux dans la condition "eol" mettre plusieurs arguements?
    Pourquoi ce qui fonctionne en ligne de commande ne fonctionne pas en .bat?

    Autre question: comment imbriquer 2 boucles FOR? J'ai vu plein d'exemple avec des (instructions) apres le DO...moi ca plante directement...

    Si quelqu'un a deja eu cette problématique et à un bout de code ou une piste à me proposer, ca m'aiderait beaucoup.

    Merci d'avance

  2. #2
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Tu n'es pas loin

    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
    @echo off
    setlocal enabledelayedexpansion
    
    set prefix=ZCONF_
    FOR %%a IN (*.csv) DO (
        call :func %%a
    )
    pause
    
    goto :EOF
    
    :func
    FOR /F "tokens=2,3 delims=;" %%i in (%1) DO (
        set name=%%i_%%j
        echo %prefix%!name!.csv
        goto :EOF
    )

    Au niveau des deux boucles FOR, pas de souci en théorie. Pour éviter les erreurs, une bonne indentation et du parenthésage systématique et tu n'auras pas de souci.
    Cependant ici çe ne va pas te convenir. Cf plus bas.

    Pour les %% devant les variables, ce n'est que pour les variables de boucle. Les autres variables conservent la syntaxe %variable%.

    Aussi ton echo %prefix%%name%.csvplacé ici ne te permet de voir que le dernier fichier traité. Il faut le rentrer dans la boucle (et j'imagine que ça sera remplacé par le renommage par la suite). Du coup utilisation des expansions retardées obligatoires (le !name! dans mon code).

    Dernier point, eol est fait pour ignorer des lignes de commentaires, pas pour ce que tu veux en faire. Et tu ne peux lui donner qu'un seul caratère. Le plus simple est de breaker ton FOR dès la premiere ligne lue.


    Une solution à tout cela est présentée au dessus. J'ai utilisé un appel de fonction dans le premier FOR en passant le nom du fichier en paramètre.
    Les goto :EOF sont importants et indiquent la fin du programme principal et de la fonction.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Points : 51
    Points
    51
    Par défaut
    Bonjour,
    Merci pour la réponse tu m'as fait comprendre un truc important: il faut passer par CALL!!!

    J'ai changé de méthode mais le résultat est celui escompté.

    J'ai donc ce code qui fonctionne maintenant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @ECHO OFF
    FOR %%X IN (c:\*.csv) DO CALL :OPEN %%X
    GOTO FIN
    :OPEN
    FOR /F "tokens=1,2,3 delims=;" %%i IN (%1) DO CALL :RENAME %%i %%j_%%k %1
    GOTO FIN
    :RENAME
    IF %1==A GOTO FIN
    IF %1==C GOTO FIN
    SET name=ZCONF_%2.txt
    rename %3 %name%
    :FIN
    Merci beaucoup

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par seemax Voir le message
    Bonjour,
    Merci pour la réponse tu m'as fait comprendre un truc important: il faut passer par CALL!!!

    J'ai changé de méthode mais le résultat est celui escompté.

    J'ai donc ce code qui fonctionne maintenant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @ECHO OFF
    FOR %%X IN (c:\*.csv) DO CALL :OPEN %%X
    GOTO FIN
    :OPEN
    FOR /F "tokens=1,2,3 delims=;" %%i IN (%1) DO CALL :RENAME %%i %%j_%%k %1
    GOTO FIN
    :RENAME
    IF %1==A GOTO FIN
    IF %1==C GOTO FIN
    SET name=ZCONF_%2.txt
    rename %3 %name%
    :FIN
    Merci beaucoup
    Bonjour,
    Je ne suis nullement développeur mais comprend un peu que ce soit là un script .bat pour renomer des fichiers. J'ai besoin de renommer une série de fichiers d'extension .txt avec un nom du contenu de la première ligne :
    Buzby
    Buzby
    19/10/2011 14:53:44
    Buzby
    Pas de dénutrition si > 97,5
    Dénutrition sévére si < 83,5
    entre : dénutrition modérée
    celui ci par exemple nommé note-18.txt (j'en ai une quantité allant de 1 à 750) devrait se retrouver en Buzby.txt

    Tel autre
    Lettre à mon gendre agnostique pour lui expliquer la foi chrétienne
    Lettre à mon gendre agnostique pour lui expliquer la foi chrétienne
    12/03/2011 07:26:00
    Lettre à mon gendre agnostique pour lui expliquer la foi chrétienne
    Antoine Nouis
    Éditions Labor et Fides
    15 euros
    serait nommé Lettre à mon gendre agnostique pour lui expliquer la foi chrétienne.txt (avec les limitations du système en matière de nommage

    Merci au connaisseur qui pourra m'aider !
    Noël

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

Discussions similaires

  1. [Batch] Supprimer des fichiers en fonction de leur date
    Par charlix dans le forum Scripts/Batch
    Réponses: 55
    Dernier message: 05/10/2015, 17h18
  2. supprimer des fichiers en fonction de leur extension
    Par nekcorp dans le forum Général Python
    Réponses: 6
    Dernier message: 14/05/2014, 18h26
  3. Réponses: 2
    Dernier message: 21/08/2009, 12h18
  4. récupération de fichier en fonction de leur contenu
    Par Ted37 dans le forum Scripts/Batch
    Réponses: 35
    Dernier message: 31/07/2008, 16h43
  5. Récuperer des fichiers en fonction de leur ancienneté
    Par julien000 dans le forum Langage
    Réponses: 3
    Dernier message: 24/07/2006, 17h09

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