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 :

problème lors de lecture de fichier vers variable [Batch]


Sujet :

Scripts/Batch

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut problème lors de lecture de fichier vers variable
    Bonjour,

    après moultes recherches sur le net, je n'ai toujours pas trouvé de réponse à cette question:

    Je veux faire un programme qui va lire un fichier (possédant une certaine extension) et traiter les données (parser la ligne en plusieurs variables afin de les présenter autrement)

    pour effectuer tout ça, j'utilise 3 #.bat (1 qui boucle sur les fichier .EXT, 1 qui boucle sur les lignes présentes dans le fichier et finalement un qui traite les lignes)

    dans le deuxième #.bat (file.bat) je lis le fichier passé par le premier:
    2 solutions:

    lire ligne par ligne avec un for et envoyer chaque ligne au fichier line.bat (qui traite les données)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for /f %%a in ('type %FILE%') do (call line.bat %%a)
    ou
    envoyer toutes les données du fichier dans une variable
    Le fichier contient UNE SEULE LIGNE suuuuuuper longue (pas le choix, je la reçois comme ça) et donc l'une ou l'autre manière fonctionne.

    SAUF QUE la variable ne contient que le début de la ligne!
    (et même si je divise le fichier 1ligne=un jeu de données, les lignes sont toujours trop longue pour être complètement mise dans la variable)

    LA QUESTION est donc: comment lire une suuuuuper longue ligne avec Batch?

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for /f "delims=" %%a in ('type %FILE%') do (call line.bat "%%a")
    Ainsi, il ne devrait plus s'arrêter au premier espace, et donc lire ta ligne d'un seul coup. Note bien qu'il n'y a PAS d'espace entre le "=" et la guillemet fermante.

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Effectivement, celà fonctionne bien mieux avec ces "delims=" .
    (C'est donc un argument par defaut à " ", à noter)

    maintenant j'ai du mal à supprimer les guillemets lorsque je reçois la variable dans mon batch suivant.

    J'essaye ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ::récupération de la ligne
    ::set LINE=%1%
    
    set LINE=echo %1% | sed 's@"@@g'
    mais je ne maitrise pas le sed visiblement.

    J'ai aussi tenté ceci:
    [code]
    set LINE=%1:~1,-1%
    [CODE]
    OU
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set LINE=%1%
    
    set LINE=%LINE:~1,-1%
    mais là encore, je ne dois pas m'y prendre comme il faut...

    (Ma solution reste d'utiliser un caractère en plus dans mes délimitation pour prendre en compte le premier guillemet)

    En tout cas, un grand merci pour m'avoir indiqué la solution. Ce fut d'une aide et d'une rapidité remarquable!

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    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
    De rien !

    C'est ceci qu'il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set line=%1
    set line=%line:~1,-1%
    Note la suppression du deuxième "%" après "%1". Pour la syntaxe, l'aide de set devrait t'aider à mieux comprendre pourquoi c'est "1,-1" qu'il faut mettre.

    Pour le coup du "delims", c'est l'aide de for qui t'indique quelles sont les valeurs par défaut.

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Magnifique!

    en effet, je vais aller voir le coups du %1% et %1 de plus près

    Un grand merci pour ton aide!

  6. #6
    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
    Citation Envoyé par snake-darkangel Voir le message
    J'essaye ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ::récupération de la ligne
    ::set LINE=%1%
    
    set LINE=echo %1% | sed 's@"@@g'
    salut,

    une des solutions avec SED
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set line="une chainnnnnnnnnnne troooooooooop longuuuuuuuuue"
    echo.%line% | sed  "s=^\x22\(.*\)\x22.$=\1="

  7. #7
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set line=%1
    set line=%line:~1,-1%
    Attention Mac LAK, on a ouvert un thread pour ce genre de chose.

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    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 maxim_um Voir le message
    Attention Mac LAK, on a ouvert un thread pour ce genre de chose.
    Gni ? La substitution ne fonctionne pas avec les arguments primaires (%0 .. %9), pas plus qu'avec les variables de boucle (%%i), et tu ne peux pas leur affecter une valeur arbitraire par code.
    Sans affecter une telle variable automatique à une autre variable "normale", comment veux-tu effectuer la substitution ?

    Ou alors, mon taux de caféine dans le sang n'est pas encore assez élevé...

  9. #9
    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 maxim_um
    salut Mac LAK

    Mac LAK , je crois que maxim_um parlait de: %~1 en cas de paramètre et/ou %%~a en cas de boucle

  10. #10
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    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 I'm_HERE Voir le message
    Mac LAK , je crois que maxim_um parlait de: %~1 en cas de paramètre et/ou %%~a en cas de boucle
    [Perf de café ON]
    Je ne vois toujours pas, ou alors, c'est tellement visible que ça ne me saute pas aux yeux...

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @echo off
    setlocal
    echo %1
    echo %1:~1,-1
    echo %1:~1,-1%
    echo %%1:~1,-1%
    echo %%1:~1,-1%%
    set tmp=%1
    echo %tmp:~1,-1%
    Seul le dernier echo effectue ce que l'on veut, à savoir virer le premier et le dernier caractère du premier paramètre passé au batch. Les autres, basés directement sur %1, ne fonctionnent pas, d'où l'affectation à une variable "normale" avant d'effectuer la substitution.

  11. #11
    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
    Citation Envoyé par Mac LAK Voir le message
    [Perf de café ON]
    Je ne vois toujours pas, ou alors, c'est tellement visible que ça ne me saute pas aux yeux...

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @echo off
    setlocal
    echo %1
    echo %1:~1,-1
    echo %1:~1,-1%
    echo %%1:~1,-1%
    echo %%1:~1,-1%%
    set tmp=%1
    echo %tmp:~1,-1%
    Seul le dernier echo effectue ce que l'on veut, à savoir virer le premier et le dernier caractère du premier paramètre passé au batch. Les autres, basés directement sur %1, ne fonctionnent pas, d'où l'affectation à une variable "normale" avant d'effectuer la substitution.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @echo off
    set chaine_avec_doubles_quotes="ma chaine"
    call:quotes %chaine_avec_doubles_quotes%
    goto:eof
    :quotes
    echo %1
    echo %~1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @echo off
    set chaine_avec_doubles_quotes="ma chaine"
    for %%a in (%chaine_avec_doubles_quotes%) do echo %%a
    for %%a in (%chaine_avec_doubles_quotes%) do echo %%~a
    goto:eof

  12. #12
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    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
    Arf, oui, par rapport aux guillemets... Je m'étais focalisé sur la substitution en "oubliant" ce qu'il voulait retirer à la base, j'étais resté sur "premier et dernier caractère"... Merci, I'm_HERE.

    Mais ça ne marche que pour les guillemets : ça ne change pas le fait qu'il faut passer par une variable normale pour opérer des substitutions sur des variables automatiques.

  13. #13
    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
    Citation Envoyé par Mac LAK Voir le message
    Mais ça ne marche que pour les guillemets : ça ne change pas le fait qu'il faut passer par une variable normale pour opérer des substitutions sur des variables automatiques.
    je suis d'accord avec toi

  14. #14
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    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 I'm_HERE Voir le message
    je suis d'accord avec toi
    Ça me rassure, à un moment, je me suis mis à douter de mes acquis en batch, je dois dire...

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

Discussions similaires

  1. Problème lors de lecture ou écriture fichier XML.
    Par Jeano81 dans le forum VB.NET
    Réponses: 9
    Dernier message: 09/05/2015, 22h59
  2. [JDOM] Problème lors de lecture d'un fichier XML
    Par 0coco0 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 23/03/2009, 15h11
  3. [DOM] problème lors du parcours du fichier xml
    Par krfa1 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 11/05/2007, 07h24
  4. Problème avec la lecture de fichiers audio
    Par ksper92 dans le forum Flash
    Réponses: 3
    Dernier message: 22/01/2007, 13h59
  5. VA lors de lecture du fichier XML
    Par LN(a) dans le forum Langage
    Réponses: 6
    Dernier message: 14/09/2005, 23h43

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