Trouver et copier des lignes d'un .csv à l'autre

Résolu
adgm1 Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   -  
adgm1 Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   -

Bonjour,

je cherche un moyen de faire la commande suivante : trouver toutes les lignes qui ne sont pas dans un tableur pour venir les copier dans un autre tableur.

En gros j'ai un fichier qui s'appelle export_ok.csv qui est propre, un peu bidouillé à partir d'un vieux export.csv, et à jour avec des utilisateurs. Mais parfois je dois compléter le tableau avec de nouveaux utilisateurs et pour ça j'exporte un nouveau fichier export.csv dans le meme dossier

Le dernier fichier a potentiellement des lignes en plus et qui sont identifiable notamment par la première colonne qui donne un n°ID unique. les autres colonne sont susceptible d'avoir des valeurs identique type prenom, nom, fonction ...

L'idée c'est un batch qui fasse cette tache :

trouver les lignes dans "export.csv" qui ont, dans la colonne A, un n° n'apparaissant pas dans le fichier "export_ok.csv"

Puis, si elles existent, copier ces nouvelles lignes de export.csv vers export_ok.csv

Merci


Windows / Chrome 113.0.0.0

A voir également:

8 réponses

barnabe0057 Messages postés 14455 Date d'inscription   Statut Contributeur Dernière intervention   4 925
 

Bonjour,

Il n'y a pas de difficulté particulière, à l'aide d'une boucle FOR /F tu lis chaque valeur de la première colonne que tu compares avec l'autre fichier.
 

for /f "tokens=1,* delims=:;," %%A in ('type "export.csv"') do (
   findstr "%%A" "export_ok.csv" || echo %%A;%%B>>"export_ok.csv"
)

1
adgm1 Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   10
 

Ca marche impeccable merci encore à toi barnabé toujours là pour les soluces :). J'étais en train de créer un truc tellement plus complexe !!!

0
adgm1 Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   10
 

Salut je reviens sur ce batch car je me rend compte que si les colonnes sont vides alors il ne les copies pas et décale toutes les colonne qui ne correspondent plus à leur en tete. Y a t 'il moyen de forcer la copie de toute la ligne meme si les cellules sont vides?

merci d'avance

0
barnabe0057 Messages postés 14455 Date d'inscription   Statut Contributeur Dernière intervention   4 925
 

Salut il faudrait que je fasse des tests, est-ce que tu aurais un échantillon de fichier à me fournir ?

0
adgm1 Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   10
 

oui voici un csv avec des cellules vides par exemple. Si on en prend un autre csv pour fusioner il y aura des colonnes en moins

https://drive.google.com/file/d/1zeG1mUmxt6fevxRNpGbSjkFQZ_JdqKdK/view?usp=sharing

0
barnabe0057 Messages postés 14455 Date d'inscription   Statut Contributeur Dernière intervention   4 925
 

J'ai localisé le problème, voilà la correction :

@echo off
setlocal enableextensions enabledelayedexpansion

set "export=ko.csv"
set "export_ok=export.csv"

rem echo.>>"%destination%"

set /a index=0

for /f "eol=$ skip=1 delims=" %%E in ('type "%export%"') do (

	set /a index+=1
	title Numero de ligne : !index!

	call :remplissage "%%~E"

	for /f "eol=$ tokens=1,* delims=:;," %%A in ("!ligne!") do (
   		echo.Id : %%A
		findstr "%%A" "%export_ok%" >nul || (
			set "newline=%%A;%%B"
			set "newline=!newline:###=!"
			echo.!newline!>>"%export_ok%"
		)
	)

)

pause
exit

:remplissage

set "ligne=%~1"

:boucle
set "ligne=!ligne:;;=;###;!"
echo.!ligne! | findstr ";;" >nul && goto :boucle

goto :eof
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
adgm1 Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   10
 

C'est top ça marche. Merci encore !

0
adgm1 Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   10
 

en fait j'ai juste un pb cest que dans mon idée mon fichier qui s'appelle export_prof est l export de la base de donnée le plus récent (qui contiendra donc de nouvelle ligne d'utilisateurs) et mon fichier de comparaison qui est plus ancien s'appelle export_prof_ok. Et donc j'aimerai modifier le export_prof_ok du moment pour qu'il aille chercher dans le export_prof les nouvelles lignes à insérer dans le export_prof_ok.

Je suis un peu perdu dans les lignes de commande au niveau des "findstring" quelle valeur je dois modifier.

Car dans ta proposition c'est le export_prof qui devient le nouveau bon fichier mis à jour

0
barnabe0057 Messages postés 14455 Date d'inscription   Statut Contributeur Dernière intervention   4 925
 

Est-ce que c'est mieux comme ça ?

@echo off
setlocal enableextensions enabledelayedexpansion

set "export_recent=export_prof.csv"
set "export_ancien=export_prof_ok.csv"

rem echo.>>"%destination%"

set /a index=0

for /f "eol=$ skip=1 delims=" %%E in ('type "%export_recent%"') do (

	set /a index+=1
	title Numero de ligne : !index!

	call :remplissage "%%~E"

	for /f "eol=$ tokens=1,* delims=:;," %%A in ("!ligne!") do (
   		echo.Id : %%A
		findstr "%%A" "%export_ancien%" >nul || (
			set "newline=%%A;%%B"
			set "newline=!newline:###=!"
			echo.!newline!>>"%export_ancien%"
		)
	)

)

pause
exit

:remplissage

set "ligne=%~1"

:boucle
set "ligne=!ligne:;;=;###;!"
echo.!ligne! | findstr ";;" >nul && goto :boucle

goto :eof
0
adgm1 Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   10
 

La copie des lignes se fait bien dans le bon sens mais il ya encore le pb des cellules vides qui sont squeezées. C'est peut être la formule "remplissage" qui ne s'applique pas correctement

En fait il y a la colonne vide 2 qui est squeezé mais les colonnes 9 10 et 11 sont bien récupérée vides dans le nouveau .csv

0
barnabe0057 Messages postés 14455 Date d'inscription   Statut Contributeur Dernière intervention   4 925
 

C'est parce que j'ai utilisé le point-virgule au lieu de la virgule, voilà c'est corrigé :

@echo off
setlocal enableextensions enabledelayedexpansion

set "export_recent=export_profs.csv"
set "export_ancien=export_profs_ok.csv"

rem echo.>>"%destination%"

set /a index=0

for /f "eol=$ skip=1 delims=" %%E in ('type "%export_recent%"') do (

	set /a index+=1
	title Numero de ligne : !index!

	call :remplissage "%%~E"

	for /f "eol=$ tokens=1,* delims=:;," %%A in ("!ligne!") do (
   		echo.Id : %%A
		findstr "%%A" "%export_ancien%" >nul || (
			set "newline=%%A,%%B"
			set "newline=!newline:###=!"
			echo.!newline!>>"%export_ancien%"
		)
	)

)

pause
exit

:remplissage

set "ligne=%~1"

:boucle
set "ligne=!ligne:,,=,###,!"
echo.!ligne! | findstr ",," >nul && goto :boucle

goto :eof
1
adgm1 Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   10 > barnabe0057 Messages postés 14455 Date d'inscription   Statut Contributeur Dernière intervention  
 

tau top. Merci

0
adgm1 Messages postés 289 Date d'inscription   Statut Membre Dernière intervention   10
 
0