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 :

Concaténation variable et paramètre [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 107
    Par défaut Concaténation variable et paramètre
    Bonjour
    Je ne pratique quasiment pas les batchs et je rencontre donc des problèmes, jugés évident aux pratiquants.

    Je récupère des dates dans un fichier texte et je veux les transformer avant de les écrire avec d'autres variables dans un autre fichier texte.

    Voici mon fichier texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    01/07/18 04:00                                                 Page : 1  
    
    SOCIETE X      
    *                             
    ADRESSE
    
    
               FACTURE TRANSF. VERS BAT.17 DU 01/06/18  AU 30/06/18            
                     TOTAL CONSO (ORANGE GSM / COMPLETEL / FT)
    Je ne connais pas à l'avance le positionnement des dates, donc je recherche sur chaque ligne l'existence des mots FACTURE, DU et AU
    avec une boucle.
    Une fois la ligne trouvée, je dois corriger les dates pour faire apparaître le siècle.
    Je dois stocker dans un fichier de sortie ceci :
    date-heure du jour;date de début avec le siècle;date de fin avec le siècle;
    donc ceci:
    29/08/2018 10:27:30;01/06/2018;30/06/2018;

    Mais je ne parviens pas à initialiser mes variables avec les dates de début et de fin (pour ajouter ensuite le siècle).

    Voici mon script:
    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
    	
    setlocal enabledelayedexpansion
    	cls
    	@echo off
    	set Aujourdhui=%date%
    	set HeureDiz=%time:~0,1%
    	set SuiteHeure=%time:~1,7%
    	:: mais heure peut etre sur 1 seul chiffre	
    	echo %HeureDiz%
    	if NOT "%HeureDiz%" == "1" (
    		if NOT "%HeureDiz%" == "2" (
    			set HeureDiz=0
    		)
    	)
    	:: echo %HeureDiz%
    	set DHJour=%Aujourdhui% %HeureDiz%%SuiteHeure%
    	echo %DHJour%
    	
    	:: boucle pour localiser les début et fin de période
    	for /f "tokens=1,2,3,4,5,6,7,8,9,10* delims= " %%a in ('type facturecopieentete.csv') do (
    		echo a=%%a b=%%b c=%%c d=%%d e=%%e f=%%f g=%%g h=%%h
    		if %%a EQU FACTURE (
    			::echo une facture
    			if %%e EQU DU (
    				if %%g EQU AU (
    					echo Periode :  %%f  %%h
    					echo on
    					set DebutOrig=%%f
    					set FinOrig=%%h
    					::set Debut=%DebutOrig:~0,6%20%DebutOrig:~6,2%
    					::set Fin=%FinOrig:~0,6%20%FinOrig:~6,2%
    					echo %DHJour%;%DebutOrig%;%FinOrig%;%%f;%%h;>> facture_periode.csv
    					echo off
    				)
    			)
    		) 
    	)
    le fichier facture_periode.csv contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    29/08/2018 10:27:30;;;01/06/18;30/06/18;
    J'ai bien mes 2 dates mais donc DebutOrig et FinOrig sont vides.
    J'ai essayé de mettre ou sans plus de résultats.

    Je n'ai pas trouvé sur les FAQ de solutions.

    Auriez-vous une idée ?

    Cordialement

  2. #2
    Membre Expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Par défaut
    Salut,

    Une idée :


    Code bat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @echo off
     
    :: On réecupère les 2 dates
     
    for /f "tokens=6-8 delims=du " %%a in ('findstr /i "facture" "input.txt"') do set $dates=%%a/%%c
     
    :: On traite les 2 dates
     
    for /f "tokens=1-7 delims=/" %%a in ('echo %$dates%') do set $date1=%%a/%%b/20%%c & set $date2=%%d/%%e/20%%f
     
    set $time=%time:~0,-3%
     
    echo %date% %$time: =0%;%$date1%;%$date2%


  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 107
    Par défaut Comprendre la réponse
    Bonjour sachadee
    Merci pour cette méthode, qui effectivement fonctionne très bien.
    Mais je ne la comprends pas complètement, et je ne peux me contenter reprendre bêtement ton code.

    La 1° boucle me remonte les dates quand le mot facture est trouvé.
    On sépare les mots par le délimiteurs "du ".
    Donc je comprends que sur ma ligne j'ai 2 mots: ce qu'il y a avant "du " et ce qu'il y a après. Et donc les 2 dates sont contenues dans un même champ !? et je ne comprends pas alors le "tokens=6,8"
    En fait le décompte des mots se fait à partir du mot facture (1), date de début (6) date de fin (8). Mais alors, comment fait-il pour détecter les mots ? A moi que l'espace soit un caractère systématique de séparation.

    Pour la 2° boucle, c'est du même ordre.
    Le délimiteur est le slash. Donc je devrai avoir 6 mots. Pourquoi indiquer tokens=1-7 ?

    Concernant le format sur l'heure Comment fonctionne le -3 ? A moins que ce ne soit un code spécifique pour un champ time.

    Merci

  4. #4
    Membre Expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Par défaut
    Salut,

    pour le premier tupeux remarquer que pour le "delims=du " il y a un espace après le "du"

    et pour le second je rajoute un slash entre les 2 dates ici => set $dates=%%a/%%c

    Tu peux essayer de le refaire avec tes valeurs et tes tokens sans le du par exemple.

    pour le -3 c'est très simple tu defini le caractères de départ (0 dans ce cas) et le dernier caractères qui ser dans notre cas -3

    15:12:03(,58)
    01234567(-3)




  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 107
    Par défaut Comprendre la réponse --- suite
    Je préfère pour la 1° boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for /f "tokens=1-8 delims= " %%a in ('findstr /i "facture" "facturecopieentete.csv"') do set $dates=%%f/%%h
    Cela me semble plus clair. Le séparateur est l'espace et on récupère les 6° et 8° mots pour les dates.
    Dans les 2 cas, la 1° date traine un espace en fin. Mais je peux le supprimer ensuite.

    Pour le formatage du time, j'avais mal compris. Je croyais qu'il me permettait l'imposer le 0 pour la dizaine des heures quand il est vide.
    Le formatage
    mis en haut de mon script revient au même.

    En fait, je n'avait pas vu le "0" ci-dessous
    Il impose un 0 si le 1° caractère est vide. Je n'ai jamais vu cela dans les pages web. Où est-ce documenté ?

  6. #6
    Membre Expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Par défaut
    Citation Envoyé par ulmeen Voir le message
    Je préfère pour la 1° boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for /f "tokens=1-8 delims= " %%a in ('findstr /i "facture" "facturecopieentete.csv"') do set $dates=%%f/%%h
    Cela me semble plus clair. Le séparateur est l'espace et on récupère les 6° et 8° mots pour les dates.
    Dans les 2 cas, la 1° date traine un espace en fin. Mais je peux le supprimer ensuite.

    Pour le formatage du time, j'avais mal compris. Je croyais qu'il me permettait l'imposer le 0 pour la dizaine des heures quand il est vide.
    Le formatage
    mis en haut de mon script revient au même.

    En fait, je n'avait pas vu le "0" ci-dessous
    Il impose un 0 si le 1° caractère est vide. Je n'ai jamais vu cela dans les pages web. Où est-ce documenté ?
    Salut,

    pour la première boucle effectivement j'avais testé le delims=du et je l'ai laisser, il n'est pas nécessaire !

    pour la substitution => set /?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 107
    Par défaut suite et fin
    le formatage indique que le caractère à gauche de l'égalité est remplacé par le caractère à droite de l'égalité
    (vu via l'aide SET /? La substitution de la variable d’environnement a été améliorée comme suit*: %PATH:ch1=ch2%)
    donc tout espace sera remplacé par un 0.

    Merci encore sachadee

    Je clôture

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

Discussions similaires

  1. [VBA] Mettre un tableau de variable en paramètre
    Par loacast dans le forum Général VBA
    Réponses: 10
    Dernier message: 15/11/2005, 11h28
  2. [VB6] Déclaration d'un tableau avec variable en paramètre.
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 23/10/2005, 12h21
  3. Réponses: 9
    Dernier message: 24/05/2005, 16h34
  4. Nombre variable de paramètres
    Par rolkA dans le forum C++
    Réponses: 12
    Dernier message: 10/10/2004, 15h44
  5. Réponses: 7
    Dernier message: 30/09/2004, 12h55

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