Partage
  • Partager sur Facebook
  • Partager sur Twitter

[BATCH] Récupération de fichier & insertion bdd

Sujet résolu
28 septembre 2021 à 14:17:12

Bonjour à tous,

J'ai créer un script qui me permet de récupérer des fichiers contenant des données afin de les insérer dans ma bdd de manière automatique. Les noms de fichier se compose de 3 premières lettre aléatoire suivi de 2 chiffres essentiels à mon script suivi d'autres chiffres.

Ex: TET5145464646.dat

Mon script fonctionne mais parfois il exécute un autre fichier. Comme TET415456516.dat alors que mon script doit gérer seulement les fichiers comportant 51 pour le 4eme et 5eme caractère.

Voici l'exemple d'un bout de mon script : 

SETLOCAL EnableDelayedExpansion

cd C:\wamp64\bin\mysql\mysql8.0.21\data\facturation
set PATH=.;C:\wamp64\bin\mysql\mysql8.0.21\bin\;%PATH%
set rep = C:\wamp64\bin\mysql\mysql8.0.21\data\facturation

IF EXIST "!rep!???51*.DAT" (
    for %%i in (!rep!???51*.DAT) do (

        @REM Conversion du fichier en m51.dat
        SET AncienNom="%%i"
        SET /a compteur+= 1 
        SET NouveauNom=m51
        REN !AncienNom! !NouveauNom!.DAT    

        @REM Insertion dans la BDD
        mysql -u root -e "LOAD DATA INFILE 'm51.dat' INTO TABLE facturation.table_m51_temp CHARACTER SET ASCII LINES TERMINATED BY '\r\n' (@_var) set donnees = @_var;"
        
        @REM Conversion du fichier m51.dat en m51/date/compteur et archivage 
        MOVE m51.DAT "archive\m51\m51%date:~-4%%date:~3,2%%date:~0,2%%time:~0,2%%time:~3,2%%time:~6,2%_!compteur!.DAT"
    )
)

J'avoue que le batch n'est pas ma tasse de thé et que j'ai passé un bon nombre d'heures afin de trouver l'origine du bug, mais la je sèche complètement.

J'ai essayé de mettre une condition if dans ma boucle for afin de tester le nom du fichier mais le script plante.

Je vous remercie à l'avance pour ceux qui se pencherons sur mon sujet :).

Bonne journée.

  • Partager sur Facebook
  • Partager sur Twitter
28 septembre 2021 à 20:02:03

Bonsoir,

Ta variable rep ne me paraît pas utile vu le cd ligne 3.
D'ailleurs, elle ne doit pas fonctionner car ta variable s'appelle "rep " (avec un espace à la fin) et non pas "rep".

Je ne comprend pas pourquoi ta variable PATH commence avec ".;".

Essaye ce code voir si il fait la même chose :

SETLOCAL EnableDelayedExpansion

set PATH=C:\wamp64\bin\mysql\mysql8.0.21\bin\;%PATH%
set "rep=C:\wamp64\bin\mysql\mysql8.0.21\data\facturation"
cd /D "%rep%"

IF EXIST "???51*.DAT" (
    for %%i in ("???51*.DAT") do (
		echo %%i
	)
)

pause
exit



  • Partager sur Facebook
  • Partager sur Twitter
29 septembre 2021 à 8:46:46

Bonjour,

Merci pour la correction mais malheureusement cela ne change pas le comportement du script. Il me fait toujours le même comportement sur 4 fichiers sur un total d'environ 10k fichiers. Ce n'est pas grand chose mais cela se répercute sur mes données de la bdd.

Cela pourrait il venir du nom du fichier? 

EDIT: Si le fichier est joué seul il n'y a pas de problème, c'est seulement lorsqu' il y a une multitude de fichiers.

C:\wamp64\bin\mysql\mysql8.0.21\data\facturation>(

 SET AncienNom="BAL51090616535855.DAT"
 SET /a compteur+= 1
 SET NouveauNom=m51
 REN !AncienNom! !NouveauNom!.DAT

 mysql -u root -e "LOAD DATA INFILE 'm51.dat' INTO TABLE facturation.table_m51_temp CHARACTER SET ASCII LINES TERMINATED BY '\r\n' (@_var) set donnees = @_var;"

 MOVE m51.DAT "archive\m51\m5120210929 83144_!compteur!.DAT"
)
        1 fichier(s) déplacé(s).

