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 :

Lire des paramètres dans l'en tête d'un fichier puis passer des lignes de l'en-tête


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 50
    Points : 11
    Points
    11
    Par défaut Lire des paramètres dans l'en tête d'un fichier puis passer des lignes de l'en-tête
    Bonjour,

    Je viens vous demander conseil car je reste bloquée sur un problème depuis quelque temps.

    Voilà, j'ai des fichiers en entrée à lire qui contienent une en-tête avec des paramètres qui m'intéressent.
    Le nombre de lignes d'en-tête n'est jamais le même d'un fichier à l'autre. Et donc le nombre de lignes à passer pour accéder à mes données n'est jamais le même d'un fichier à l'autre.

    Le fichier d'entrée est de type :
    ##param1=2
    ##param2=10

    ...
    ensuite se trouvent les données que je vais traiter.

    Ce que j'aimerais c'est passer le nombre de lignes sans préciser le nombre de lignes puisqu'il varie d'un fichier à l'autre mais en précisant que je veux passer la zone d'en-tête. Et aussi je souhaiterais lire la valeur du param1 et d'autres valeurs qui m'intéresse dans l'en-tête.

    voici ce que j'ai commencé à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data=textscan(fid,repmat('%f',1,1),'headerlines',N);
    Le soucis ici c'est que je dois préciser le nombre de lignes à passer et ce n'est pas ce que je cherche.

    J'ai aussi fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fid=fopen(filename,'rt')
    N1=1
    for i=1:N1
    headerline1=fgetl(fid);
    end 
    fclose(fid);
    parametre1=str2num(headerline1(10:end));
    Le soucis avec ce code est que je dois ouvrir et fermer mon fichier pour chaque paramètre cherché... Et aussi préciser la ligne de mon paramètre que je veux lire en en-tête. Ce que je souhaiterais, c'est préciser "param1" et que mon code me retourne la valeur sans que je précise la ligne. où se situe param1.

    Quelqu'un aurait-il une idée à ce sujet ?

    Merci bien.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 901
    Points
    52 901
    Par défaut
    Lis le fichier ligne par ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fid = fopen(filename,'rt');
     
    X = textscan(fid,'%s','delimiter','\n');
     
    fclose(fid);
    Pour compter le nombre de ligne de l'entete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    idx = strncmp(X{1}, '##', 2);
     
    sum(idx)
    Pour récupérer un paramètre en particulier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    idx = strncmp(X{1}, '##parma1', 8);
     
    sscanf(X{1}{idx},'##parma1=%f')
    C'est l'idée. A toi de l'adapter au contenu réel du fichier

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

    Supposant que les valeurs des paramètres sont strictement numériques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fid = fopen(filename, 'rt');
    header = textscan(fid, '##%[^=]=%n');
    % Reste de la lecture
    fclose(fid);
    Tu auras les noms des paramètres dans header{1} et leur valeur dans header{2}

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 901
    Points
    52 901
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header = textscan(fid, '##%[^=]=%n');

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 50
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup, j'ai pu avancer sur la récupération des paramètres dans mes en-tête.

    Mes paramètres ne sont pas uniquement des valeurs numériques mais sont aussi du texte. J'ai donc utiliser la première méthode.

    Maintenant je n'arrive plus à récupérer les données de ma cellule après avoir lu l'en-tête.
    Si je fais X{1} ça me donne toutes les valeurs y compris l'en-tête. Je souhaiterais récupérer mes données une fois l'en-tête passée et X{1}{sum(idx)} ne me donne qu'une ligne.

    Et le problème se complique, puisque je souhaiterais suppimer la première colonne de mes données après l'en-tête. En effet je ne souhaite pas que mon programme lise la première colonne.

    Par ex :
    333 1 3 4
    335 1 5 8
    339 10 3

    Je voudrais que mon programme lise 1 3 4 1 5 8 10 3.

    J'avais commencé à faire quelque chose en mettant des Nan par pas de temps mais le souci c'est que je n'ai pas le même nombre de colonnes par lignes et donc je peux avoir un problème de dimension.

    Merci à vous.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par karine12 Voir le message
    Mes paramètres ne sont pas uniquement des valeurs numériques mais sont aussi du texte.
    Dans ce cas, à modifier en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header = textscan(fid, '##%[^=]=%[^\n]');
    Pour récupérer les valeurs selon le code de Dut, il faut récupérer la sortie de la ligne sscanf.

    Au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    fid = fopen(filename, 'rt');
    header = textscan(fid, '##%[^=]=%[^\n]');
    values = textscan(fid, '%*n %[^\n]', 'CollectOutput', true); % chaines de caractères finales
    values = cellfun(@str2num, values{1}, 'UniformOutput', false); % conversion en valeurs numériques
    fclose(fid);
     
    % Affichage
    [header{1} header{2}]
    cell2mat(values.')
    header{2} ne contiendra plus de valeur numériques, mais des chaines de caractères, ce sera à toi de convertir les bons paramètres en valeurs numériques avec str2double.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 50
    Points : 11
    Points
    11
    Par défaut
    J'ai avancé sur la question et j'ai fait ça :
    data=X{1}
    dataSTR=data(N:end)

    J'obtiens une cellule. Je souhaiterais convertir cette cellule en un tableau numérique. En utilisant la fonction cell2mat ça ne va pas.

    Avez-vous une idée ?

    Une fois que j'obiendrais mon tableau numérique je pourrais enlever la première colonne en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dataNum(:,colonne) = []

    merci.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 50
    Points : 11
    Points
    11
    Par défaut
    J'ai du écrire en même temps le message. Je n'avais pas vu la réponse.
    Merci.

    Il y a un autre petit détail à ajouter..
    Dans mon en-tête 98% du texte est précédé de ## mais dans certains fichier, je m'aperçois que parfois tout le texte d'en-tête n'est pas précédé de ##. Et donc le code ne peut pas récupérer l'intégralité de l'en-tête et s'arrête lorsqu'il ne voit pas les ##.

    Avez-vous une idée à ce sujet ?

    Merci.

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 901
    Points
    52 901
    Par défaut
    Citation Envoyé par karine12 Voir le message
    Dans mon en-tête 98% du texte est précédé de ## mais dans certains fichier, je m'aperçois que parfois tout le texte d'en-tête n'est pas précédé de ##.
    Donne nous un fichier complet de ce type

  10. #10
    Invité
    Invité(e)
    Par défaut
    On a donc quelque chose comme :
    ##param1=2
    param2=42
    ##param3=10
    ?
    Comme ceci :
    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
    fid = fopen('test.txt', 'rt');
    fileContent = fread(fid, [1 Inf], '*char'); % Lecture entière au sein d'une seule chaine de caractères
    fclose(fid);
     
    [tokens matchend]= regexp(fileContent, '([^\n#][^=]+)=([^\n]+)', 'tokens', 'end'); % critère pour les lignes des paramètres 
    isHeader = ~cellfun(@isempty, tokens);
    splitParts = @(token) deal(token{1}, token{2});
    [paramsNames paramsValues] = cellfun(splitParts, tokens(isHeader), 'UniformOutput', false);
     
    values = textscan(fileContent(matchend(end):end), '%*n %[^\n]', 'CollectOutput', true); % chaines de caractères finales
    values = cellfun(@str2num, values{1}, 'UniformOutput', false); % conversion en valeurs numériques
     
    % Affichage
    [paramsNames(:) paramsValues(:)]
    cell2mat(values.')

Discussions similaires

  1. passer des paramètres dans l'URL
    Par bhs2009 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 06/08/2009, 11h39
  2. Passer des paramètres dans $.ajax
    Par Thewil dans le forum jQuery
    Réponses: 4
    Dernier message: 18/06/2009, 09h46
  3. Réponses: 4
    Dernier message: 23/01/2009, 11h12
  4. Passer des paramétres dans une URL
    Par adrix26 dans le forum SharePoint
    Réponses: 3
    Dernier message: 04/06/2008, 16h54
  5. Réponses: 1
    Dernier message: 21/03/2006, 14h29

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