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 :

Creation Dynamique des noms de variables


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Creation Dynamique des noms de variables
    Je suis un peu bloquée pour construire les fichiers objets:
    mes données sont comme suit pour n actifs:

    actif1.csv --- Actif2.csv ---Actif3.csv . % liste des fichiers CSV


    Ch1 Ch2 Ch3 ---Ch1 Ch2 Ch3 --- Ch1 Ch2 % les variables (ou champs) ont les mêmes noms



    a1 a2 a3 --- b1 b2 b3 --- c1 c2 % les données
    ... ... ... --- .. .. .. --- .. .. % etc...

    j'aimerai créer dynamiquement une série financière de fichiers objets (obj1, obj2, obj3, ..., objn).

    J'ai construit le code 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    location = 'C:\myfolder\';
    addpath(location);
    
    List={'actif1', 'actif2', 'actif3'}   % limitons nous a trois actifs
    
    
    for i=1:size(List,2)
        
        Name = dir([location,List{i},'*.CSV']);
        
        Indic = importdata([location, Name.Name]); % tout marche bien jusqu'ici
        
        actifname= Indic.textdata(1,2:end); %   ici les noms sont ch1, ch2 et ch3 (pour i=1)
        
        obj = fints(Indic.dates, Indic.data, actifname) % fichier objet est généré
        
        %  je serai heureuse si les fichiers objet ont les noms suivants:
        
        %  obj_1 , obj_2, obj_3    %   les noms des fichiers objets  pour i=1,2,3.
        
        % et les noms des champs des objets: val1_ch1, val1_ch2, val1_ch3     % pour l'actif 1   (obj1)
        
        %      val2_ch1, val2_ch2, val2_ch3     % pour l'actif 2   (obj2)
        
        % et  val3_ch1, val3_ch2, val2_ch3     % pour l'actif 3   (obj3)
        
    end
    
      % bref, j'aimerai que les noms des objets et de leurs champs soient différents d'un actif a un autre.

    Je suis vraiment coincée et j’apprécierai tout support.
    Merci: Jessy

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Ingénierie en automatisation et systèmes intelligents
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénierie en automatisation et systèmes intelligents
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    C'est possible, mais ce n'est pas réellement recommandé puisqu'il serait mieux d'utiliser des tableaux.

    Ta variable "obj" pourrait être un tableau de cellules.

    Regarde ici les différentes façons.

    myfile01.txt (Crée ce fichier avec ces données dans ton répertoire MATLAB pour utiliser le code de mon exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ch1  ch2  ch3
    95.01 76.21 61.54
    23.11 45.65 79.19
    60.68  1.85 92.18
    48.60 82.14 73.82
    89.13 44.47 17.63
    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
    clear all;
    close all;
    clc;
     
    % (1) Exemple d'utilisation avec eval (généralement déconseillé)
    % (2) Exemple d'utilisation avec struct (mieux, mais pas super)
    % (3) Exemple d'utilisation de cellules (beaucoup mieux)
     
    filename = {'myfile01.txt','myfile01.txt','myfile01.txt'};
    delimiterIn = ' ';
    headerlinesIn = 1;
    obj = cell(1,numel(filename)); % (3) Préallocation
    val = cell(1,numel(filename)); % (3) Préallocation
     
    for k = 1:numel(filename)
       A = importdata(cell2mat(filename(k)),delimiterIn,headerlinesIn);
       eval(['obj_',num2str(k),' = ''',cell2mat(filename(k)),''';']); % (1) Utilisation de eval
       var.(['obj_',num2str(k)]) = cell2mat(filename(k)); % (2) Utilisation d'une structure
       obj{k} = cell2mat(filename(k)); % (3) Utilisation d'une cellule
       val{k} = struct('ch',cell(1)); % (3) Préallocation
       for i = 1:numel(A.textdata)
           eval(['val',num2str(k),'_',cell2mat(A.textdata(i)),' = A.data(:,i);']); % (1) Utilisation de eval
           var.(['val',num2str(k),'_',cell2mat(A.textdata(i))]) = A.data(:,i); % (2) Utilisation d'une structure
           val{k}.ch{i} = A.data(:,i); % (3) Utilisation d'une cellule
       end
    end
    Avec "eval", tu as exactement ce que tu veux, mais c'est déconseillé.
    Avec la structure "var", tu as environ ce que tu veux en passant par "var.nom_variable", mais ce n'est pas encore super.

    Le mieux est de te faire des tableaux de cellules, voici ce que je te propose qui est le plus semblable à ta représentation :

    Au lieu de la variable "obj_1", tu utiliserais plutôt "obj{1}".
    Au lieu de la variable "val1_ch1", tu utiliserais plutôt "val{1}.ch{1}".

    En fait, tu pourrais même probablement utiliser un simple tableau à trois dimensions, en autant que tous tes fichiers ont le même nombre de "ch" et la même quantité de données :

    Première dimension est la liste des données
    Deuxième dimension est la série
    Troisième dimension est l'actif

    Et alors, par exemple, "tableau(:,1,1)" serait l'équivalent de "val{1}.ch{1}", soit "val1_ch1", tandis que "tableau(:,2,3)" serait l'équivalent de "val{3}.ch{2}", soit "val3_ch2".

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonjour TheReveller,
    Merci de ton msg.
    Je vais m'y atteler avec les cellules. j'aimerai savoir si dans un tel cas, il serait possible d'utiliser la commande merge pour supprimer les dates non communes aux differents objets?
    merci de me redire
    Jessy

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénierie en automatisation et systèmes intelligents
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénierie en automatisation et systèmes intelligents
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 38
    Points
    38
    Par défaut
    Je ne suis pas certain de savoir ce que tu veux faire et je ne connais pas bien la fonction "importdata", mais elle ne semble pas renvoyer de ".dates" comme dans ton exemple (?).

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Salut Éric,
    merci de ta réponse. voici un exemple de mon fichier

    ----asset1.csv----
    
     DATE,  "ARG PESO","AUST DOLLAR","BRIT POUND"
    12/25/98  25.0      76.21       61.54
    12/26/98  23.11     45.65      79.19
    12/27/98  60.68    1.85        92.18
    12/28/98  48.60    82.14       73.82
    
    
    
    ----asset2.csv----
    
     DATE,  "ARG PESO","AUST DOLLAR","BRIT POUND"
    12/25/98  33.0      33.21       23.54
    12/26/98  4.11     33.65        44.19
    12/27/98  34.68    3.85        23.18
    12/29/98  22.60    4.14        66.82

    j'aimerai avoir la structure suivante:


    ----obj1----
    
     "dates",  "asset1_ARG_PESO","asset1_AUST_DOLLAR","asset1_BRIT_POUND"
    12/25/98  25.0      76.21       61.54
    12/26/98  23.11     45.65      79.19
    12/27/98  60.68    1.85        92.18
    12/28/98  48.60    82.14       73.82
    
    
    ----obj2----
    
     "dates",  "asset2_ARG_PESO","asset2_AUST_DOLLAR","asset2_BRIT_POUND"
    12/25/98  25.0      76.21       61.54
    12/26/98  23.11     45.65      79.19
    12/27/98  60.68    1.85        92.18
    12/29/98  48.60    82.14       73.82


    ainsi, si je fais un merge des objets 1 et 2, la dernière date qui n'est pas commune disparaitra
    et un autre programme lit facilement obj1 et obj2.

    Merci encore, Jessy

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Ingénierie en automatisation et systèmes intelligents
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénierie en automatisation et systèmes intelligents
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 38
    Points
    38
    Par défaut
    Que veux-tu faire au final ?

    Lire plusieurs fichiers .csv avec MATLAB afin de générer un seul fichier (.txt par exemple) qui contient les données de tous tes fichiers .csv (à l'exception des dates non communes) ?

    Ensuite, ce fichier généré est lu et traité par un autre programme ?

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonjour eric,
    Je veux pouvoir generer les structures obj1 et obj2, comme ci-dessus decrit avec les noms des champs qui different.
    Un autre programme fera simplement les plots.
    Merci de me redire

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Ingénierie en automatisation et systèmes intelligents
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénierie en automatisation et systèmes intelligents
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    Ce n'est pas exactement ce que tu voulais, mais je te propose des trucs que j'ai bricolés. Par contre, n'estime pas cela comme parfait en terme de technique ou d'art de la programmation. Peut-être que d'autres apporteront des nuances et de nouvelles idées en voyant mes suggestions.

    J'ai les fichiers :

    asset1.csv
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DATE,ARG PESO,AUST DOLLAR,BRIT POUND
    12/25/98,25,76.21,61.54
    12/26/98,23.11,45.65,79.19
    12/27/98,60.68,1.85,92.18
    12/28/98,48.6,82.14,73.82
    asset2.csv
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DATE,ARG PESO,AUST DOLLAR,BRIT POUND
    12/25/98,33,33.21,23.54
    12/26/98,4.11,33.65,44.19
    12/27/98,34.68,3.85,23.18
    12/29/98,22.6,4.14,66.82
    Et ce code va lire ces fichiers, conserver les entêtes dans une variable et le reste dans un tableau numérique. Les dates sont converties en nombre pour les besoins du tableau numérique, mais elles peuvent être reconverties en texte pour les besoins d'affichage.

    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
    clear all;
    close all;
    clc;
     
    filename = {'asset1','asset2'};
    ext= '.csv';
    delimiterIn = ',';
     
    for i = 1:numel(filename) % Nombre de fichiers
        fid = fopen([filename{i},ext]); % Ouvrir le fichier
        if fid % Le fichier s'est ouvert
            tline = fgetl(fid); % Lire une ligne
            headers = regexp(tline, regexptranslate('escape', delimiterIn), 'split'); % Séparer par les virgules
            tline = fgetl(fid); % Lire la prochaine ligne
            j = 1; % Compteur de lignes
            while ischar(tline) % Il y a une ligne (pas la fin du fichier)
                tmp = regexp(tline, regexptranslate('escape', delimiterIn), 'split'); % Séparer par les virgules
                tmp{1} = datenum(tmp{1},'mm/dd/yy'); % Convertir la date en nombre
                for k=2:numel(tmp) % Convertir tous les strings lus en nombres
                    tmp{k} = str2num(tmp{k});
                end
                data(j,:,i) = cell2mat(tmp); % Convertir ces données en une matrice de nombres
                if i > 1
                    if data(j,1,i) ~= data(j,1,i-1) % Si la date n'est pas la même que celle du fichier précédent
                        flag(j) = false; % Incorrect - Noter qu'il faut la supprimer
                    else
                        flag(j) = true; % Correct - Noter qu'il faut la garder
                    end
                end
                j = j + 1; % Incrémenter le compteur de lignes
                tline = fgetl(fid); % Lire la prochaine ligne
            end
        end
    end
     
    if numel(filename) > 1
        data = data(flag,:,:); % Ne garder que les dates identifiées
    end
     
    % Le fichier data contient :
    % data(:,1,:) toutes les dates en nombre
    % data(:,2:end,:) toutes les données (2 : ARG PESO, 3 : AUST DOLLAR, 4 : BRIT POUND)
    % data(:,1,1) toutes les dates du premier fichier
    % data(:,1,2) toutes les dates du deuxième fichier, etc
     
    % Donc, en résumé :
    % data a 3 dimensions
    % Les lignes (première dimension) pointent chacune des dates
    % Les colonnes (deuxième dimension) pointent les valeurs (sauf la première colonne qui pointe toutes les dates)
    % Les pages (troisième dimension) pointent les fichiers
     
    % headers contient les titres des colonnes
     
    % Petit exemple
    col = 2; % 2 : ARG PESO, car en fait la première colonne contient les dates
    figure;
    for i=1:numel(filename)
        % Faire le graphique pour tous les fichiers
        % data(:,1,i) contient les dates du fichier i (devraient toutes être les mêmes)
        % data(:,col,i) contient les données du fichier i à la colonne col
        plot(data(:,1,i),data(:,col,i)); grid on; hold all;
    end
    hold off;
    set(gca,'XTick',data(:,1,1));
    datetick('x','mm/dd/yy','keepticks'); % Convertir les dates numériques en texte
    title(headers{col});
    legend(filename,'Location','NorthWest');
    xlabel('Date');
    ylabel('Valeur');

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/04/2007, 10h56
  2. Créer des noms de variables dynamiquement avec JSP
    Par Zakapatul dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 26/02/2007, 15h24
  3. Réponses: 1
    Dernier message: 15/09/2005, 12h59
  4. [VB.Net] Créer dynamiquement un nom de variable
    Par chuck_m dans le forum ASP.NET
    Réponses: 5
    Dernier message: 20/07/2005, 16h08
  5. Generer des noms de variables avec une boucle
    Par moutanakid dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/07/2004, 18h45

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