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 :

Extraire des lignes en fonction d'une chaine de caractères à une position précise dans un fichier texte [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 18
    Points
    18
    Par défaut Extraire des lignes en fonction d'une chaine de caractères à une position précise dans un fichier texte
    Bonjour,

    J'ai essayé de trouver sur le forum mais sans résultat...
    A partir d'un fichier texte ayant des séparateurs $ et contenant à la position 235 un code postal (sur 5 caractères + le nom de la commune),
    je souhaite éclater ce fichier en plusieurs fichiers textes en fonction du code du département :
    Exemple : 1 fichier pour le département du Gard (30), 1 fichier pour le département de la Dordogne (24), etc...
    ....230|||||||||240.....
    ..............$30000 NIMES............$
    ..............$30210 POUZILHAC.....$
    ..............$24000 PERIGUEUX......$

    J'ai bien pensé à FINDSTR /L $30 MonFichier.txt >> Gard.txt tout simplement,
    le problème c'est que dans les adresses il y a des numéros de rue avec "30" également... sur d'autres départements.
    Il faut vraiment que je puisse vérifier que la donnée se trouve aux emplacements 235 et 236 (correspondant aux codes postaux) pour récupérer les lignes.

    Je pense que la solution est dans un code du type : for /f "tokens=235* delims= " %%a in (MonFichier.txt) do echo %%a >> Gard.txt.....
    mais je n'y arrive pas...
    Je ne sais pas si je suis sur la bonne piste.

    Quelqu'un aurait-il une idée ?
    Merci.

  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
    Points : 3 768
    Points
    3 768
    Par défaut
    Salut utilise les regex:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    findstr /r "$30[0-9][0-9][0-9]" "ton_fichier.txt"
    il va chercher les élements qui ont $30 et 3 numéros de 0 à 9 derrière


  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Trop génial ce bout de code !! Trop fort !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    findstr /r $30[0-9][0-9][0-9] MonFichier.txt >> Gard.txt
    findstr /r $24[0-9][0-9][0-9] MonFichier.txt >> Dordogne.txt
    ça fonctionne à merveille !!
    Merci, merci, merci.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Histoire d'en savoir un peu plus, même si j'en ai pas besoin pour le coup, mais pour la culture générale, ou pour s'amuser...
    - si je veux exclure tous les départements qui n'appartiennent pas à une région,
    par exemple, pour la région Aquitaine exclure tous les départements qui sont différents de 16, 17, 19, 23, 24, 33, 40, 47, 64, 79, 86, 87,
    dans un fichier >> Autres départements.txt
    En faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    findstr /r /V $17[0-9][0-9][0-9] MonFichier.txt >> Sans_17.txt
    ça fonctionne.
    Mais j'ai ensuite un problème de syntaxe quand j'ajoute une nouvelle exclusion.
    J'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    findstr /r /V $16[0-9][0-9][0-9] | findstr /r /V $17[0-9][0-9][0-9] MonFichier.txt >> Sans_16-17.txt
    mais ça ne fonctionne pas réellement...

    J'ai trouvé une parade qui fonctionne, mais c'est pas top au niveau du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    findstr /r /V $17[0-9][0-9][0-9] MonFichier.txt >> Sans_17.txt
    findstr /r /V $16[0-9][0-9][0-9] Sans_17.txt >> Sans_16_17.txt
    comment faut-il faire pour le problème syntaxique findstr ... | findstr ... ?
    Merci encore.

  5. #5
    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
    Points : 3 768
    Points
    3 768
    Par défaut
    Essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    findstr /r /V /c:"$16[0-9][0-9][0-9]" /c:"$17[0-9][0-9][0-9]" "MonFichier.txt" >> Sans_16-17.txt

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Encore une fois impec !!
    ça fonctionne à la perfection.
    Merci, merci, merci.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Je ne connaissais pas /c:
    Quelle est la différence entre : " & ", " | " et " /c: " ?

    Merci.

  8. #8
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 211
    Points : 5 814
    Points
    5 814
    Par défaut
    Je ne comprend surtout pas comment cela peux fonctionner (bien que cela fonctionne) sachant que le $ est un métacaractère devant indiquer la fin de ligne.
    \$17[0-9][0-9][0-9] devrait être plus logique et juste.

  9. #9
    Membre chevronné
    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
    Points : 1 991
    Points
    1 991
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Je ne comprend surtout pas comment cela peux fonctionner (bien que cela fonctionne)
    salem,


    les regexes de findstr sont un sous ensembe de BRE mais malheureusement ne suivent pas les règles connus dans plusieurs cas, par exemple '$' s'il est mis à la fin du pattern alors il est traité comme un meta caractère par contre s'il est mis à une autre position il est considéré comme un literal, même chose avec l'ancre "^" mais en inverse

    Code batch : 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
     
    C:\Users\walid>type f.txt
    $1
    1
    1$1
    1$
    1^
     
    C:\Users\walid>findstr "1$" f.txt
    $1
    1
    1$1
     
    C:\Users\walid>findstr "$1" f.txt
    $1
    1$1
     
    C:\Users\walid>findstr "^1" f.txt
    1
    1$1
    1$
    1^
     
    C:\Users\walid>findstr "1^" f.txt
    1^

  10. #10
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 211
    Points : 5 814
    Points
    5 814
    Par défaut
    C'est encore codé avec les pieds, je me doute

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Je me heurte à un problème dans l'extraction des lignes correspondantes à mes codes postaux...
    En fait, je me rends compte que je n'ai pas tout dit au départ...
    et que ça cause un petit soucis...

    En effet, j'ai indiqué que les codes postaux des adresses se trouvent à l'emplacement 235 et suivant :
    ....230|||||||||240.....
    ..............$30000 NIMES............$
    ..............$30210 POUZILHAC.....$
    ..............$24000 PERIGUEUX......$

    Mais un peu plus loin (emplacement 367) sur les mêmes lignes il y a aussi d'autres codes postaux correspondant au lieu de naissance :
    ....360|||||||||370.....
    ................$30000 NIMES............$
    ................$30000 NIMES............$
    ................$24000 PERIGUEUX......$

    La plupart correspondent à l'adresse de correspondance mais évidemment pas tous...

    Car le batch prend en compte l'un ou l'autre des codes postaux, du moment que le numéro de département correspond aux critères de la recherche.

    Du coup, dans le fichier de la Dordogne (24) par exemple, il va y avoir :
    - les adresses de correspondances du département 24 (= Ok),
    - des départements de naissance (24) mais dont l'adresse de correspondance est dans un autre département (=Ko).

    Ce que je n'avais pas dit donc, c'est que je souhaite regrouper les adresses de correspondance uniquement dans des fichiers par départements.

    Comment récupérer uniquement le premier code postal contenu dans chaque ligne (correspondant à la recherche),
    et si ce premier code postal ne correspond pas, ne pas tenir compte du second code postal,
    et passer à la ligne suivante ?

    Merci encore pour votre aide.

  12. #12
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 211
    Points : 5 814
    Points
    5 814
    Par défaut
    Tu peux nous poser un exemple de "MonFichier.txt" avec les différents cas de figure stp.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    dans l'archive :
    - MonFichier.txt (exemple)
    - Test.bat

    Merci pour votre aide.
    Fichiers attachés Fichiers attachés

  14. #14
    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
    Points : 3 768
    Points
    3 768
    Par défaut
    Une solution :


    C'est un peu plus lent mais ça devrait le faire :

    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    echo off
    setlocal enabledelayedexpansion
     
    for /f "delims=" %%a in (MonFichier.txt) do (
       for /f "tokens=12 delims=$" %%b in ('echo %%a') do (
        set $adresse=%%b
    	set $departement=!$adresse:~0,2!
    )
    echo %%a>>!$departement!.txt
    )


  15. #15
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 211
    Points : 5 814
    Points
    5 814
    Par défaut
    Ou comme ceci puisque la position est connue

    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @echo off
    setlocal enabledelayedexpansion
     
    for /f "delims=" %%a in (MonFichier.txt) do (
    	set line=%%~a
    	set outfile=!line:~235,2!.txt
    	echo %%a>>!outfile!
    )

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par sachadee Voir le message

    Encore une fois excellent boulot.
    ça fonctionne parfaitement !
    Comme le dit ericlm128 :
    " C'est encore codé avec les pieds, je me doute "

    Si vous avez le temps... pourriez vous m'expliquer le bout de code qui change la vie...

    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for /f "delims=" %%a in (MonFichier.txt) do (
       for /f "tokens=12 delims=$" %%b in ('echo %%a') do (
        set $adresse=%%b
    	set $departement=!$adresse:~0,2!
    )
    echo %%a>>!$departement!.txt

    Je pense en comprendre le sens global mais...
    Pouvez-vous corriger ma lecture :

    MonFichier.txt va être lu ligne par ligne, aucune ligne de début n'est exclue.
    Chaque ligne est découpée en zones selon les caractères dollar ($).
    La zone 12 sera mémorisée dans %%b, --> comment fait-on pour déterminer que l'emplacement des codes postaux (235 et suivant) correspond à la zone 12 (12 $ ??)
    Cette variable %%b s'appelle adresse
    La variable département = les 2 premiers caractères de la chaine "adresse"
    Exporte les données dans un fichier avec le masque "variable département".txt

    Merci.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Là aussi excellent boulot !
    ça fonctionne aussi parfaitement !


    Merci à tous les deux.

    Même question que pour sachadee, pourriez-vous m'expliquer le bout de code ou corriger ma lecture :

    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for /f "delims=" %%a in (MonFichier.txt) do (      
    	set line=%%~a                                     
    	set outfile=!line:~235,2!.txt

    MonFichier.txt va être lu ligne par ligne, aucune ligne n'est exclue,
    aucune ligne n'est découpée par aucun caractère,
    déclaration de variable line=%%~a --> je comprends pas là ??
    masque de fichier outfile = ! 2 premiers caractères de la variable line ! . txt

    Merci pour votre aide.

  18. #18
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 211
    Points : 5 814
    Points
    5 814
    Par défaut
    déclaration de variable line=%%~a --> je comprends pas là ??
    Chaque ligne est stocké dans %%a, j'utilise la substitution de références ~ pour supprimer les guillemets (si il y en a).
    Voir for /?



    masque de fichier outfile = ! 2 premiers caractères de la variable line ! . txt
    Je récupère les 2 caractères à partir du 235 et j'ajoute .txt, je stock cette chaine dans outfile.
    Voir set /?

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

Discussions similaires

  1. [XL-2007] Extraire des lignes en fonction d'un nom et d'une date
    Par Lexie91 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 18/12/2015, 14h05
  2. Extraire des lignes non conjointes d'une matrice
    Par ekica dans le forum MATLAB
    Réponses: 1
    Dernier message: 21/02/2014, 14h44
  3. [XL-2007] Extraire des lignes en fonction d'une valeur de cellule dans un autre fichier
    Par MisterTambo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/08/2009, 11h42
  4. Réponses: 6
    Dernier message: 11/02/2008, 22h33
  5. aller à une position précise dans un fichier texte
    Par bassidi meryeme dans le forum Langage
    Réponses: 3
    Dernier message: 27/10/2005, 15h57

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