Publicité
+ Répondre à la discussion
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 21
  1. #1
    Membre du Club
    Homme Profil pro irwin
    Analyste d'exploitation
    Inscrit en
    janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Nom : Homme irwin

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2012
    Messages : 96
    Points : 48
    Points
    48

    Par défaut Tronquer un nom de fichier

    Bonjour,

    Je cherche à faire un script pour tronquer un nom de fichier type, le problème est que le logiciel propriétaire (et plus maintenu à jour par l'editeur) ne gère plus l’incrémentation du quantième de l'année et l'ajoute tout les jours, donnant des fichiers à rallonge et empêchant le traitement:

    Fichier.dat.134 passera en fichier.dat.134.135 fichier.dat.134.135.136...

    Je voudrai donc faire un tronquage du nom en lui même, j'ai déjà trouvé pour tronquer dans un fichier, mais pas le nom.
    Ici il s'agirait de tronquer apres le ".dat" jusqu'au 4 derniers caractères ".quantieme" . Le nombre de caractère avant le .dat est toujours le même.

    Un rename est possible mais dans l'idée il me faut le moyen d'extraire le quantième de l'année à partir de la date, et là...Même soucis, pas de piste solide sur le sujet.

    Si une personne à déjà fait cela pour me donner une piste soit sur le tronquage du nom ou l'extraction du quantième je suis donc preneur.

    Merci

  2. #2
    Membre Expert
    Avatar de sachadee
    Homme Profil pro Sacha
    AMI DU BAT
    Inscrit en
    janvier 2013
    Messages
    788
    Détails du profil
    Informations personnelles :
    Nom : Homme Sacha
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : janvier 2013
    Messages : 788
    Points : 1 910
    Points
    1 910

    Par défaut

    Salut,

    si tu connais la position de la valeur à tronquer utilise la substitution:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    set test=123456789
    
    :::Les trois derniers caractères
    
    echo %test:~-3%
    
    :::les trois caractères du milieu
    
    echo %test:~3,-3%
    
    :::les trois premiers
    
    echo %test:~0,3%
    Amicalement

  3. #3
    Membre du Club
    Homme Profil pro irwin
    Analyste d'exploitation
    Inscrit en
    janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Nom : Homme irwin

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2012
    Messages : 96
    Points : 48
    Points
    48

    Par défaut

    C'est surtout que les 3 derniers caractères changent tout les jours, principe du quantième.
    Dans le cadre d'une fin fixe ok pour la préciser comme ci dessous. Mais ça n'ira pas pour moi sur le fait qu'elle s’incrémente, donc change.

    Code :
    1
    2
    3
    4
    5
    6
    7
    set test=prelevement_imp.dat.136.137
    :::Les trois derniers caractères
    echo %test:~-3%
    :::les trois premiers
    echo %test:~0,19%
    echo %test:~0,19%.%test:~-3%
    for %%x in (prelevement*.*) do rename "%%~fx" "%test:~0,19%.%test:~-3%"
    Sous linux j'aurai simplement fait un truc du genre find $path -name 'prelevement_imp.dat.*'Mais sous DOS je galère un peu plus dû à la restriction de mes connaissances

    Si ça peut aider, c'est le seul fichier dans cet emplacement, le reste du contenu est 3 repertoires, donc je ne sais pas si la récupération du nom fichier reste faisable sous DOS


    EDIT: J'en suis actuellement à cela

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @echo off
    
    ::récupération nom fichier
    set var=basename "C:\Users\e047\Desktop\test"
    for /r "C:\Users\e047\Desktop\test" %%i in (prelevement_imp.dat.*) do set VrTest=%%~nxi
    echo %VrTest%
    
    set test=%VrTest%
    :::Les trois derniers caractères
    echo %test:~-3%
    :::les trois premiers
    echo %test:~0,19%
    echo %test:~0,19%.%test:~-3%
    for /r "C:\Users\e047\Desktop\test" %%i in (*.*) do rename "%VrTest%" "%test:~0,19%.%test:~-3%"
    parcontre j'ai en retour

    Code :
    1
    2
    3
    4
    5
    6
    C:\Users\e047\Desktop>totolalatoutou.bat
    prelevement_imp.dat.t.135.150
    150
    prelevement_imp.dat
    prelevement_imp.dat.150
    Le fichier spécifié est introuvable..
    hors j'ai bien qu'un seul fichier ne se nommant pas ainsi et bien présent.

  4. #4
    Membre Expert
    Avatar de sachadee
    Homme Profil pro Sacha
    AMI DU BAT
    Inscrit en
    janvier 2013
    Messages
    788
    Détails du profil
    Informations personnelles :
    Nom : Homme Sacha
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : janvier 2013
    Messages : 788
    Points : 1 910
    Points
    1 910

    Par défaut

    Tu peux tout faire dans la même boucle.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @echo off
    
    ::récupération nom fichier
    set var=basename "C:\Users\e047\Desktop\test"
    for /r "C:\Users\e047\Desktop\test" %%i in (prelevement_imp.dat.*) do (set VrTest=%%~nxi
    echo %VrTest%
    set test=%VrTest%
    echo %test:~-3%
    echo %test:~0,19%
    echo %test:~0,19%.%test:~-3%
    ren "C:\Users\e047\Desktop\test\%VrTest%" "C:\Users\e047\Desktop\test\%test:~0,19%.%test:~-3%")

  5. #5
    Membre du Club
    Homme Profil pro irwin
    Analyste d'exploitation
    Inscrit en
    janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Nom : Homme irwin

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2012
    Messages : 96
    Points : 48
    Points
    48

    Par défaut

    Citation Envoyé par sachadee Voir le message
    Tu peux tout faire dans la même boucle.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @echo off
    
    ::récupération nom fichier
    set var=basename "C:\Users\e047\Desktop\test"
    for /r "C:\Users\e047\Desktop\test" %%i in (prelevement_imp.dat.*) do (set VrTest=%%~nxi
    echo %VrTest%
    set test=%VrTest%
    echo %test:~-3%
    echo %test:~0,19%
    echo %test:~0,19%.%test:~-3%
    ren "C:\Users\e047\Desktop\test\%VrTest%" "C:\Users\e047\Desktop\test\%test:~0,19%.%test:~-3%")
    Oui je me doute, j'avais juste fait en détaillé pour voir ce que ca donne pas à pas (mieux vaut quand on fait peut de batch windows comme moi)

    Parcontre ta commande de rename n'est pas reconnu par windows erreur de syntaxe
    Etant déjà dans le dossier de travail je suis revenu à ca:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ::récupération nom fichier
    set var=basename "C:\Users\e047\Desktop\test"
    for /r "C:\Users\e047\Desktop\test" %%i in (prel*.*) do (set VrTest=%%~nxi
    echo %VrTest%
    ::3 derniers caractères
    echo %VrTest:~-3%
    ::19 premiers caractères
    echo %VrTest:~0,19%
    ::nom final
    echo %VrTest:~0,19%.%VrTest:~-3%
    ren %VrTest% %VrTest:~0,19%.%VrTest:~-3%)
    Pour ne pas m’embêter j'ai juste reprit une seule variable et retirer %test% qui me servait juste pour différencier la partie récupération nom et substitution, et j'ai le même soucis que plus haut: Le fichier spécifié est introuvable.pourtant quand je fais echo du ren j'ai un retour correcte.

    Code :
    1
    2
    3
    4
    5
    6
    C:\Users\e047\Desktop>totolalatoutou.bat
    prelevement_imp.dat.t.135.136.140
    140
    prelevement_imp.dat
    prelevement_imp.dat.140
    ren prelevement_imp.dat.t.135.136.140 prelevement_imp.dat.140
    Après différent test c'est comme si il ne detectait pas de fichier alors qu'il voie bien le nom

  6. #6
    Membre Expert
    Inscrit en
    avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 1 495
    Points : 1 986
    Points
    1 986

    Par défaut

    Citation Envoyé par aerane Voir le message
    ren prelevement_imp.dat.t.135.136.140 prelevement_imp.dat.140
    salut,

    mais y'a un t là sur ton nom de fichier, c'est normal ?

  7. #7
    Membre du Club
    Homme Profil pro irwin
    Analyste d'exploitation
    Inscrit en
    janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Nom : Homme irwin

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2012
    Messages : 96
    Points : 48
    Points
    48

    Par défaut

    Citation Envoyé par minnesota Voir le message
    salut,

    mais y'a un t là sur ton nom de fichier, c'est normal ?
    Oui je l'avais mal nommer de base, mais étant donné que je garde que jusqu'au .dat et les 3 derniers caractères il n'y a aucune incidence, même en corrigeant ça j'ai encore le même message d'erreur sur mon retour de script comme stipuler ci dessus.

  8. #8
    Membre Expert
    Inscrit en
    avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 1 495
    Points : 1 986
    Points
    1 986

    Par défaut

    Oui, mais si c'est le nom du fichier que tu es censé renommer, il ne peut être trouvé. Si tu fais directement un ren "nom" "nouveau_nom" sur ta console est-ce que tu rencontres le même message d'erreur ? Où nom est bien entendu le nom de ton fichier que tu vois dans l'explorateur et qui est donc supposé existé.

  9. #9
    Membre du Club
    Homme Profil pro irwin
    Analyste d'exploitation
    Inscrit en
    janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Nom : Homme irwin

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2012
    Messages : 96
    Points : 48
    Points
    48

    Par défaut

    En gros je te décortique ce que je veux faire par rapport au code


    Ici je récupère le nom du fichier présent (dans le cas final ce sera un fichier ici présent, et 3 répertoires)
    Code :
    set var=basename "C:\Users\e047\Desktop\test"
    Je précise le dossier d'action et la variable du nom de fichier, pour le fichier commencant par "prel"
    Code :
    for /r "C:\Users\e047\Desktop\test" %%i in (prel*.*) do (set VrTest=%%~nxi
    affichage de la récupération des 3 derniers caractères du nom du fichier: le quantième
    affichage de la récupération de la base du nom qui ne chante pas: prelevement_imp.dat
    affichage du nouveau nom à donner
    Code :
    echo %VrTest:~0,19%.%VrTest:~-3%
    définition de la variable du nouveau non (inutil mais je detail)
    Code :
    set newname=%VrTest:~0,19%.%VrTest:~-3%
    rename du fichier avec rename nom_ancien (variable définit au dessus avec le nom à rallonge) vers le nouveau nom (nom de base + quantième)

  10. #10
    Membre Expert
    Inscrit en
    avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 1 495
    Points : 1 986
    Points
    1 986

    Par défaut

    ça j'avais compris, mais t'a pas répondu à la question...
    si tu écris sur ta console ren "prelevement_imp.dat.135.136.140" "prelevement_imp.dat.140" est-ce que ça fonctionne ?

  11. #11
    Membre du Club
    Homme Profil pro irwin
    Analyste d'exploitation
    Inscrit en
    janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Nom : Homme irwin

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2012
    Messages : 96
    Points : 48
    Points
    48

    Par défaut

    Oui ça marche, (c'est même un des premiers truc que j'avais testé).

    Question bête, pourtant si je précise prel*.* même si après le .* il y a d'autre extension windows doit les prendre en compte, je ne suis pas obliger de préciser *.*.*... ça n'aurai aucun sens. C'est limite si je ne voie l'erreur que de ce côté pour ma par.

  12. #12
    Membre Expert
    Inscrit en
    avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 1 495
    Points : 1 986
    Points
    1 986

    Par défaut

    non, non, prel*.* est suffisant... dès que j'ai un instant, je regarde ton code de plus près.

  13. #13
    Membre du Club
    Homme Profil pro irwin
    Analyste d'exploitation
    Inscrit en
    janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Nom : Homme irwin

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2012
    Messages : 96
    Points : 48
    Points
    48

    Par défaut

    Citation Envoyé par minnesota Voir le message
    non, non, prel*.* est suffisant... dès que j'ai un instant, je regarde ton code de plus près.
    Ok merci

  14. #14
    Membre Expert
    Inscrit en
    avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 1 495
    Points : 1 986
    Points
    1 986

    Par défaut

    Voilà une petite ébauche avec une autre approche, tu l'utilises simplement en faisant un call calendarRenFile "ton_fichier". Je sais pas comment on dit quantième en anglais de manière très condensé, j'ai lâché l'affaire après quelques longues minutes de recherches


    calendarRenFile.cmd

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    set "full_name=%~f1"
    set "file_name=%~nx1"
    set "file_date=%~x1"
    call :setbasename "%file_name:.dat.=" "%"
    if not exist "%~dp1%base_name%%file_date%" ren "%full_name%" "%base_name%%file_date%"
    echo %errorlevel%
    goto :eof
    
    :setbasename
    set "base_name=%~1.dat"
    goto :eof

  15. #15
    Membre du Club
    Homme Profil pro irwin
    Analyste d'exploitation
    Inscrit en
    janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Nom : Homme irwin

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2012
    Messages : 96
    Points : 48
    Points
    48

    Par défaut

    De cette manière ça part un peu loin par rapport a mon niveau

    parcontre un truc marrant, quand je re ouvre un invit DOS j'ai cela au premier lancement de script:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    C:\Users\e047\Desktop>totolalatoutou.bat
    Commande ECHO désactivée.
    ~-3
    ~0,19
    ~0,19VrTest:~-3
    c:\temp\*
    Le fichier spécifié est introuvable.
            0 fichier(s) copié(s).
    Puis juste après ca semble ok
    Code :
    1
    2
    3
    4
    5
    6
    C:\Users\e047\Desktop>totolalatoutou.bat
    prelevement_imp.dat.130.154.147.154
    154
    prelevement_imp.dat
    prelevement_imp.dat.154
    Le fichier spécifié est introuvable.
    As tu le même résultat de ton côté si tu créer des fichiers +/- similaire en nom pour tester l'action ? Je n'ai pas d'autre poste sous la main pour voir ça...(mon win7 au boulot est plus que déglingué et pas moyen de refaire mon poste )

  16. #16
    Membre Expert
    Inscrit en
    avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 1 495
    Points : 1 986
    Points
    1 986

    Par défaut

    Citation Envoyé par aerane Voir le message
    De cette manière ça part un peu loin par rapport a mon niveau
    Oui, mais c'est flexible y'a plus de notions de délimitation par longueur de chaine. Si tu veux rester sur ta première approche, ça ne me dérange pas. Je regarde...

    ah oui, mais ça peut pas marcher, il faut activer les extensions de variables étant donné que tu fais des affectations de variables dans la boucle, et il faut les lire avec ! au lien de %

  17. #17
    Membre du Club
    Homme Profil pro irwin
    Analyste d'exploitation
    Inscrit en
    janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Nom : Homme irwin

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2012
    Messages : 96
    Points : 48
    Points
    48

    Par défaut

    Citation Envoyé par minnesota Voir le message
    ah oui, mais ça peut pas marcher, il faut activer les extensions de variables étant donné que tu fais des affectations de variables dans la boucle, et il faut les lire avec ! au lien de %
    Donc il faut que je syntaxe ca de quelle manière, c'est bien la première fois que je tombe sur ce cas...

  18. #18
    Membre Expert
    Inscrit en
    avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 1 495
    Points : 1 986
    Points
    1 986

    Par défaut

    comme ça

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    setlocal enabledelayedexpansion
    for /f %%i in ('dir /b *.dat.*') do (
      set VrTest=%%~i
      echo !VrTest!
      echo !VrTest:~-3!
      echo !VrTest:~0,19!
      echo ren "!VrTest!" "!VrTest:~0,19!.!VrTest:~-3!"
      ren "!VrTest!" "!VrTest:~0,19!.!VrTest:~-3!"
    )
    endlocal

  19. #19
    Membre du Club
    Homme Profil pro irwin
    Analyste d'exploitation
    Inscrit en
    janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Nom : Homme irwin

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2012
    Messages : 96
    Points : 48
    Points
    48

    Par défaut

    Merci ça marche du tonerre,

    Donc plus qu'à préciser mon chemin d'action et tout sera bon

    Merci beaucoup.

  20. #20
    Membre Expert
    Inscrit en
    avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 1 495
    Points : 1 986
    Points
    1 986

    Par défaut

    Citation Envoyé par aerane Voir le message
    Donc plus qu'à préciser mon chemin d'action et tout sera bon
    Oui et il faut quand même que tu ajoutes un contrôle pour t'assurer que les 3 derniers caractères des 19 premiers correspondent à dat, parce y'a un risque non négligeable de ne plus s'y retrouver en cas d'erreurs... et tant qu'à faire une protection contre la récursivité et ne pas tenter de renommer un fichier qui l'a déjà été... et tant qu'à faire aussi un log...
    Enfin pense s'y quoi, surtout si les fichiers manipulés revêtent un caractère important

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •