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 :

Boucle FOR /F et copie des données dans un fichier : Comment conserver les lignes vides ?


Sujet :

Scripts/Batch

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 23
    Points : 8
    Points
    8
    Par défaut Boucle FOR /F et copie des données dans un fichier : Comment conserver les lignes vides ?
    Bonjour,

    Et bien voilà ma question est dans le titre...

    J'ai cette boucle FOR /F :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for /f "delims=|" %%i in ('type C:\TEST\*.*') do echo %%i >> C:\test99.txt
    Et elle me pose les problèmes suivants :

    Le résultat de ce FOR est imprimé en sortie dans test99.TXT.

    Par contre toutes les lignes vierges du fichier d'origine ne sont pas conservées dans test99.TXT. Comment remédier à cela ?

    De plus j'aimerais découper mon fichier texte qui est dans C:\TEST\ en fonction d'une chaîne de caractère variable mais toujours placée au même endroit.

    Je m'explique :

    Si j'ai dans mon fichier dans C:\TEST\ le format suivant :

    |
    1 AAAAAA
    2 AAAAAA
    3
    4 CCCCC
    |
    1 AAAAAA
    2 AAAAAA
    3
    4 DDDDD

    J'aimerais avoir 2 fichiers txt.

    Le premier CCCCC.txt contenant :

    |
    1 AAAAAA
    2 AAAAAA
    3
    4 CCCCC

    Le second DDDDD.txt contenant :

    |
    1 AAAAAA
    2 AAAAAA
    3
    4 DDDDD

    Il me faut donc impérativement récupérer comme premier caractère | alors que mon FOR/F tronque ce caractère, les lignes vides, et affecter à mon découpage comme nom de fichier les caractères (hors espaces) de la ligne 4.

    Help please.

    Merci par avance et encore désolé pour ces questions de newby mais je débute vraiment...

    @+

  2. #2
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    Salut,

    Bon j'ai trouvé ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for /f "skip=4" %%i in ('type C:\TEST\*.*') do echo %%i >> C:\test99.txt
    Alors cela me renseigne bien mon fichier test99.txt avec la valeur voulue mais aussi avec les suivantes....

    Donc comment ne récupérer que les premiers caractères de cette ligne sans avoir les lignes suivantes et ensuite placer cette valeur dans une variable qui me servira à nommer le fichier ?

    Et ensuite mais autres opérations de FOR/F je les fais à la suite ?

    Désolé pour ces questions de newbie mais là je galère et il y a mon chef qui pousse derrière !!!! !!!!!

    D'avance merci.

    @+

  3. #3
    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
    Salut,
    Citation Envoyé par Fabdeuche Voir le message
    Et bien voilà ma question est dans le titre...
    pas vraiment, le titre indique que tu cherches à conserver les lignes vides dans un fichier, quand j'ai lu ce post j'ai vu que tu veux découper un fichier en morceau et quand j'ai vu ton premier topic "qui est en relation avec celui-ci" j'ai vu que tu veux extraire une partie des noms des fichiers .PDF ...?!! j'ai pas compris ce que tu veux
    Citation Envoyé par Fabdeuche Voir le message
    De plus j'aimerais découper mon fichier texte qui est dans C:\TEST\ en fonction d'une chaîne de caractère variable mais toujours placée au même endroit.
    quel relation avec les lignes vides..
    .

    Pour répondre au titre de ton post,
    comme t'as pu le voir, la boucle FOR "sans qu'on la force à le faire" ne sait traiter que les lignes "imprimables" tu à plusieurs possibilités pour que ta sortie tienne compte des lignes vides:

    avec GnuAWk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk "BEGIN{system(\"type C:\\TEST\\*.*\")}" >sortie.txt
    avec TYPE ou bien aussi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type c:\test\*.* >sortie.txt
    ..etc



    pour ta deuxième question, d'après ce que j'ai compris tu veux conserver la structure de tes fichiers + supprimer le caractère barre verticale "|".


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type c:\test\*.*| find /v "|" > sortie.txt
    mais si on contenu à lire ton post on s'aperçois que tu veux conserver le caractère "|" pour qu'il deviennent, par la suite un séparateur des blocs de chaîne de caractères de ton fichier "test99.txt"..alors pourquoi supprimer le "|" ??



    Citation Envoyé par Fabdeuche Voir le message
    Bon j'ai trouvé ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for /f "skip=4" %%i in ('type C:\TEST\*.*') do echo %%i >> C:\test99.txt
    Alors cela me renseigne bien mon fichier test99.txt avec la valeur voulue mais aussi avec les suivantes....
    et les lignes vides alors ?! elles ne seront plus conservées

  4. #4
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Oui pardon c'est vrai que mon post n'est pas très clair car écrit quelque peu dans la précipitation...

    Disons que dans ce post j'exprime l'ensemble de ce que je veux sans spécialement bien le faire... Désolé...

    Donc mon souhait :

    J'ai un fichier txt en entrée que je souhaite découper en X fichiers.

    Pour se faire je sais que j'ai un caractère (le "|") qui délimite le début et la fin de l'extraction que je dois réaliser.

    Donc si j'ai ce fichier :

    |
    1....

    2....

    3....
    4....
    5....
    |
    2....

    8....
    9....
    |

    Je dois obtenir un fichier 1.txt contenant :
    |
    1....

    2....

    3....
    4....
    5....

    et un fichier 2.txt contenant :

    |
    2....

    8....
    9....

    Donc je dois conserver comme premier caractère de mon fichier en sortie "|" qui est aussi mon caractère séparateur et les lignes vides.

    De plus ce qui va générer le nom de mon fichier est le premier ensemble de caractères de la première ligne après le caractère séparateur ("|") de mon fichier txt.

    J'espère que c'est plus clair ainsi....

    Encore merci pour votre aide et désolé de si mal exposer ce que je recherche. Mais quand on débute et que rien n'est clair il reste difficile d'exposer clairement ses propres questions.

    @+

  5. #5
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Bon la solution recherchée jusque là me paraît compliqué.

    Donc je pars sur une autre piste. On ne se moque pas !!!!!

    Donc voici ce que j'ai écrit :

    SET Compt1=0
    IF EXIST C:\test\????_1.txt set /a Compt1+=1
    IF EXIST C:\test\????_2.txt set /a Compt1+=1
    IF EXIST C:\test\????_3.txt set /a Compt1+=1
    IF EXIST C:\test\????_4.txt set /a Compt1+=1
    IF EXIST C:\test\????_5.txt set /a Compt1+=1
    echo %compt1%
    mkdir C:\Test\%compt1%
    Donc ce petit batch ajoute au compteur Compt1 une unité chaque fois que le IF EXIST renvoie vrai.

    Cela me va bien.

    Par contre je peux avoir un nombre élevé de fichiers ????_X.txt... Et je ne me vois pas écrire autant de IF EXIST (et je pense en plus que d'un point de vue programmation batch ce n'est pas ce qui se fait de mieux).

    Donc en fait j'aimerais que mon programme boucle pour déterminer le total de valeur différente que peut prendre X.

    Ensuite pour chaque valeur que peut prendre X je souhaite qu'un répertoire du même nom (Si X = 3 alors faire MKDIR 3) soit créé. Mais aussi créer les répertoires pour MaxiX-1 jusqu'à X=1.

    Je me doute que je dois faire ça avec une instruction FOR mais je n'arrive pas à l'écrire.

    J'espère que cette fois ma demande est plus claire ....

    Merci par avance.

    @+

  6. #6
    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 Fabdeuche Voir le message
    Bonjour,

    Oui pardon c'est vrai que mon post n'est pas très clair car écrit quelque peu dans la précipitation...

    Disons que dans ce post j'exprime l'ensemble de ce que je veux sans spécialement bien le faire... Désolé...

    Donc mon souhait :

    J'ai un fichier txt en entrée que je souhaite découper en X fichiers.

    Pour se faire je sais que j'ai un caractère (le "|") qui délimite le début et la fin de l'extraction que je dois réaliser.

    Donc si j'ai ce fichier :

    |
    1....

    2....

    3....
    4....
    5....
    |
    2....

    8....
    9....
    |

    Je dois obtenir un fichier 1.txt contenant :
    |
    1....

    2....

    3....
    4....
    5....

    et un fichier 2.txt contenant :

    |
    2....

    8....
    9....

    Donc je dois conserver comme premier caractère de mon fichier en sortie "|" qui est aussi mon caractère séparateur et les lignes vides.

    De plus ce qui va générer le nom de mon fichier est le premier ensemble de caractères de la première ligne après le caractère séparateur ("|") de mon fichier txt.

    J'espère que c'est plus clair ainsi....

    Encore merci pour votre aide et désolé de si mal exposer ce que je recherche. Mais quand on débute et que rien n'est clair il reste difficile d'exposer clairement ses propres questions.

    @+
    salut,

    voici l'une des solutions possibles.

    batfile.bat
    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
    @echo off & setlocal enableextensions enabledelayedexpansion
    
    set FILE=file.txt
    if not exist "%FILE:"=%" (goto:EOF)
    
    for /f "tokens=1*delims=[]" %%a in (
      'find /n /v "" ^< "%FILE:"=%"^|find "|"') do>nul ((call :AddBlock %%a)
            if defined OUT (>"!OUT!" echo ^| &>>"!OUT!" (call :AddBlock %%a)) 
    )
    endlocal & goto:EOF
    
    :AddBlock 
    (set OUT=)  
    (set ROW=%1)
    for /f "tokens=1*delims=[]" %%a in ('find /n /v "" ^< "%FILE:"=%"') do (
        if %%a gtr !ROW!  ( if "%%b"=="|" ( goto:EOF ) 
           echo/%%b & (set OUT=%%b.txt))
    )
    goto:EOF
    file.txt

    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
    |
    
    Bloc 1 Ligne 2
    
    Bloc 1 Ligne 4    
    
    
    Bloc 1 Ligne 7     
    Bloc 1 Ligne 8
    |
    Bloc 2 Ligne 1
    Bloc 2 Ligne 2
    
    Bloc 2 Ligne 4
    |
    Bloc 3 Ligne 1
    
    Bloc 3 Ligne 3
    |
    Bloc 4 Ligne 1

  7. #7
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Merci à toi I'M Here... J'avoue que ton code est impressionnant... Et que j'avoue que pour tout comprendre il va me falloir un temps dont je ne dispose pas.... Mais promis je vais m'y pencher car je prends conscience des possibilités offertes par les batchs.

    Donc je suis parti sur une autre solution que voici :

    Rem Définition du répertoire de travail
    SET Direct=C:\Test\
    Rem On se place dans le répertoire de travail
    CD %Direct%
    Rem Boucle pour créer les répertoires en fonction des indices
    For /F "tokens=3,3 delims=_." %%i in ('Dir *.pdf /B') do mkdir %%i
    Rem Déplacement des .pdf dans le répertoire correspondant à l'indice du pdf
    IF EXIST %Direct%GO???????_???-?????_??0.pdf move GO???????_???-?????_??0.pdf %Direct%0
    IF EXIST %Direct%GO???????_???-?????_??1.pdf move GO???????_???-?????_??1.pdf %Direct%1
    IF EXIST %Direct%GO???????_???-?????_??2.pdf move GO???????_???-?????_??2.pdf %Direct%2
    IF EXIST %Direct%GO???????_???-?????_??3.pdf move GO???????_???-?????_??3.pdf %Direct%3
    IF EXIST %Direct%GO???????_???-?????_??4.pdf move GO???????_???-?????_??4.pdf %Direct%4
    IF EXIST %Direct%GO???????_???-?????_??5.pdf move GO???????_???-?????_??5.pdf %Direct%5
    IF EXIST %Direct%GO???????_???-?????_??6.pdf move GO???????_???-?????_??6.pdf %Direct%6
    IF EXIST %Direct%GO???????_???-?????_??7.pdf move GO???????_???-?????_??7.pdf %Direct%7
    IF EXIST %Direct%GO???????_???-?????_??8.pdf move GO???????_???-?????_??8.pdf %Direct%8
    Rem On renomme les fichiers à l'intérieur de chaque répertoire
    CD %Direct%8
    ren GO???????_???-?????_??8.pdf GO???????_???-????.pdf
    CD..
    CD %Direct%7
    ren GO???????_???-?????_??7.pdf GO???????_???-????.pdf
    CD..
    CD %Direct%6
    ren GO???????_???-?????_??6.pdf GO???????_???-????.pdf
    CD..
    CD %Direct%5
    ren GO???????_???-?????_??5.pdf GO???????_???-????.pdf
    CD..
    CD %Direct%4
    ren GO???????_???-?????_??4.pdf GO???????_???-????.pdf
    CD..
    CD %Direct%3
    ren GO???????_???-?????_??3.pdf GO???????_???-????.pdf
    CD..
    CD %Direct%2
    ren GO???????_???-?????_??2.pdf GO???????_???-????.pdf
    CD..
    CD %Direct%1
    ren GO???????_???-?????_??1.pdf GO???????_???-????.pdf
    CD..
    CD %Direct%0
    ren GO???????_???-?????_??0.pdf GO???????_???-????.pdf
    CD..
    Rem On déplace les pdf dans le répertoire de travail en écrasant les versions les plus anciennes
    CD %Direct%0
    move /Y *.pdf %Direct%
    CD..
    CD %Direct%1
    move /Y *.pdf %Direct%
    CD..
    CD %Direct%2
    move /Y *.pdf %Direct%
    CD..
    CD %Direct%3
    move /Y *.pdf %Direct%
    CD..
    CD %Direct%4
    move /Y *.pdf %Direct%
    CD..
    CD %Direct%5
    move /Y *.pdf %Direct%
    CD..
    CD %Direct%6
    move /Y *.pdf %Direct%
    CD..
    CD %Direct%7
    move /Y *.pdf %Direct%
    CD..
    CD %Direct%8
    move /Y *.pdf %Direct%
    CD..
    Rem suppression des répertoires
    RD %Direct%8
    RD %Direct%7
    RD %Direct%6
    RD %Direct%5
    RD %Direct%4
    RD %Direct%3
    RD %Direct%2
    RD %Direct%1
    RD %Direct%0
    En gros ce code fait ce que je veux mais je pense qu'il n'est pas du tout optimisé.

    De plus aujourd'hui j'ai prévu le cas où je n'ai que comme indice de fichier le plus élevé la valeur 8. Dans la réalité je suis quasi certain que jamais les besoins de mes utilisateurs feront que cet indice sera atteint. Mais d'un point de vue purement intellectuel j'aimerais que mon code puisse gérer n'importe quelle valeur d'indice.

    Autant j'ai réussi à faire des compteurs croissants autant je ne vois pas comment écrire un compteur décroissant...

    Merci.

    @+

  8. #8
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    C'est quoi le rapport avec la question intiale là ???

    Expose nous clairement ce que tu dois faire ( et non pas comment tu veux le faire ) ça sera plus simple.

    La ca me parait surréaliste ton script...
    Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

    La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

    (\ _ /)
    (='.'=)
    Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  9. #9
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    Merci de supprimer cette discussion.

    Ma demande étant mal formulée.

    Merci.

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/06/2014, 10h44
  2. Réponses: 5
    Dernier message: 23/05/2014, 13h09
  3. [XL-2003] Copié des données dans une feuille vers une autre
    Par guillaumepops dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 27/03/2012, 15h43
  4. Réponses: 3
    Dernier message: 31/08/2010, 18h12
  5. Réponses: 1
    Dernier message: 05/09/2006, 17h56

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