Batch Index du Forum
S’enregistrerRechercherFAQMembresGroupesConnexion
Répondre au sujet Page 1 sur 3
Aller à la page: 1, 2, 3  >
[R] batch de mise à jour d'une BDD à partir d'un csv
Auteur Message
Répondre en citant
Message [R] batch de mise à jour d'une BDD à partir d'un csv 
bonjour,
je suis nul en création de batch, je vais donc vous exposer ce que je souhaite faire
je veux créer un batch qui ferait les opérations suivante
trouver un fichier .csv
le copier
l'envoyer vers une table de base de données
la base est crée via phpmyadmin (62 champs)
le csv collecte des données météo et s'incrémente d'une ligne toutes les 5 mn
l'idéal pour moi serait
ouvrir le fichier csv
aller à la dernière ligne de ce fichier
copier cette ligne
l'envoyer vers ma base de données pour la mettre à jour

si quelqu'un peut m'aider à creer ce bath cela serait parfait
ensuite je mettrait ce bat dans un planificateur de tache
je suis sous win 10 64x et ma base est créée a partir de wamp via phpmyadmin
si vous avez besoin d'autres info, merci de me le dire



Dernière édition par ardigier le Mer 2 Mai 2018 - 08:07; édité 1 fois
Visiter le site web du posteur
Message Publicité 
PublicitéSupprimer les publicités ?


Répondre en citant
Message [R] batch de mise à jour d'une BDD à partir d'un csv 
Alors effectivement, c'est déjà pas mal ce qu tu demandes Laughing
Mais là je suis sur tél, donc je peut pas chercher




______________________________________________________
Répondre en citant
Message [R] batch de mise à jour d'une BDD à partir d'un csv 
Merci déjà de t'intéresser à mon problème



Visiter le site web du posteur
Répondre en citant
Message [R] batch de mise à jour d'une BDD à partir d'un csv 
Salut,

pour commencer l'approche :


Code:
@echo off

set "$fichier=out.csv"
for /f "tokens=3 delims= " %%a in ('find /v /c "" "%$fichier%"') do set /a number=%%a-1
for /f "skip=%number% delims=" %%a in ('type "%$fichier%"') do call:envoie_BD "%%a"

exit/b

:envoie_BD
echo j'envoie [%~1] vers ma BD



remplace out.csv par le chemin vers ton csv

Okay




______________________________________________________
AffPng.exe , StringBetween.exe , Hex2Png.exe
Répondre en citant
Message [R] batch de mise à jour d'une BDD à partir d'un csv 
Merci pour ce début de code, mais si tu pouvais m'expliquer ce que tu fais aux lignes 4 et 5 pour que je comprenne ce qui se passe
Par avance merci
PS je suis vraiment nul je lis tout ce que je trouve sur le sujet, mais avec l'âge les neurones ne sont plus au top

Je me répond si j'ai bien compris, ligne 4 demande à chercher dans le fichier une Colonne et une ligne
Delim sert à indiquer le séparateur de colonne
Tokens =3 pourquoi 3
Dans find à quoi renvoie les 2 critères V et C
Ligne 5 doit permettre de sélectionner la dernière ligne



Visiter le site web du posteur
Répondre en citant
Message [R] batch de mise à jour d'une BDD à partir d'un csv 
Salut,

en ligne 4 on récupere le nombre de ligne de ton fichier csv, pour l'utiliser dans le skip de la ligne 5.

En ligne 5 on récupère juste la dernière ligne. Le delims dans ce cas e juste nécessaire pour qu'il prenne toutes la ligne, on pourrait le remplacer ar un tokens=*
ce qui dans l'absolue et plus logique, mais persoj'utilise toujours le delims=. ça revient au même

Okay




______________________________________________________
AffPng.exe , StringBetween.exe , Hex2Png.exe
Répondre en citant
Message [R] batch de mise à jour d'une BDD à partir d'un csv 
Merci pour ces précisions
Dans mon csv les colonnes sont séparées par ;
La fin de ligne est marquée par /n
J'ai essayé ton Bach, lorsque je clique la fenêtre s'ouvre et se ferme immédiatement
Que faut il rajouter pour que je visualise la manip et son résultat dans une fenêtre ou un fichier text
Encore merci pour ton aide

PS token = 3 pourquoi ?



Visiter le site web du posteur
Répondre en citant
Message [R] batch de mise à jour d'une BDD à partir d'un csv 
Rajoute un pause :

Code:
@echo off
 
set "$fichier=out.csv"
for /f "tokens=3 delims= " %%a in ('find /v /c "" "%$fichier%"') do set /a number=%%a-1
for /f "skip=%number% delims=" %%a in ('type "%$fichier%"') do call:envoie_BD "%%a"

pause
exit/b
 
:envoie_BD
echo j'envoie [%~1] vers ma BD





______________________________________________________
AffPng.exe , StringBetween.exe , Hex2Png.exe
Répondre en citant
Message [R] batch de mise à jour d'une BDD à partir d'un csv 
ok j'ai la fenêtre qui s'affiche
elle me signale une erreur sur le delims de la ligne 5
"delims=" était inattendu "
j'ai essayé \n idem
puis \r\n idem
y a t il une notation particulière pour retour ligne



Visiter le site web du posteur
Répondre en citant
Message [R] batch de mise à jour d'une BDD à partir d'un csv 
tu dois mettre ça dans un fichier .bat
et remplacer le out.csv par ton fichier .csv




______________________________________________________
AffPng.exe , StringBetween.exe , Hex2Png.exe
Répondre en citant
Message [R] batch de mise à jour d'une BDD à partir d'un csv 
Oui c'est ce que j'ai fait,
Le batch fonctionne pour la ligne 4
Mais il me donne un retour comme indiqué plutôt
Pourtant j'ai bien lu que pour avoir une ligne complète, il faut noter delims=" comme tu l'as noté






Visiter le site web du posteur
Répondre en citant
Message [R] batch de mise à jour d'une BDD à partir d'un csv 
Salut

Code:
@echo off
setlocal EnableDelayedExpansion


set pathToCSV=myFile.csv

call :getLastLineFile "%pathToCSV%" lastLine
echo;Last Line : !lastLine!
call :csvRowToMySQLRow lastLine MySQLRow ";"
echo;Row converted : !MySQLRow!
echo;--------------
call :MySQL ^
{ ^
    "path":"C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe" ^
    "host":"127.0.0.1" ^
    "user":"YOUR_NAME" ^
    "password":"YOUR_PASSWORD" ^
    "database":"YOUR_DATABASE" ^
    "command":"INSERT INTO YOUR_TABLE (col1, col2, col3) VALUES (!MySQLRow!)" ^
}



pause>nul&exit
:getLastLineFile <Path> <Output>
  for /f "delims=" %%l in ('type "%~1"') do set %~2=%%~l
goto :eof
:MySQL <Object>
  for %%p in (%*) do for /f "tokens=1,* delims=:" %%1 in ("%%~p") do (
    set key=%%~1&set key=!key:"=!
    if not "!key:{=}!"=="}" set "MySQL_!key!=%%~2"
  )
  "%MySQL_path%" -h%MySQL_host% -u%MySQL_user% -p%MySQL_password% -D%MySQL_database% -e "%MySQL_command%" >nul && echo;mysql: Command executed with Success^^!
goto :eof
:csvRowToMySQLRow <CSV_ROW> <OutPut_MySQL_ROW> <DELIMITER>
  set rowcsv=!%~1!
  set %~2='!rowcsv:%~3=','!'
goto :eof


Il reste plus qu'à remplacer
Citation:
>line 5
  set pathToCSV=myFile.csv

>line 13
  { ^
   "path":"C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe" ^
   "host":"127.0.0.1" ^
   "user":"YOUR_NAME" ^
   "password":"YOUR_PASSWORD" ^
   "database":"YOUR_DATABASE" ^
   "command":"INSERT INTO YOUR_TABLE (col1, col2, col3) VALUES (!MySQLRow!)" ^
  }

par tes coordonnées de connexion, le chemin d'accès vers mysql.exe et le chemin d'accès vers ton fichier csv

Normalement tout devrait fonctionner sans problème Okay
Si tu as des questions je suis là Mr. Green




______________________________________________________
la vie est trop courte pour retirer le périphérique USB en toute sécurité...
Si la statue de la liberté lève le bras depuis 125 ans, c'est parce qu'elle cherche du réseau sur son Blackberry Torches...
Grâce à mon nouveau correcteur automatiste sur mon téléphage, je ne fais plus aucune faute d'orthodontie.
Quelqu'un a t il déjà demandé au drapeau japonais ce qu'il enregistre depuis tout ce temps ?
Visiter le site web du posteur
Répondre en citant
Message [R] batch de mise à jour d'une BDD à partir d'un csv 
Merci beaucoup pour ce batch,
J'ai compris ce que je dois faire

Je suppose que pour le host je dois indiquer "local host" sinon oú trouver son IP ,
ÉDIT j'ai trouvé c'est celui que tu as noté
Sachant que mon csv utilise le ; pour délimiter les colonnes et \n pour la fin de ligne, faut il le préciser dans le batch avec quelque chose qui ressemblerait à
Fields terminated by ';´
Lines terminated by ´\n'

ou alors la ligne echo;Row converted : !MySQLRow! suffit



Visiter le site web du posteur
Répondre en citant
Message [R] batch de mise à jour d'une BDD à partir d'un csv 
ardigier a écrit:
Merci beaucoup pour ce batch,
J'ai compris ce que je dois faire

