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

Résolu
adgm1 Messages postés 255 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 9 avril 2024 - 14 mai 2023 à 19:49
adgm1 Messages postés 255 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 9 avril 2024 - 6 sept. 2023 à 08:39

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

8 réponses

barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
14 mai 2023 à 20:35

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 255 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 9 avril 2024 10
14 mai 2023 à 21:46

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 255 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 9 avril 2024 10
30 août 2023 à 09:48

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 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
30 août 2023 à 10:41

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

0
adgm1 Messages postés 255 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 9 avril 2024 10
31 août 2023 à 01:26

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 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
Modifié le 31 août 2023 à 07:43

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 255 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 9 avril 2024 10
3 sept. 2023 à 14:27

C'est top ça marche. Merci encore !

0
adgm1 Messages postés 255 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 9 avril 2024 10
Modifié le 5 sept. 2023 à 20:17

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 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
5 sept. 2023 à 21:28

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 255 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 9 avril 2024 10
Modifié le 5 sept. 2023 à 23:29

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 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
6 sept. 2023 à 06:47

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 255 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 9 avril 2024 10 > barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024
6 sept. 2023 à 08:39

tau top. Merci

0
adgm1 Messages postés 255 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 9 avril 2024 10
5 sept. 2023 à 23:32
0