C:\wamp64\bin\mysql\mysql8.0.21\data\facturation>(

 SET AncienNom="BIO4121092411420087.DAT"
 SET /a compteur+= 1
 SET NouveauNom=m51
 REN !AncienNom! !NouveauNom!.DAT

 mysql -u root -e "LOAD DATA INFILE 'm51.dat' INTO TABLE facturation.table_m51_temp CHARACTER SET ASCII LINES TERMINATED BY '\r\n' (@_var) set donnees = @_var;"

 MOVE m51.DAT "archive\m51\m5120210929 83144_!compteur!.DAT"
)

-
Edité par Pierrotslider 29 septembre 2021 à 8:59:10

  • Partager sur Facebook
  • Partager sur Twitter
29 septembre 2021 à 20:20:31

Je n'arrive pas à reproduire le problème de mon côté, chez moi le code fonctionne uniquement avec les bon fichiers.

Tu peux tenter avec cette boucle for sait-on jamais :

@echo off
SETLOCAL EnableDelayedExpansion
 
set PATH=C:\wamp64\bin\mysql\mysql8.0.21\bin\;%PATH%
set "rep=C:\wamp64\bin\mysql\mysql8.0.21\data\facturation"
cd /D "%rep%"
 
IF EXIST "???51*.DAT" (
    for /f %%i in ('dir /A:-D /B "???51*.DAT"') do (
        echo %%i
    )
)
 
pause
exit



  • Partager sur Facebook
  • Partager sur Twitter
30 septembre 2021 à 8:48:16

Le problème reste le même se sont toujours les mêmes fichiers qui sont joués dans la commande.

J'ai essayé en vain de tester le fichier dans la boucle mais je n'arrive pas à récupérer le nom du fichier et le tester.

IF EXIST "???51*.DAT" (
    for /f %%i in ('dir /A:-D /B "???51*.DAT"') do (

        @REM Conversion du fichier en m51.dat
        SET AncienNom="%%i"
        SET SubNom=!AncienNom:~3,2!
        if !SubNom!=="51" (
            SET /a compteur+= 1 
            SET NouveauNom=m51
            REN !AncienNom! !NouveauNom!.DAT    

            @REM Insertion dans la BDD
            mysql -u root -e "LOAD DATA INFILE 'm51.dat' INTO TABLE facturation.table_m51_temp CHARACTER SET ASCII LINES TERMINATED BY '\r\n' (@_var) set donnees = @_var;"
            
            @REM Conversion du fichier m51.dat en m51/date/compteur et archivage 
            MOVE m51.DAT "archive\m51\m51%date:~-4%%date:~3,2%%date:~0,2%%time:~0,2%%time:~3,2%%time:~6,2%_!compteur!.DAT"
        )
    )

    mysql -u root -DBname= facturation -e "CALL calcul_ddo_m51()"
)

J'aimerai récupérer la valeur des 4eme et 5 eme caractère et de les tester a nouveau avant de faire l'insertion, mais je n'arrive pas a faire matcher ma condition.

En tout cas merci pour ton aide Zaibai.

  • Partager sur Facebook
  • Partager sur Twitter
30 septembre 2021 à 22:48:30

Modifie ta ligne 6 comme suit : SET SubNom="!AncienNom:~4,2!"

Il faut prendre en compte les ajouts de guillemets de la ligne 5 donc 4,2 à la place de 3,2.
On ajoute les guillemets à SubNom car ton if (côté droit) contient des guillemets ("51" ; comparaison string).

  • Partager sur Facebook
  • Partager sur Twitter
1 octobre 2021 à 8:41:26

Merci bien Zaibai !!!

Avec cette condition je n'ai plus le bug d'insertion de fichier.

En tout cas merci beaucoup pour ton aide.

  • Partager sur Facebook
  • Partager sur Twitter
4 octobre 2021 à 16:46:54 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


4 octobre 2021 à 19:16:02 - Message modéré pour le motif suivant : Réponse à un message modéré


4 octobre 2021 à 21:52:24 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


4 octobre 2021 à 21:59:00

@StephaneNene Bonsoir, merci de créer votre propre sujet dans le respect des règles du forum et de ne pas squatter celui des autres résolu.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter