Batch Supprimer des lignes vides d'un CSV

Résolu
yusukessj Messages postés 297 Statut Membre -  
yusukessj Messages postés 297 Statut Membre -
Bonjour,
je voudrais supprimer toutes les lignes vides de mon fichier CSV en Batch
Merci

18 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    C:> type f1.csv  
    1;2;3;4  
    
    1;2;3;4  
    
    1;2;3;4  
    
    1;2;3;4  
    
    C:> aa > f2.csv  
    
    C:> type f2.csv  
    1;2;3;4  
    1;2;3;4  
    1;2;3;4  
    1;2;3;4  
    
    C:> type aa.bat  
    @echo off  
    
    for /F "delims=" %%a in ('type f1.csv') do (  
    if not %%a=="" echo %%a  
    )

    ou
    findstr /v "^$" f1.csv  > f2.csv
    3
  2. yusukessj Messages postés 297 Statut Membre 16
     
    Je vous remercie beaucoup, ça marche aussi ;)
    Il me reste juste un problème au niveau de awk.
    J'utilise une commande en awk pour me récupérer une chaîne de caractère entre deux motifs premierMotif et deuxMotif et le >
    Ca marche, mais je veut que le premier motif soit premierMotif" il se termine par les double quottes et je ne sais pas comment échappé les doubles quottes en awk. j'ai fait un anti-slash mais ca n'as rien donné :

    set A="Rep"   
    cd  %A%   
    for /F "delims=" %%a in ('dir /b/s *.htm') do (   
    awk -F"[<>]"   "/premierMotif/{printf """\n%%s""",$3}/deuxMotif/{printf """*%%s""",$3}"    "%%a" >> C:\wamp\www\bache\resul.csv 
    )


    Je veut (premierMotif) => devient (premierMotif") Mais je ne sais pas échapper les doubles quottes
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      pour éviter ces problèmes de " en ligne de commande DOS, mettre le code awk dans un fichier et exécuter
      awk -F"[<>]"   -f fichier.awk
      0
  3. yusukessj Messages postés 297 Statut Membre 16
     
    Je vient de faire alors deux fichier, premier

    parseur.bat

    set A="Rep"  
    cd  %A%  
    for /F "delims=" %%a in ('dir /b/s *.htm') do (  
    awk -F"[<>]"   fichier.awk     "%%a" >> C:\result.csv
    )


    et le fichier.awk

    /premierM/{printf """\n%%s""",$3}   /deuxM/{printf """*%%s""",$3}


    Mais j'ai des erreurs dans la ligne de commandes : ^ parse error
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      dans un fichier, plus besoin de doubles "" ou %%
      /premierM/{printf "\n%s\"",$3}   /deuxM/{printf "*%s",$3}
      0
  4. yusukessj Messages postés 297 Statut Membre 16
     
    Voici mes deux fichiers :
    parseur.bat

    set A="Rep"  
    cd  %A%  
    for /F "delims=" %%a in ('dir /b/s *.htm') do (  
    awk  C:\fichier.awk     "%%a" >> C:\result.csv
    )


    fichier.awk

    BEGIN { FS="[<>]" }
    /premierM/{printf "\n%s\",$3}   /deuxM/{printf "*%s",$3}


    Je vient de lire quand on est dans un fichier externe .awk qu'il faut mettre le séparateurs là => BEGIN { FS="[<>]" }

    Mais ça ne marche pas, j'ai cette erreure => ^ backslash not last caracter online
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      soit FS= dans le fichier soit -F en ligne de commande, c'est la même chose
      attention au premier printf, il faut
      {printf "\n%s\"",$3}
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. yusukessj Messages postés 297 Statut Membre 16
     
    j'ai mis {printf "\n%s\"",$3} Mais c'est le même problème ^ backslash not last caracter online
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      faire awk -f fichier.awk
      je fais ça
      C:> type f1.txt  
      1 2 premierM  
      1 2 deuxM  
      
      C:>  
      C:> type aa.awk  
      
      /premierM/{printf "\n%s\"",$3}   /deuxM/{printf "*%s",$3}  
      
      C:>  
      C:> awk -f aa.awk f1.txt  
      
      premierM"*deuxM  
      C:>  
      
      0
  7. yusukessj Messages postés 297 Statut Membre 16
     
    Merci dubcek, en effet il me manqué awk -f le -f !!
    Ca marche très bien, il me reste juste un truc, si vous pourrais m'aider la-dessus
    Mon fichier CSV contient des lignes que je veut supprimé automatiquement.
    Je veut supprimer toutes les lignes qui commancent par * ou " ou un espace
    Merci
    0
  8. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    C:> type f1.txt 
    1 
    " 
    2 
    * 
    3 
     xx 
    4 
    
    C:> 
    C:> findstr /v /c:"""  /c:"^*" /c:"^ " f1.txt 
    1 
    2 
    3 
    4 
    C:>

    avec awk
    C:> awk -f aa.awk f1.txt
    1
    2
    3
    4
    
    C:> type aa.awk
    /^[^ "\*]/ {print}
    
    0
  9. yusukessj Messages postés 297 Statut Membre 16
     
    j'ai essaiyer votre solution au ligne de commande, ca marche,
    Mais quand je veut l'implémenté dans mon fichier =>

    findstr /v """  "^*" "^ " first_result.csv >> final.csv
    
    pause


    Ca ne marche pas!
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      il manque les /c:
      findstr /v /c:"""  /c:"^*" /c:"^ " 
      0
  10. yusukessj Messages postés 297 Statut Membre 16
     
    findstr /v /c:"""  /c:"^*" /c:"^ "  first_result.csv >> final.csv
    
    pause


    Je ne suis pas dans le repertoire C:\ Il me dit impossible d'ouvrir final.csv
    0
  11. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    mettre les recherches dans un fichier
    C:> type f2.txt
    ^"
    ^\*
    ^  <--- il y a un espace
    
    C:>
    C:>findstr /v /g:f2.txt  first_result.csv >> final.csv
    
    
    0
  12. yusukessj Messages postés 297 Statut Membre 16
     
    Merci dubcek, tout marche nikel !!!
    un dernier point, si je veut inséré mes données et je veut les numéroté :
    /premierM/{printf "\n%s\"",$3} /deuxM/{printf "*%s",$3}

    Là où je met un \n (retour à la ligne), je veut écrire un numéro incrémental suivis d'une étoile.
    1* ma phrase
    2* ma phrase
    3* ma phrase
    0
  13. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    comme ça
    /premierM/{printf "\n%d* %s\"", ++i, $3} /deuxM/{printf "*%s",$3} 
    0
  14. yusukessj Messages postés 297 Statut Membre 16
     
    Je vous remercie infiniment dubcek, je ss un noub en batch, mais je commence à comprendre le fonctionnement grâce à vous!
    Merci beaucoup ;)
    0
  15. yusukessj Messages postés 297 Statut Membre 16
     
    J'ai vu qu'on peut demandé à awk de nous ramener le contenu de la ligne suivante, avec getline, mais là je avoir le control de demandé à awk de me rammené la ligne après la ligne suivante et celle après sa suivante;
    je m'explique :

    <p class="une_classe">   
            
    premier<br/>   
             
    deuxieme<br/>   
             
    troisieme   
    </p>   
    

    je veut qu'il me rammène mes 3 texte désiré séparé par une étoile *
    Je vous remerci
    0
  16. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    C:> type f1.txt
    <p class="une_classe">
    
    premier<br/>
    
    deuxieme<br/>
    
    troisieme
    </p>
    
    C:>
    C:> type aa.awk
    /une_classe/ {getline ; printf $1 " * " ; getline ; printf $1 " * "  ; getline ; print $1}
    
    C:>
    C:> findstr /v "^$" f1.txt | awk -F"<" -f aa.awk
    premier * deuxieme * troisieme
    
    
    0
  17. yusukessj Messages postés 297 Statut Membre 16
     
    Merci beaucoup dubcek, à ce que je vois à chaque fois qu'on fait getline, il saute de ligne. j'apprend de plus en plus avec vous ;)
    le texte à vrai dire, il a 7 tabulations

    <p class="une_classe">
    
    ...... 7 tabulations ...... premier<br/>
    
    ...... 7 tabulations ...... deuxieme<br/>
    
    ...... 7 tabulations ...... troisieme
    </p>


    Est ce qu'on peut ecrire notre texte, mais sans ecrire les tabulations avec ??
    0
  18. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    on définit la tabulation ou < comme séparateur:
    C:> findstr /v "^$" f1.txt | awk  -f aa.awk
    premier * deuxieme * troisieme
    
    C:>type aa.awk
    BEGIN{FS="[\t<]*"} ; /une_classe/ {getline ; printf $2 " * " ; getline ; printf $2 " * "  ; getline; print $2}
    
    C:>
    0
  19. yusukessj Messages postés 297 Statut Membre 16
     
    Yes !! ca marche !! merci beaucoup dubcek ;)
    0