Batch Supprimer des lignes vides d'un CSV [Résolu/Fermé]

Signaler
Messages postés
267
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
4 janvier 2014
-
Messages postés
267
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
4 janvier 2014
-
Bonjour,
je voudrais supprimer toutes les lignes vides de mon fichier CSV en Batch
Merci



18 réponses

Messages postés
18240
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 novembre 2020
5 206
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
267
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
4 janvier 2014
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
Messages postés
18240
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 novembre 2020
5 206
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
Messages postés
267
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
4 janvier 2014
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
Messages postés
18240
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 novembre 2020
5 206
dans un fichier, plus besoin de doubles "" ou %%
/premierM/{printf "\n%s\"",$3}   /deuxM/{printf "*%s",$3}
Messages postés
267
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
4 janvier 2014
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
Messages postés
18240
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 novembre 2020
5 206
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}
Messages postés
267
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
4 janvier 2014
16
j'ai mis {printf "\n%s\"",$3} Mais c'est le même problème ^ backslash not last caracter online
Messages postés
18240
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 novembre 2020
5 206
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:>  
Messages postés
267
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
4 janvier 2014
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
Messages postés
18240
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 novembre 2020
5 206
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}
Messages postés
267
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
4 janvier 2014
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!
Messages postés
18240
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 novembre 2020
5 206
il manque les /c:
findstr /v /c:"""  /c:"^*" /c:"^ " 
Messages postés
267
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
4 janvier 2014
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
Messages postés
18240
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 novembre 2020
5 206
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

Messages postés
267
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
4 janvier 2014
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
Messages postés
18240
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 novembre 2020
5 206
comme ça
/premierM/{printf "\n%d* %s\"", ++i, $3} /deuxM/{printf "*%s",$3} 
Messages postés
267
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
4 janvier 2014
16
Je vous remercie infiniment dubcek, je ss un noub en batch, mais je commence à comprendre le fonctionnement grâce à vous!
Merci beaucoup ;)
Messages postés
267
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
4 janvier 2014
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
Messages postés
18240
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 novembre 2020
5 206
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

Messages postés
267
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
4 janvier 2014
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 ??
Messages postés
18240
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 novembre 2020
5 206
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:>
Messages postés
267
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
4 janvier 2014
16
Yes !! ca marche !! merci beaucoup dubcek ;)