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 :

[textscan] Spécifier position des colonnes


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2012
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 9
    Points : 8
    Points
    8
    Par défaut [textscan] Spécifier position des colonnes
    Bonjour,

    Voici mon problème :
    je dois écrire un algorithme permettant de lire des fichier .pch (qui sortent de Nastran) dans lesquels je lis les données pour les mettre ensuite dans une jolie matrice. Jusqu'ici pas de problème.

    Les colonnes ont une taille bien définie (9 caractères) à des positions également bien définies. Le soucis vient de deux facteurs :

    -les nombre peuvent avoir un - devant, ce qui fait alors 10 caractères
    -la dernière colonne peut toucher le chiffre suivant qui représente le nombre de ligne et donc l'ordinateur ne reconnait plus cela comme deux nombres séparés !!

    exemple de mon problème :
    si je veux lire ces lignes avec textscan
    '1.045E+02     1.548E-05     1.958E-0512345'
    '1.045E+02     1.548E-05    -1.958E-0512346' 
    (le nombre 1.958E-05 est alors collé à 12345!), je peux lire la première ligne en utilisant '%9f %9f %9f %5f' et la seconde en utilisant '%9f %9f %10f %5f', mais en pratique je ne sais jamais si il y aura un signe - ou non !..
    Et si j'utilise %10f pour la première ligne il va alors aussi prendre en compte le 1 de 12345....
    Je suis donc coincé par ce problème depuis deux jours.. Si vous avez des idées ce serait génial !
    Le mieux serait de pouvoir spécifier la position de colonnes et non seulement leur largeur (par exemple : caractère 1 à 10, caractère 10 à 20, caractère 20 à 30, caractère 30 à 35)

    merci beaucoup

    Arcyno

  2. #2
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut,
    si justement la largeur de tes colonnes est constante, tu peux ne pas utiliser textscan :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    fid = fopen('data.dat');
    tline = fgetl(fid);
    while ischar(tline)
        data1 = num2str(tline(1:10));
        data2 = num2str(tline(11:20));
        tline = fgetl(fid);
    end
    fclose(fid);

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 165
    Points
    53 165
    Par défaut
    Si la réponse de FLB n'est pas suffisante, pourrais-tu nous fournir un fichier .pch (de taille réduite) ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  4. #4
    Futur Membre du Club
    Inscrit en
    Août 2012
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Merci de vos réponses !
    En fait j'ai déjà essayé de lire ligne par ligne sans utiliser textscan, mais le problème c'est que dans ce cas l'algorythme est environ 150 fois plus lent !... et comme les fichiers que je dois lire peuvent contenir plusieurs giga de données cela représente une journée de calcul au lieu de 10mn en utilisant textscan... donc non négligeable !
    En effet textscan lit TOUTES les lignes jusqu'a ce que cela ne corresponde plus au format spécifié et les met directement dans une jolie matrice, alors qu'en lisant ligne par ligne je dois tout stocker puis faire une matrice ensuite, ce qui est très gourmant en mémoire. (enfin je pense)

    Le mieux serait donc de pouvoir spécifier la position des colonnes dans textscan, mais je n'ai pas l'impression que cela existe...
    suis-je donc obligé de lire ligne par ligne à cause de ce satané signe - ?

    Je me demande sinon si la fonction regexp serait adaptée...

    Pour répondre à Dut, voici en pièce jointe un extrait de ce que je peut avoir à lire. ("-CONT-" signifie que les valeurs ne sont que la suite de la ligne précédente... ce qui signifie qu'elles doivent apparaitre dans la même ligne de la matrice à l'arrivée !!.. encore une raison d'utiliser textscan)

    merci a vous en tout cas !
    Fichiers attachés Fichiers attachés

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2012
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Si jamais quelqu'un se pose un jour la même question que moi (on sait jamais !), voila finalement la solution que j'ai retenu :

    je fais un textscan en considérant la dernière colonne comme un string %10s, donc le textscan va bien lire toutes les lignes et j'aurai mes données dans une matrice sauf pour la dernière colonne qui sera considérée comme un string.
    Ensuite j'utilise les expressions régulières pour vérifier que si il y a 10 caractères dans le string, c'est qu'il y a un signe - devant, sinon je supprime le dernier caractère du string :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    regexprep( TextScan_resultat{1,4},'([^-].{8})\d','$1');
    ensuite je transforme cette colonne en double, et le tour est joué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cellfun(@str2num,TextScan_resultat{1,4});
    Cette solution est environ 100 fois plus rapide que lire ligne par ligne.

    Merci à ceux qui se sont penchés sur mon problème

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

Discussions similaires

  1. Extraire sous forme de string la position des colonnes d'un JTable
    Par divxdede dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 09/03/2011, 19h45
  2. [Lazarus] Modification position des colonnes dans un DbGrid
    Par ovni76 dans le forum Lazarus
    Réponses: 10
    Dernier message: 15/06/2009, 13h57
  3. Comment sauvegarder la position des colonnes de mon tableau ?
    Par Bruno13 dans le forum Composants VCL
    Réponses: 0
    Dernier message: 04/11/2007, 01h38
  4. position des colonnes du datagriedview qui change
    Par el_pilacho dans le forum VB.NET
    Réponses: 4
    Dernier message: 10/04/2007, 12h23
  5. DBGrid : enregister la position des colonnes
    Par Harry dans le forum Bases de données
    Réponses: 8
    Dernier message: 21/07/2004, 21h27

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