Je suppose que pour le host je dois indiquer "local host" sinon oú trouver son IP ,
ÉDIT j'ai trouvé c'est celui que tu as noté
Sachant que mon csv utilise le ; pour délimiter les colonnes et \n pour la fin de ligne, faut il le préciser dans le batch avec quelque chose qui ressemblerait à
Fields terminated by ';´
Lines terminated by ´\n'

ou alors la ligne echo;Row converted : !MySQLRow! suffit


Si ton csv est sous cette forme :
Citation:
124;12;35
22;42;785
785;8;325
0;125;368
258;12;45
3;778;124
123;456;7
741;852;9
369;7;258
23;35;588
119;712;0

alors tu n'as rien à changer à part ce que j'ai indiqué plus haut
j'ai juste oublié une petite imprécision, à la ligne 19 celle-ci :
Code:
    "command":"INSERT INTO YOUR_TABLE (col1, col2, col3) VALUES (!MySQLRow!)" ^

il faut bien que tu mette le nom de tes 62 colonnes à la place de col1, col2, col3 Mr. Green




______________________________________________________
la vie est trop courte pour retirer le périphérique USB en toute sécurité...
Si la statue de la liberté lève le bras depuis 125 ans, c'est parce qu'elle cherche du réseau sur son Blackberry Torches...
Grâce à mon nouveau correcteur automatiste sur mon téléphage, je ne fais plus aucune faute d'orthodontie.
Quelqu'un a t il déjà demandé au drapeau japonais ce qu'il enregistre depuis tout ce temps ?
Visiter le site web du posteur
Répondre en citant
Message [R] batch de mise à jour d'une BDD à partir d'un csv 
OK pour ces précisions
je viens de faire un essai
la fenetre s'ouvre, l'invite en haut clignote
mais rien se passe,
au bout d'un moment la fenêtre se ferme

sur phpmyadmin la base ne se met pas à jour

où est le loup?



et voici le code
@echo off
setlocal EnableDelayedExpansion


set pathToCSV=c:\xnet_meteo\xnet_meteo.csv

call :getLastLineFile "%pathToCSV%" lastLine
echo;Last Line : !lastLine!,
call :csvRowToMySQLRow lastLine MySQLRow ";"
echo;Row converted : !MySQLRow!
echo;--------------
call :MySQL ^
{ ^
"path":"C:\wamp64\bin\mysql\mysql5.7.21\bin\mysql.exe" ^
"host":"127.0.0.1" ^
"user":"ardiger" ^
"password":"ra240250" ^
"database":"donnees_meteo" ^

Code:

        "command":"INSERT INTO donnees (Date;Time;Pressure_Absolute;Pressure_Relative;Temperature_Indoor;Humidity_Indoor;DewPoint_Indor;Temperature_Outdoor;Humidity_Outdoor;DewPoint_Outdor;Wind_Chill;Wind_Direction;Wind_Gust;Wind_Speed;Rainfall_Absolute;Rainfall_Relative;Rainfall_1h;Rainfall_24h;Cloud_Base;Humidex;SolarRadiations;UVIndex;Temperature_2;Humidity_2;Temperature_3;Humidity_3;Temperature_4;Humidity_4;Temperature_5;Humidity_5;Temperature_6;Humidity_6;Temperature_7;Humidity_7;Temperature_8;Humidity_8;Temperature_9;Humidity_9;Temperature_10;Humidity_10;DewPoint_2;DewPoint_3;DewPoint_4;DewPoint_5;DewPoint_6;DewPoint_7;DewPoint_8;DewPoint_9;DewPoint_10;Heatindex_0;Heatindex_1;Heatindex_2;Heatindex_3;Heatindex_4;Heatindex_5;Heatindex_6;Heatindex_7;Heatindex_8;Heatindex_9;Heatindex_10;weather;forecast
) VALUES (!MySQLRow!)" ^
    }




pause>nul&exit
:getLastLineFile <Path> <Output>
for /f "delims=" %%l in ('type "%~1"') do set %~2=%%~l
goto :eof
:MySQL <Object>
for %%p in (%*) do for /f "tokens=1,* delims=:" %%1 in ("%%~p") do (
set key=%%~1&set key=!key:"=!
if not "!key:{=}!"=="}" set "MySQL_!key!=%%~2"
)
"%MySQL_path%" -h%MySQL_host% -u%MySQL_user% -p%MySQL_password% -D%MySQL_database% -e "%MySQL_command%" >nul && echo;mysql: Command executed with Success^^!
goto :eof
:csvRowToMySQLRow <CSV_ROW> <OutPut_MySQL_ROW> <DELIMITER>
set rowcsv=!%~1!
set %~2='!rowcsv:%~3=','!'
goto :eof



exit



Dernière édition par ardigier le Ven 27 Avr 2018 - 23:11; édité 5 fois
Visiter le site web du posteur
Message [R] batch de mise à jour d'une BDD à partir d'un csv 


Montrer les messages depuis:
Répondre au sujet Page 1 sur 3
Aller à la page: 1, 2, 3  >
  



Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Copyright 2008 - 2016 // Batch