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 :

Selectionner des valeurs précises dans un fichier texte [Batch]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut Selectionner des valeurs précises dans un fichier texte
    Bonjour à tous!

    Je débute en scripts/batch pour le compte d'un stage et je galère un peu à écrire un script.

    Voilà mon problème. Je dois normaliser un fichier texte contenant des zones de coordonnées géographiques (longitudes et latitudes) correspandants à des couvertures satellite. Le fichier est sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    [FormatInfo]
    format_ver=1
    [GeoMain]
    adm=USA
    sat_name=INTELSAT
    long_nom=64.15
    [COHeader]
    beam_id=Z4
    n_cont=19
    [C1]
    gain=-9.00
    n_point=618
    p1=144.931;19.459
    p2=144.903;19.938
    p3=144.885;20.244
    p4=144.868;20.521
    (...)  /* J'ai coupé il y a 618 lignes*/
    [C2]
    gain=-3.00
    n_point=208
    p1=98.014;-5.885
    p2=98.139;-5.806
    p3=98.290;-5.705
    p4=98.696;-5.389
    (...)
    [C3]
    gain=-2.00
    n_point=73
    p1=138.951;28.343
    p2=144.221;28.826
    p3=144.221;28.833
    p4=144.218;28.864
    (...)
    etc...
    n_cont est le nombre de surfaces différentes (couverture satellite difinie par un ensemble de sommets),gain une valeur à récupérer et n_point le nombre de points par surface.


    Je chercher à mettre en place un script qui respecterait l'algorithme suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    echo beam_id;gain;longitude;latitude >> coverage.txt
    * Trouver valeur de 'n_cont='
    * Stocker %n_cont%
    for /L %%i in (1,1,%n_cont%) do (
      * Trouver ligne [C%i]   
      * Trouver valeur de 'gain=' 
      * Trouver valeur de 'n_point=' 
      * Ligne suivante
      for /L %%j in (1,1,%n_point%) do (
          set %i%;%gain%; > coverage.txt  //insérer les valeurs dans le fichier texte
        * décaler curseur après "p%j%="
        * insérer fin de la ligne dans fichier texte ( qui vaut "lon;lat"
        * ligne suivante
      )
    )
    A termes mon but est de générer un fichier texte normalisé en colonnes afin de pouvoir facilement le charger dans une base de données SQL.

    Je cherche donc à parcourir proprement les lignes de mon fichier texte (une par une à partir des p1,p2,p3...) et en extraire des valeurs ou des portions de lignes, ne garder que "138.951;28.343" sur "p1=138.951;28.343" par exemple.

    J'ai vu cette solution qui semble se rapprocher de ce que j'aimerais faire. Mais je vous avoue ne pas avoir assez de bouteille dans ce language pour l'adapter à ma sauce.
    Avis donc à âme charitable pour un petit coup de pouce. Merci!!

  2. #2
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    salut,

    Ton approche n'est pas adaptée, ça va mettre une plombe pour traiter tes fichiers surtout s'ils sont gros.
    Étant donné que la structure de ton fichier modèle semble homogène, il est préférable de faire un traitement "récursif" en une seule passe et que ton script s'adapte en fonction des lignes qu'il rencontre...

  3. #3
    Membre Expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Par défaut
    Salut,

    je concorde avec Minnesota, que je salue au passage. Il vaut mieux que tu parcours ton fichier en une passe et tu sauves les modifications apportées à chaque ligne, si il y en a.

    Envoie le format exact de ton fichier de sortie, pour que l'on puisse te donner un coup de pouce.

    Amicalement

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut
    Bonjour minnesota et sachadee, merci pour vos réponses!

    C'est vrai qu'après réflexion ça risque de prendre beaucoup beaucoup de temps si je fais des "aller-retour" dans mon fichier.

    Donc si j'ai bien compris vous me conseillez plutôt de parcourir ligne par ligne mon fichier et mettre dans mon fichier de sortie que ce qu'y m'intèresse.

    J'ai plusieurs intérogations :
    - Est-ce une façon correcte de mettre une condition dans une boucle FOR?
    Est-ce aussi judicieux d'appeler des commandes ou vaut-il mieux mettre directement les instructions pour plus d'efficacité?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for /f  "delims=" %%a in (file.txt) do (
         if condition1 call :command1
         if condition2 call :command2
         if condition3 call :command3
    )
    - Comment ne comparer que le début d'une ligne?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [C1]
    gain=-6.00
    n_point=715
    p1=144.772;22.016
    p2=144.753;22.307
    Par exemple ici, ligne 2, savoir qu'on a "gain" avant le égal et ne sortir que "-6.00".
    J'imagine qu'il faut utiliser un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if "%%a"=="[C"* set id="..." (je ne sais pas comment mettre que C1 ou C2 en fonction)
    for /f "tokens=1 delims==" %%b in (%%a) do (
        if "%%b"=="gain"* set gain="token=2 delims=="
        if  "%%b"=="p"* echo %id%;%gain%;"token=2 delims==" %%a >> sortie.txt
    J'avoue ne pas bien maîtriser les notions token et delims...
    Je ne suis pas sur non plus de mon utilisation du caractère joker *.


    Le but étant de générer un fichier de cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    beam_id;gain;longitude;latitude 
    C1;-6.00;144.772;22.016
    C1;-6.00;144.753;22.307
    C1;-6.00;144.734;22.590
    C1;-6.00;144.716;22.839
    C1;-6.00;144.702;23.039
    C1;-6.00;144.676;23.411
    (etc.. jusqu'à la fin de C1)
    C2;-1.00;92.067;66.213
    C2;-1.00;92.197;66.279
    C2;-1.00;92.338;66.348
    (etc.. jusqu'à la fin de C2)

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut
    Je ne suis pas encore certain certain de la forme de mes fichiers de sortie. Est-ce que ça serait compliqué de les mettre putôt sour la forme suivante ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    beam_id;gain;poylgon
    C1;-6.00;'POLYGON((144.772 22.016, 144.753 22.307, 144.734 22.590, 144.716 22.839, ...))'
    C2;-1.00;'POLYGON((92.067 66.213, 92.197 66.279, 92.338 66.348, ... ))'
    C3;4.00;'POLYGON((93 66.213, 72.197 61.279, 92.338 66.348, ... ))'
    Je pense que ça sera plus simple pour moi pour générer directement mes polygones dans ma base de donnée. Désolé pour le changement.

  6. #6
    Membre Expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Par défaut
    Salut,

    la première proposition est la plus adaptée pour la programation batch.
    Dans la seconde il faudrait creer une liste par concaténation de variables et si tu as plus de 600 valeurs de longitude et latitude ça va poser des problèmes pour la sauvegarde sur une ligne (limité à 4096 Octets).

    J'ai donc écris ce code qui correspond à ta première idée.
    Tu remarqueras que je n'ai fais que de la comparaison de caractères, cela est suffisant dans ton cas et évite des boucles "FOR" en cascade.

    Ce code traite jusqu'a 999 lignes par beam tu peux l'augmenter si nécessaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    @echo off
    ::::Par SachaDee 05-04-2013
    
    
    ::::TON FICHIER DE DEPART
    set $f_source=tmp.txt
    
    ::::TON FICHIER DE DESTINATION
    
    set $f_destination=coverage.txt
    
    @echo off
    set $switch=1
    set $gain=gain
    set $swtp=1
    set $tp=p
    
    setlocal enabledelayedexpansion enableextensions
    
    for /f %%a in (%$f_source%) do (
                                    set $ligne=%%a
    ::::LE GAIN 
                                    set vgain=!$ligne:~0,4!
    			        if /i !vgain!==%$gain% (set $valg=!$ligne:~5,5!) 
    
    ::::LONGITUDE ET LATITUDE
                                    set tp=!$ligne:~0,1!
    			        if /i !tp!==%$tp% (if !$swtp! leq 999 (set $long=!$ligne:~5,14!)
                                                       if !$swtp! leq 99 (set $long=!$ligne:~4,14!)
                                                       if !$swtp! leq 9 (set $long=!$ligne:~3,14!)
                                                       echo C!$switch!;!$valg!;!$long!                 
    ::::ECRITURE
                                                       echo C!$switch!;!$valg!;!$long!>>%$f_destination%
    ::::ON INCREMENTE LE No DE LIGNE
                                                       set /a $swtp+=1)
    
    
    ::::TRAITEMENT DU BEAM
                                    set val1=!$ligne:~0,2!
                                    set val2=[C
    
                                    if /i !val1!==!val2! (set $num=!$ligne:[C=!
                                    set $num=!$num:]=!
                                    echo !$num!|findstr /r "[^0-9]" > nul
                                    if errorlevel 1 (set $switch=!$num!)
    
    
    ::::ON RESET LE COMPTEUR DE LIGNE
                                                      set $swtp=1))
     
    endlocal
    La rapidité de traitement est excellente (moins de 1 secondes pour 1000 lignes).

    Si tu a besoin d'explication n'hésite pas

    Amicalement

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

Discussions similaires

  1. [Débutant] selectionner des valeurs précises dans un vecteur
    Par nonolt dans le forum MATLAB
    Réponses: 5
    Dernier message: 10/12/2009, 18h52
  2. Attribution des valeurs lues dans un fichier texte
    Par law56100 dans le forum WinDev
    Réponses: 1
    Dernier message: 29/05/2008, 16h07
  3. Réponses: 3
    Dernier message: 04/01/2007, 17h42
  4. Transposer des données sql dans un fichier texte
    Par Anakior dans le forum Outils
    Réponses: 3
    Dernier message: 11/12/2005, 10h01
  5. aller à une position précise dans un fichier texte
    Par bassidi meryeme dans le forum Langage
    Réponses: 3
    Dernier message: 27/10/2005, 14h57

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