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 :

Ré écrire un fichier en supprimant des lignes


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut Ré écrire un fichier en supprimant des lignes
    Bonjour à tous,

    Je souhaiterai ré-écrire un fichier toto.dat qui se présente ainsi :

    GRID 15161541 5105000412.716 2631.39 -42.4544
    GRID 15161551 5105000412.534 2630.03 -83.4847
    GRID 15161561 5105000413.749 2627.22 -143.298
    GRID 15161571 5105000412.536 2628.92 -111.41
    GRID 15161581 5105000408.983 2291.43 1575.36
    ......
    en supprimant certaines ligne GRID, référencé dans un autre fichier nommé GRID_REMOVE.dat dans lequel elle sont listés ligne par ligne comme ceci :

    GRID 15161561
    GRID 15161571
    ........

    Donc le batch doit :
    1-ouvrir le fichier toto.dat lire la chaine de charactère GRID 15161541
    2-ouvrir le fichier GRID_REMOVE.dat lire la première ligne
    3-Comparer la chaine de caractère GRID 15161541 avec la première ligne du fichier GRID_REMOVE.dat
    4- Si les deux chaines de caractères sont différentes alors il ré-écrit la ligne entière provenant du fichier toto.dat dans le fichier toto_update.dat
    5- Si les deux chaines de caractères sont identiques alors il ré-écrit la ligne entière du fichier provenant du fichier toto.dat dans le fichier toto_update.dat en y ajoutant au début un $ (je ne veux pas supprimer la ligne tout de suite, mais l'identifier avant, d'ou le $).

    Alors j'ai pensais à faire deux boucles comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for /f %%i in (toto.dat)
    for /f %%j in (GRID_REMOVE.dat) do (
    if %%i NEQ %%j echo %%i >> toto_update.dat
    if %%i == %%j   echo "$"%%i >>toto_update.dat
    Seulement le for /f %%i in (toto.dat) permet de lire la ligne entière du fichier toto.dat et non la chaine de caractère GRID 15161541.

    Donc comment lui dire de prendre par exemple les 16 premiers caractères de la ligne ?

    Pour la lecture du fichier GRID_REMOVE.dat peut importe car la ligne lu, sera égale à la chaine de caractère souhaité.

    Merci de votre aide par avance

  2. #2
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    salut,

    si tu veux traiter plusieurs fichiers en même temps alors ta méthode n'est pas favorable, tu as plusieurs autres choix:

    * créer une 'fonction'
    * utiliser find/findstr
    * utiliser des pseudo-array
    * utiliser la nouvelle syntaxe set_p

    il faut savoir aussi que chaqu'une de ses méthodes a ses propre avantages et inconvénients.

    voici une 'solution' avec set_p

    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
    @echo off
    setlocal disabledelayedexpansion
    
     > toto_update.dat (
        for /f "tokens=1,2,*" %%a in (toto.dat) do (
          set "line=%%a %%b %%c"
          setlocal enabledelayedexpansion
          set /p grid=
          if "!grid: =!" NEQ "%%a%%b" (echo(!line!) else echo $ !line!
          endlocal
        )
    ) < GRID_REMOVE.dat
    
    endlocal
    pause
    pour plus de détails tu peux consulter la section SET/P de ce petit howto

  3. #3
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par I'm_HERE Voir le message
    salut,

    si tu veux traiter plusieurs fichiers en même temps alors ta méthode n'est pas favorable, tu as plusieurs autres choix:

    * créer une 'fonction'
    * utiliser find/findstr
    * utiliser des pseudo-array
    * utiliser la nouvelle syntaxe set_p

    il faut savoir aussi que chaqu'une de ses méthodes a ses propre avantages et inconvénients.

    voici une 'solution' avec set_p

    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
    @echo off
    setlocal disabledelayedexpansion
    
     > toto_update.dat (
        for /f "tokens=1,2,*" %%a in (toto.dat) do (
          set "line=%%a %%b %%c"
          setlocal enabledelayedexpansion
          set /p grid=
          if "!grid: =!" NEQ "%%a%%b" (echo(!line!) else echo $ !line!
          endlocal
        )
    ) < GRID_REMOVE.dat
    
    endlocal
    pause
    pour plus de détails tu peux consulter la section SET/P de ce petit howto
    Merci de ta réponse,

    Mais le code que tu m'as proposé ne fait pas ce que je veux.

    J'ai testé avec le fichier toto.dat que voici

    MPC 100
    GRID 20000000
    MOMENT 100
    GRID 20000001
    GRID 20000100
    GRID 20000200
    GRID 20000500
    $
    INCLUDE
    GRID 20000000
    SPC 5
    FORCE 30000000
    GRID 20000000

    Le fichier GRID_REMOVE.dat contient 3 lignes à identifier :

    GRID 20000100
    GRID 20000200
    GRID 20000500

    J'obtient comme résultat dans le fichier toto_update.dat:

    MPC 100
    GRID 20000000
    MOMENT 100
    GRID 20000001
    GRID 20000100
    GRID 20000200
    GRID 20000500
    $
    INCLUDE
    GRID 20000000
    SPC 5
    FORCE 30000000
    GRID 20000000

    Donc hormis qu'il ne met pas de $ devant la ligne, il ré-écrit mon fichier mais ne conserve pas les champs que j'avais au départ.

    Je m'explique, les fichiers doivent garder le format de départ car ils sont utilisés dans un logiciel de calcul qui est stricte avec les champs.

    Si j'ai pas été clair n'hésitez pas à me demander.

    JE continue d'étudier ton code pour peut être réussir à le faire fonctionner pour mon cas.

    Encore merci de ton aide.

  4. #4
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    salut,

    j'ai supposé que c'était une comparaison linéaire.
    dans ton cas tu peux simplement utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    findstr /lvibg:"grid.dat" toto.dat > update_grid.dat
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    findstr /libg:"grid.dat" toto.dat > remove_grid.dat

  5. #5
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par I'm_HERE Voir le message
    salut,

    j'ai supposé que c'était une comparaison linéaire.
    dans ton cas tu peux simplement utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    findstr /lvibg:"grid.dat" toto.dat > update_grid.dat
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    findstr /libg:"grid.dat" toto.dat > remove_grid.dat
    Honnêtement j'ai pas très bien compris.

    findstr permet de chercher une chaine de caractère mais le /lvibg et /libg ils servent à quoi exactement ?

    et je dois les mettre ou dans le programme que tu m'a mis plus haut ?

    Merci

  6. #6
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Honnêtement j'ai pas très bien compris.

    findstr permet de chercher une chaine de caractère mais le /lvibg et /libg ils servent à quoi exactement ?
    les paramètres /lvibg sont : /l /v /i /b /g

    findstr /?

    Citation Envoyé par nekcorp Voir le message
    et je dois les mettre ou dans le programme que tu m'a mis plus haut ?
    non, c'est une autre alternative
    si tu mets

    findstr /libg:"grid.dat" toto.dat > remove_grid.dat

    le fichier remove_grid.dat contiendra toutes les lignes contenant les id's dans grid.dat

    et si tu mets:

    findstr /lvibg:"grid.dat" toto.dat > update_grid.dat

    le fichier update_grid.dat contiendra toutes les lignes ne contenant pas les id's dans grid.dat

Discussions similaires

  1. problème pour supprimer des lignes d'un fichier
    Par NicoO_O dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 17/01/2008, 07h23
  2. Réponses: 4
    Dernier message: 26/07/2007, 11h35
  3. [CSV] Ajouter et supprimer des ligne dans un fichier CSV
    Par gpsevasion dans le forum Langage
    Réponses: 3
    Dernier message: 28/02/2007, 17h00
  4. Réponses: 3
    Dernier message: 21/07/2006, 13h22
  5. Shell pour supprimer des lignes d'un fichier
    Par nelsa dans le forum Autres langages
    Réponses: 2
    Dernier message: 20/09/2004, 12h26

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