Trouver et copier des lignes d'un .csv à l'autre
Résoluadgm1 Messages postés 306 Statut Membre -
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
- Trouver et copier des lignes d'un .csv à l'autre
- Trouver adresse mac - Guide
- Comment copier une vidéo youtube - Guide
- Trouver un film sans le titre - Télécharger - Divers TV & Vidéo
- Partager des photos en ligne - Guide
- Super copier - Télécharger - Gestion de fichiers
8 réponses
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" )
Ca marche impeccable merci encore à toi barnabé toujours là pour les soluces :). J'étais en train de créer un truc tellement plus complexe !!!
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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionen 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
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
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
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