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 :

Problème: Remplacer un caractère d'un fichier .csv (Script batch) [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 149
    Points : 65
    Points
    65
    Par défaut Problème: Remplacer un caractère d'un fichier .csv (Script batch)
    Bonjour,

    Je cherche à faire une partie de script qui consiste à transformer des à en @ d'un fichier source .csv .

    voici ma portion de code :
    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
    :@echo off 
    set v_FIC_SRC=test.csv
    
    for /f "tokens=* delims=;" %%a in ('type %v_FIC_SRC%') do call :commande %%a 
    goto :eof 
    
    :commande
    set ligne=%1
    set ligne=%ligne:à=@%
    
    rem SET DATE=%DATE:/=%
    
    set year=%DATE:~6,4%
    set month=%DATE:~3,2%
    set day=%DATE:~0,2%
    
    set dateday=%year%%month%%day%
    
    set nomFichier=%v_FIC_SRC:~0,8%
    
    @echo %ligne% >>%nomFichier%_%DATEDAY%.csv
    Le script va dérouler ligne à ligne et transformer des à en @ puis va écrire tout ça dans un fichier avec la date du jour.

    La source étant un fichier plat .csv

    Mon souci est qu'étrangement ça marche sur un fichier .csv dont le contenu de chaque ligne débute par un guillemet et dont la fin de la ligne se termine également par un guillemet (le séparateur de données étant un point virgule).

    Par contre ça ne marche pas correctement pour les fichiers. csv n'ayant pas de guillemet ni en début de ligne ni en fin de ligne.

    Cela m'affiche que la première donnée malgrés le token=*

    Avez vous une idée d'où est ce que ça coince?

    Merci.
    Littlebear

  2. #2
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 149
    Points : 65
    Points
    65
    Par défaut Résolu
    C'est bon j'ai trouvé, c'était à cause de ma boucle for.
    J'ai remplacé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for /f "delims=" %%a in (%v_FIC_SRC%) do call :commande "%%a"
    Cdt,

    Littlebear

  3. #3
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    salut,

    mieux vaut remplacer la ligne 8 par "set ligne=%*".

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 149
    Points : 65
    Points
    65
    Par défaut
    Bonjour,

    Merci Minnesota pour ton conseil. ça marche également avec ton conseil.

    Ceci étant..
    Je pensais être arrivé à résoudre mon problème mais un autre en surgit.

    Dans mon fichier source .csv, j'ai des codes constitués de lettre avec parfois des %1, %2 ,%n
    Et étrangement dans mon fichier de destination,hé bien ces %n disparaissent...
    Magique non? .. eu du coup ça m'arrange pas.

    par exemple dans mon fichier source j'ai ceci :
    HVMVUI%4JV

    et du coup dans mon fichier de sortie, je me retrouve avec ceci :
    HVMVUIJV

    Comme s'il interprétait le fichier source comme un fichier batch ? il croit que ce sont des paramètres?

    Normalement il aurait fallut rajouter un % devant le % pour qu'il soit interprété comme tel or je cherche un moyen de contournement
    par un set ligne=%ligne:%=%%% <-- ceci ne marche pas... (sinon trop facile...)

    Littlebear

  5. #5
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    dans ce cas il faudrait faire une assignation de la sortie de for pour anticiper toute éventuelle interprétation prématurée du modulo:

    genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for /f "tokens=*" %%i in (tonfichier) do set "ligne=%%i"& call :operation
    ...
    
    :operation
    echo %ligne:x=y%>fichiersortie
    ...
    Mais si tu as beaucoup de remplacement à faire, il serait plus intéressant de te tourner vers un utilitaire comme sed, beaucoup plus rapide et performant.

    Et pour info, pour pouvoir faire %ligne:%=%%% il faut activer l'expansion des variables d'environnement et changer la syntaxe en quelque chose de proche de !ligne:%=%%!

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 149
    Points : 65
    Points
    65
    Par défaut
    Bonjour,

    Merci minnesota pour ta réponse pour gérer les modulos de mon fichier source à mon fichier de sortie.
    Mais comme je disais, une correction peu parfois apporter d'autres soucis...
    En utilisant ton astuce, les lignes contenant du code comme HVMVIH&7II de mon fichier source se retrouve de la façon suivant dans mon fichier de sortie : HVMVIH(suivi de blanc jusqu'à la fin de la ligne) du coup la ligne est tronquée.
    Je vais m'informer sur sed

    y aurait il l'équivalent de commande sed sous windows ? ou alors j'ai pas trouvé le bon lien?

  7. #7
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    Pour que l'esperluette ne soit pas interprétée, il faut que la chaine qui la contient soit entre guillemets, mais il ne faut pas oublier de les supprimer à la fin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for /f "tokens=*" %%i in (tonfichier) do set ligne="%%i"& call :operation
    ...
    Mais bon, à ce niveau-là, il vaut mieux passer par sed, ce sera beaucoup plus rapide en plus.

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 149
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par minnesota Voir le message
    Pour que l'esperluette ne soit pas interprétée, il faut que la chaine qui la contient soit entre guillemets, mais il ne faut pas oublier de les supprimer à la fin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for /f "tokens=*" %%i in (tonfichier) do set ligne="%%i"& call :operation
    ...
    Mais bon, à ce niveau-là, il vaut mieux passer par sed, ce sera beaucoup plus rapide en plus.
    Bonjour,

    Je reviens pour te remercier de ton aide minnesota
    Je suis passé par la commande sed comme tu m'as conseillé qui est beaucoup plus simple une fois trouvé comment l'utiliser sous windows.
    Donc Problème résolu.

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

Discussions similaires

  1. [batch] Remplacement de caractères dans un fichier
    Par Antoun dans le forum Windows
    Réponses: 18
    Dernier message: 25/04/2008, 18h14
  2. Réponses: 4
    Dernier message: 29/02/2008, 11h11
  3. Remplacer un caractère dans un fichier texte
    Par steelk dans le forum Excel
    Réponses: 36
    Dernier message: 29/01/2008, 15h10
  4. Réponses: 3
    Dernier message: 27/06/2005, 16h24
  5. Réponses: 5
    Dernier message: 25/01/2005, 14h26

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