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

MATLAB Discussion :

Lecture d'un fichier de configuration dans une boucle


Sujet :

MATLAB

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut Lecture d'un fichier de configuration dans une boucle
    Bonjour,
    Je dois lire un fichier texte structuré comme un fichier ini :
    Avec un entête dans le début de la section
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [Curve]
    number_points=376
    Spacing=4.50
    puis après la liste de mes points avec leurs paramètres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    pos=(972.6858,435.4503,-598.5822)
    perp=(0.9491,-0.0010,-0.3151)
    normal=(-0.0120,0.9992,-0.0392)
    vect=(1.4965,0.1841,4.2200)
    width=(4.145,4.148,8.291,8.296)
    dwidth=(8.291,8.296,0.000,0.000)
    chaque point possède l'ensemble de ces paramètres et je voudrais pouvoir charger l'ensemble de ces points avec les paramètres associés dans un tableau.
    Pour lire les .ini j'utilise la classe IniConfig.

    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Quel est ton problème précisément ? Par quoi es-tu bloqué ?
    Tu as essayé de coder quelque chose ?

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    En fait je ne sais pas par où commencer .
    En effet je sais récupérer le nombre de points
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            ini = Fct_Ini();
            ini.ReadFile(Point.cfg);
            NbLap = ini.GetValues('[LapNumber]', 'number_points');
    mais après je ne sais pas comment faire ma boucle pour récupérer chaque paramètres de mes points.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        for k=1:NbLap
          ....
        end
    La solution est peut-être de passer par la lecture du fichier ligne par ligne car les points sont les uns derrière les autres.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ini = IniConfig();
    ini.ReadFile('tonFichier.ini');
    keys = ini.GetKeys('Curve');
    number_points = ini.GetValues('[Curve]', 'number_points');
    to_num = @(str) str2num(str(2:end-1));
    values = cellfun(@(key) to_num(ini.GetValues('[Curve]', key)), keys(3:end), 'UniformOutput', false)
    [keys(3:end) values]

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    Houla Houla tu m'as perdu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    values = cellfun(@(key) to_num(ini.GetValues('[Curve]', key)), keys(3:end), 'UniformOutput', false)
    Comment tu géres le fait que certains paramètres aient 4 variables et d'autres 3.
    Je regarde ça demain matin.
    Merci pour la piste.

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    Super ça marche j'ai juste enlevé le to_num car certains paramètres ont des commentaires .
    Maintenant je m'attaque à la décomposition des tableaux de char.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    '(972.6858,435.4503,-598.5822)'
    '(0.9491,-0.0010,-0.3151)'
    '(-0.0120,0.9992,-0.0392)'
    '(1.4965,0.1841,4.2200)'
    '(4.145,4.148,8.291,8.296) // left, right, left, right'
    '(8.291,8.296,0.000,0.000) // left, right, left, right'
    Merci

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    J'utilise la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String = regexp(values{k}, ' (?<=\().*(?=\))', 'match')
    pour extraire mes données avant de les séparer mais ça ne marche pas pour les lignes ou il y a un commentaire.

    Une idée ?

    Merci

  8. #8
    Invité
    Invité(e)
    Par défaut
    Tu as un espace en trop au début de ton pattern.
    Sinon remplace to_num par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_num = @(str) sscanf(str(2:end), '%f,');

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    Pour extraire mes chiffres j'ai fait ça
    moins propre mais ça à le mérite de marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function ValArray=ExtractValue(Tab)
        Pt = find(Tab==')');
        if isempty(Pt)
            TabArray = Tab;
            return;
        end
        Str = Tab(2:(Pt-1))
        ValArray = strsplit(Str,',');
        return;
    end
    maintenant je me trouve avec x cells que je voudrais stocker dans ma boucle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for k=1:length(keys)
      Infopoint(k,1) = ExtractValue(values{j});
      j++;
      Infopoint(k,2) = ExtractValue(values{j});
      j++;
    end
    ET avoir dans infopoint un tableau de toutes mes données.

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    Aïe , j'ai parlé trop vite dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    keys = ini.GetKeys('Curve');
    number_points = ini.GetValues('[Curve]', 'number_points');
    to_num = @(str) str2num(str(2:end-1));
    values = cellfun(@(key) ini.GetValues('[Curve]', key), keys(3:end), 'UniformOutput', false)
    [keys(3:end) values]
    j'ai bien le bon nombre de points par contre chaque points est identique comme si il n'y avait pas d’incrémentation ???

    et si je fais comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    values = cellfun(@(key) to_num(ini.GetValues('[Curve]', key), keys(3:end)), 'UniformOutput', false)
    le tableau values possèdent le bon nombre de points mais il est vide .
    Merci

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    Je crois que j'ai compris pourquoi j'ai toujours les mêmes valeurs.
    Les points ont toujours le même nom par groupe de 20 , donc la classe lit seulement les 20 premiers. Il faut que je trouve une autre solution pour lire toutes les clés de ma section et extraire celles dont j'ai besoin.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Si je comprends bien, tu as ces 20 lignes dans chaque [Section] du fichier.
    Appelle alors la méthode GetSections() et boucle sur chacune d'entre-elle.

  13. #13
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    En fait dans ma section j'ai une série de variables uniques (26 pour être exact) et ensuite j'ai n fois un bloc de données dont le nom est le même , comme ceci par exemple ou j'ai 376 blocs identiques après les premières valeurs.

    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
     
    [Curve]
    number_points=376
    Spacing=4.50
    ...
    pos=(972.6858,435.4503,-598.5822)
    perp=(0.9491,-0.0010,-0.3151)
    normal=(-0.0120,0.9992,-0.0392)
    vect=(1.4965,0.1841,4.2200)
    width=(4.145,4.148,8.291,8.296)
    dwidth=(8.291,8.296,0.000,0.000)
    ...
    pos=(972.6858,435.4503,-598.5822)
    perp=(0.9491,-0.0010,-0.3151)
    normal=(-0.0120,0.9992,-0.0392)
    vect=(1.4965,0.1841,4.2200)
    width=(4.145,4.148,8.291,8.296)
    dwidth=(8.291,8.296,0.000,0.000)
    ...
    pos=(972.6858,435.4503,-598.5822)
    perp=(0.9491,-0.0010,-0.3151)
    normal=(-0.0120,0.9992,-0.0392)
    vect=(1.4965,0.1841,4.2200)
    width=(4.145,4.148,8.291,8.296)
    dwidth=(8.291,8.296,0.000,0.000)

  14. #14
    Invité
    Invité(e)
    Par défaut
    Les clés sont donc en double pour une même [Section] ?
    Je ne m'y connais pas plus que ça mais ce fichier est-il un fichier .ini valide ainsi ?

    Une solution avec textscan :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fid = fopen('test.txt', 'rt');
    data = textscan(fid, '%[^=]=(%[^)])', 'HeaderLines', 3);
    fclose(fid);
     
    keys = data{1};
    values = cellfun(@str2num, data{2}, 'UniformOutput', false);

  15. #15
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    En fait le fichier à la structure d'un ini classique , c'est tout.
    Il y a plusieurs sections avant celle qui m'intéresse.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Il faudrait peut-être fournir TOUS les éléments dès le début, et non au compte goutte

  17. #17
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    Désolé je pensais pas que ce serait aussi complexe
    Je n'avais pas remarqué la redondance des infos dans la section , jusqu’à ce matin.

  18. #18
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    Pour info voila ma solution
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    fid = fopen(filename);
     
    start = 0;
    PtNbPoint = 0;
    while feof(fid) == 0
        line = fgetl(fid);
        if isequal(line ,'[Curve]')
            start =1;        % Le debut de la section a été trouvé
            line = fgetl(fid);        
        end
        if isequal(start ,1)
            Pt = findstr(line,'=');
            ID = line(1:(Pt-1));
            if isequal(ID ,'number_waypoints')
                number_waypoints = str2double(line((Pt+1):end));
                start = 2; %cherche la premier occurence de position
            end
        end
        if isequal(start ,2)
            Pt = findstr(line,'=');
            ID = line(1:(Pt-1));
            if isequal(ID ,'pos')
                start = 3; %La premiere occurence est trouvée           
                PtNbPoint = 1;
            end
        end
     
        if isequal(start ,3)
    % pos=(972.6858,435.4503,-598.5822)
            disp(PtNbPoint);
            Pt = findstr(line,'=');
            tmp= ExtractValue(line((Pt+1):end));
            InfoWaypoint(PtNbPoint,1,1) = str2double(tmp{1});
            InfoWaypoint(PtNbPoint,2,1) = str2double(tmp{2});
            InfoWaypoint(PtNbPoint,3,1) = str2double(tmp{3});
            line = fgetl(fid);        
     
    % perp=(0.9491,-0.0010,-0.3151)
            Pt = findstr(line,'=');
            tmp= ExtractValue(line((Pt+1):end));
            InfoWaypoint(PtNbPoint,1,2) = str2double(tmp{1});
            InfoWaypoint(PtNbPoint,2,2) = str2double(tmp{2});
            InfoWaypoint(PtNbPoint,3,2) = str2double(tmp{3});
            line = fgetl(fid);        
     
    %normal=(-0.0120,0.9992,-0.0392)
            Pt = findstr(line,'=');
            tmp= ExtractValue(line((Pt+1):end));
            InfoWaypoint(PtNbPoint,1,3) = str2double(tmp{1});
            InfoWaypoint(PtNbPoint,2,3) = str2double(tmp{2});
            InfoWaypoint(PtNbPoint,3,3) = str2double(tmp{3});
            line = fgetl(fid);         
     
    %vect=(1.4965,0.1841,4.2200)
            Pt = findstr(line,'=');
            tmp= ExtractValue(line((Pt+1):end));
            InfoWaypoint(PtNbPoint,1,4) = str2double(tmp{1});
            InfoWaypoint(PtNbPoint,2,4) = str2double(tmp{2});
            InfoWaypoint(PtNbPoint,3,4) = str2double(tmp{3});
            line = fgetl(fid);         
     
    %width=(4.145,4.148,8.291,8.296)
            Pt = findstr(line,'=');
            tmp= ExtractValue(line((Pt+1):end));
            InfoWaypoint(PtNbPoint,1,5) = str2double(tmp{1});
            InfoWaypoint(PtNbPoint,2,5) = str2double(tmp{2});
            InfoWaypoint(PtNbPoint,3,5) = str2double(tmp{3});
            InfoWaypoint(PtNbPoint,4,5) = str2double(tmp{3});
            line = fgetl(fid);         
     
    %dwidth=(8.291,8.296,0.000,0.000)
            Pt = findstr(line,'=');
            tmp= ExtractValue(line((Pt+1):end));
            InfoWaypoint(PtNbPoint,1,6) = str2double(tmp{1});
            InfoWaypoint(PtNbPoint,2,6) = str2double(tmp{2});
            InfoWaypoint(PtNbPoint,3,6) = str2double(tmp{3});
            InfoWaypoint(PtNbPoint,4,6) = str2double(tmp{3});
            line = fgetl(fid);         
     
            PtNbPoint = PtNbPoint + 1;
     
            if (PtNbPoint > number_waypoints)
                break;
            end
        end    
     
     
    end
    fclose(fid);
    avec la petite fonction d'extraction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function ValArray=ExtractValue(Tab)
        Pt = find(Tab==')');
        if isempty(Pt)
            ValArray = Tab;
            return;
        end
        Str = Tab(2:(Pt-1));
        ValArray = strsplit(Str,',');
     
        return;
    end
    Et voila un joli tableau avec toute mes valeurs.
    J'ai l'habitude de programmer sur microcontrôleur et je ne connais pas Matlab alors ça donne ça
    mais bon ça marche et c'est rapide

    Merci

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

Discussions similaires

  1. Nom de fichier image incrémenté dans une boucle for
    Par franck31 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 12/10/2011, 17h49
  2. Utiliser le fichier de configuration dans une librairie jar
    Par Palsajicoco dans le forum Hibernate
    Réponses: 0
    Dernier message: 16/05/2011, 14h32
  3. Réponses: 5
    Dernier message: 25/03/2008, 11h58
  4. Analyse d'un fichier de redirection dans une boucle
    Par Safaritn dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 08/02/2008, 15h14
  5. Réponses: 4
    Dernier message: 26/01/2006, 13h12

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