IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

[Batch] Extraire des données d'un fichier CSV


Sujet :

Scripts/Batch

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut [Batch] Extraire des données d'un fichier CSV
    Bonjour,

    J'ai jamais touché au batch avant aujourd'hui, et j'ai besoin de déplacer de très nombreux fichiers en modifiant presque totalement l'arborescence de chacun.
    Pour cela, j'ai remplis un tableau excel que j'ai exporté en csv afin de le traiter automatiquement par la suite.
    Ça me donne un fichier remplit de la forme suivante (j'ai donc une ligne par fichier) :
    adresse_du_fichier;reference;marque;type

    Je veux automatiser la chose suivante :
    copier le fichier à l'adresse "adresse_du_fichier" vers une adresse de la forme "type"\"marque"\"reference"\"nom_du_fichier"

    C'est quelque chose que j'ai déjà fait en php, mais pour des raisons logicielles, je ne peux pas utiliser ce langage.
    Je n'ai pas trouvé de moyen simple en C non plus, c'est pour ca que je me suis tourné vers le batch .
    Je sais que je devrais utiliser Xcopy pour copier mes fichiers, mais avant il me faut recomposer l'adresse de destination.

    J'ai pensé créer 4 variables, une pour chaque critère.
    Mais ensuite, je dois remplir ces variables avec les bonnes données, et pour ca, la fonction "explode" en PHP m'avait bien aidé.
    Je cherche donc quelque chose qui aurait la même fonction donc, avec comme séparateur le point virgule ";"

    Peut être que vous pourrez m'aider ? Je sais que ca doit pas être très compliqué, mais j'ai déjà passé toute la matinée à chercher sur internet sans rien trouver...

    Merci d'avance !

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    tu n'as rien trouvé via les différents liens de cette page ?

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Non, j'avais déjà cherché dans la FAQ, sans rien trouver. Peut être qu'il possible de se baser sur l'un des articles, mais je n'ai rien trouvé correspondant à mon problème.

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Un début :
    @echo off
    set CSVFile_TestRow=File.CSV
    for /f %%I in ('CD') do set FilePath=%%I
    rem FullPath
    set CSVFile_TestRow=%FilePath%\%CSVFile_TestRow%
    rem lit toutes les lignes excepté la premiére.
    rem Delimiteur de champ dans le CSv =;
    rem Pour chaque ligne ...
    rem La ligne contient 5 champs
    for /f "Skip=1 tokens=1,2,3,4,5 delims=;" %%I in (%CSVFile_TestRow%) do Faitqqchose %%I %%J %%K %%L...
    goto end
    rem ...
    :end
    rem libére les variables
    set CSVFile_TestRow=
    set FilePath=

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci !

    J'arrive à stocker mes valeurs dans les variables, mais j'avoue que le fonctionnement est tres mystique pour moi ?!

    @echo off
    set CSVFile_TestRow=File.CSV
    //for /f %%I in ('CD') do set FilePath=%%I
    // A quoi sert cette ligne ? Pour la suite ?

    rem FullPath

    // set CSVFile_TestRow=%FilePath%\%CSVFile_TestRow%
    // J'ai mis cette ligne en commentaire, je ne sais pas à quoi elle sert.
    // Pourquoi avoir redéfini CSVFile_TestRow ? Et le FilePath signifie qqch de
    //particulier ? Une variable d'environnement ?

    rem lit toutes les lignes excepté la premiére.
    rem Delimiteur de champ dans le CSv =;
    rem Pour chaque ligne ...
    rem La ligne contient 5 champs
    for /f "Skip=1 tokens=1,2,3,4,5 delims=;" %%I in (%CSVFile_TestRow%) do Faitqqchose %%I %%J %%K %%L...
    goto end
    rem ...

    //Là à ce niveau là, ca marche nickel, mais je ne sais pas d'où viennent les
    //%%J .... %%L. Ils sont définis automatiquement dans l'ordre alphabétique
    //par rapport à %%I ou je peux leur donner le nom que je veux ?



    :end
    rem libére les variables
    set CSVFile_TestRow=
    set FilePath=

    Par contre, quand il y a des colonnes vides, ca me décale tout. Il faudra donc que j'essaye de trouver qqch afin de prendre ce critère en compte.

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par soufianekh Voir le message
    // A quoi sert cette ligne ? Pour la suite ?
    Mémoriser le chemin de démarrage.

    Citation Envoyé par soufianekh Voir le message
    Pourquoi avoir redéfini CSVFile_TestRow ?
    Pour l'avoir en nom complet (full path). On peut faire plus simple, mais ce n'est pas le plus crucial. Retiens surtout que %CSVFile_TestRow% contient le nom complet de ton CSV.

    Citation Envoyé par soufianekh Voir le message
    Ils sont définis automatiquement dans l'ordre alphabétique par rapport à %%I ou je peux leur donner le nom que je veux ?
    Ordre alphabétique, tu n'as pas le choix de leur nom mais uniquement le choix du nom du PREMIER élément (celui dans le "FOR").

    De même, on peut éviter d'avoir à "nettoyer" les variables en fin de batch en mettant un "setlocal enableextensions" en début de batch.


    Dans tous les cas, l'aide intégrée de Windows te fournira une référence complète pour toutes les commandes DOS.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mac LAK
    On peut faire plus simple
    Certainement, mais je préfére souvent expliciter pour faciliter la relecture.
    Citation Envoyé par Mac LAK
    De même, on peut éviter d'avoir à "nettoyer" les variables en fin de batch en mettant un "setlocal enableextensions" en début de batch.
    Oui, si on utilise NT 4.0 et >
    Citation Envoyé par Mac LAK
    Dans tous les cas, l'aide intégrée de Windows te fournira une référence complète pour toutes les commandes DOS.
    +1
    Set /?
    For /?
    Help

  8. #8
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    salut,


    Pour completez ce que vient de dire Laurent Dardenne et Mac LAK:

    une petite explication des TOKENS "Field" et DELIMS que tu va rencontrer si tu lis l'aide de la commande FOR.

    voici des variantes que peux prendre l'option "Tokens":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      Tokens=1,3  => champ 1 et 3
      Tokens=1    => champ 1
      Tokens=2-4  => champ de  2 à 4
      Tokens=2,*  => Champ 2 + tout le reste
      TOKENS=0XA  => champ 10 (en hexa)
      TOKENS=010  => champ 8  (en octal)
    Le séparateur de champs "DELIMS=" peux prendre plusieurs délimiteurs (par défaut c'est: espace et tabulation)

    schema explicatif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      
            
             adresse_du_fichier;reference;marque;type
     token1 -------------^     ^     ^   ^   ^  ^  ^-- token4
             delim ------------|     |   |   |  |
                   token2 -----------|   |   |  |--- delim
                          delim ---------|   |  
                                 token3 -----|
    voici une autre approche, avec l'utilitaire Gawk:

    in.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    adresse_du_fichier;reference;marque;type
    test.txt;001;temp;c:
    logFile.txt;002;test;d:\dossier
    code Gawk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gawk -F";" "{getline;cp[\"Copy \"$1\"  \"$4\"\\\\\"$3\"\\\\\"$2]}END{for(o in cp)system(o)}" in.txt
    va copier le fichier :
    logFile.txt --> d:\dossier\test\002
    test.txt --> c:\temp\001

  9. #9
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour toutes ces précisions, ca m'a permis de bien avancer dans mon code :
    @echo off
    set CSVFile_TestRow=liste_fichiers_TEST.csv
    set /a _compteur=0
    set /a _pourcentage=0
    set _destination=0


    setlocal enabledelayedexpansion

    for /f "Skip=1 tokens=1,2,3,4,5,6 delims=;" %%I in (%CSVFile_TestRow%) do (
    set /a _compteur+=1
    if !_compteur!==13 (
    set /a _pourcentage+=1
    set _compteur=0
    echo Copie en cours... !_pourcentage!%%
    )


    echo 1 l'adresse du fichier est : %%I >> test.txt
    echo 2 La reference du produit est : %%J >> test.txt
    echo 3 Fournit par : %%K >> test.txt
    echo 4 Type de doc : %%L >> test.txt
    echo 5.Type de composant : %%M >> test.txt
    echo 6 Fournisseur: %%N >> test.txt
    echo. >> test.txt
    set _destination=%%M\%%N\%%J\%%L\%%K\
    echo la nouvelle adresse devra etre : !_destination! >> test.txt
    echo. >> test.txt
    xcopy "%%I" "!_destination!" /Y /V /q
    )
    goto end
    rem ...
    :end
    rem libére les variables
    echo Copie en cours... 100%%
    echo Copie terminee !
    set CSVFile_TestRow=

    pause
    Pour le soucis des champs vides, je me suis résigné à les remplir par "champ vide", ou qqch du genre, pour éviter d'avoir des soucis par la suite.

    Par contre, j'ai encore un probleme, avec Xcopy cette fois :
    De très nombreux fichiers que j'ai à copier sont contenus dans des dossier avec des accents, et j'ai un message d'erreur "Fichier introuvable"...
    J'ai trouvé des solutions pour palier à ce problème, comme mettre un ? au lieu des accents, mais j'ai beaucoup trop de fichiers à copier... Si jamais vous avez une solution, je suis preneur !

  10. #10
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Petite remarque : TOUJOURS mettre le "setlocal enabledelayedexpansion" comme PREMIERE instruction, juste après le "@echo off".

    Pour les accents, c'est un problème de codage des caractères sûrement : la ligne de commande (appelée abusivement "DOS" depuis qu'il a disparu) utilise un encodage différent de Windows "graphique". Toutefois, ça fait longtemps que je n'ai pas eu le problème ailleurs que sur l'affichage pur et dur (commandes ECHO), lorsque l'on écrit avec un éditeur Windows sans encoder au format OEM.

    A part jongler avec les commandes suivantes, et encore, je ne vois pas trop de solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Passage en codage Windows / ANSI
    mode con cp SELECT=1252
    // Retour en codage DOS / OEM
    mode con cp SELECT=850
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  11. #11
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    mode con cp SELECT=1252
    Merci beaucoup, ca marche avec ça !

    J'ai juste un Ù à la place du é pour les informations de Xcopy, mais ce n'est pas grave, le reste marche.

    J'ai énormément appris grâce à vous, merci encore !

  12. #12
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    salut,

    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @echo off
    for /f "tokens=2delims=:" %%a in ('chcp') do set _chcp=%%a
    chcp 1252
    
    :: // suite du code
    
    chcp %_chcp%

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PEAR] Extraire des données d'un fichier CSV pour en faire un PDF
    Par kleyde89 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 12/05/2011, 10h16
  2. Extraire des données d'un Fichier .csv
    Par wolverine1987 dans le forum MFC
    Réponses: 47
    Dernier message: 20/05/2009, 15h48
  3. Extraire des données d'un fichier .csv avec C++
    Par cre31400 dans le forum C++Builder
    Réponses: 14
    Dernier message: 08/07/2008, 10h25
  4. Extraire des données dans un fichier .csv
    Par orj30754 dans le forum C
    Réponses: 7
    Dernier message: 03/11/2006, 14h48
  5. Réponses: 7
    Dernier message: 29/09/2005, 10h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo