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 rapide d'un fichier texte contenant de l'hexa


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Lecture rapide d'un fichier texte contenant de l'hexa
    Bonjour à tous,

    je cherche à importer des données hexa contenues dans un fichier texte (taille jusqu'à 50Mo). La longueur de chaque ligne est variable.
    Par exemple:
    166 30 A5 BB 72 00 5A CD A2 91 6C 57 28 06 8A 89 00 61 6A D0 00 00 4E 0B C2
    458 30 A5 BB 73 00 5A CE CA 91 6E 58 38 00 56 8A 00 61 6A E0 00 00 4E 0C E4
    778 30 A5 BB 74 00 5A D0 0A 91 2A 65 70 0D AD B1 2B 5F 88 15 FE 00 00 00 00 6A CC 61 7C 0D 60 8B 00 61 6A F0 00 00 4E 0E 1A
    Je souhaite obtenir un Cell contenant un array au format Int pour chaque ligne du fichier:

    64 48 0 178 223 5 38 91 150 178 80 20 40 54 136 64 0 0 0 0 0 100 230 97 134 14 64 130 0 21 140 48 0 0 60 7 73

    1624 48 0 178 224 0 0 2 27 146 3 24 48 88 191 64 0 131 0 21 140 64 0 0 60 9 183

    4888 48 0 178 225 0 0 4 108 146 9 32 120 14 112 64 0 146 73 35 200 16 47 64 0 178 107 37 128 36 47 64 0 0 0 0 0 98 0 96 213 14 64 146 131 38 200 4 15 64 0 132 0 21 140 80 0 0 60 12 36
    J'arrive à obtenir ça en faisant par exemple ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    A=textscan(fileID,'%s','delimiter','\n');
    fclose(fileID);
    A=A{1,1};
     
    for i=1:size(A,1)
        A{i}=cellfun(@hex2dec,strsplit(A{i}));
    end
    Cependant, strsplit et hex2dec sont très gourmandes en temps... donc pour des fichiers de 100000 lignes, c'est inconcevable...

    J'ai testé une autre méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    max_num_col = 100;
    format = repmat('%2x',1,max_num_col);
    format=['%8f',format];
     
    %%
    line=0;
    %Lecture de la première ligne du fichier
    tline = fgetl(fileID);
    %Tant qu'on est pas à la fin du fichier
    while ischar(tline)
        %Lecture de la ligne au format adéquat
        trame=sscanf(tline,format)';
    end
    Celle-ci est suffisamment rapide mais j'ai un problème très bizarre sur certaines lignes (toujours les mêmes).

    Par exemple celle-ci:
    18939 30 00 B2 FD 00 00 48 C3 77 10 15 8E 40 C0 00 3C 00 00 48 94 00 00 A0 29 02 20 61 2B 00 00 00 00 00 00 00 00 61 7C 0E 40 B2 30 02 78 54 7F 40 00 00 00 00 00 45 CB 00 00 0E 40 B3 3E 03 30 48 77 40 00 00 00 00 00 45 DC 61 72 0E 40 91 48 03 B8 0C A0 40 00 B2 72 05 E8 4D 8F 40 00 00 00 00 00 44 E7 61 7C 0E 40 A0 84 06 D0 4D 8E 00 00 00 00 00 00 24 E7 21 7C 0E 40 92 7D 06 78 10 D7 40 00 80 00 15 8E 10 00 00 3C 02 6E
    Quand elle est décodée avec "sscanf", il y a un "zéro" qui se rajoute au niveau de ce qui est en rouge:
    CE QUI EST DANS tline:
    18939 30 00 B2 FD 00 00 48 C3 77 10 15 8E 40 C0 00 3C 00 00 48 94 00 00 A0 29 02 20 61 2B 00 00 00 00 00 00 00 00 61 7C 0E 40 B2 30 02 78 54 7F 40 00 00 00 00 00 45 CB 00 00 0E 40 B3 3E 03 30 48 77 40 00 00 00 00 00 45 DC 61 72 0E 40 91 48 03 B8 0C A0 40 00 B2 72 05 E8 4D 8F 40 00 00 00 00 00 44 E7 61 7C 0E 40 A0 84 06 D0 4D 8E 00 00 00 00 00 00 24 E7 21 7C 0E 40 92 7D 06 78 10 D7 40 00 80 00 15 8E 10 00 00 3C 02 6E
    CE QUI EST DECODE PAR sscanf:
    ..... 97 124 14 0 64 .....
    Si quelqu'un a une idée sur une autre méthode (voire plus rapide que la seconde...), merci d'avance!

    Et si quelqu'un comprend ce bug avec sscanf, je suis preneur aussi.
    Merci d'avance!

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Pour le problème avec sscanf, c'est max_num_col qui n'était pas assez grand (ligne trop grande).

Discussions similaires

  1. [TP] Lecture d'un fichier texte contenant des coordonnées
    Par ichiwa dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 04/02/2007, 15h07
  2. Charger un fichier texte contenant des caractères
    Par dm_manu dans le forum MATLAB
    Réponses: 5
    Dernier message: 24/12/2006, 02h37
  3. Réponses: 3
    Dernier message: 22/06/2006, 17h34
  4. [VB.NET]Problème de lecture et écriture sur fichier texte
    Par zouhib dans le forum Windows Forms
    Réponses: 25
    Dernier message: 23/05/2006, 15h30
  5. [RegEx] Lecture/transformation de mon fichier texte
    Par charlysquare dans le forum Langage
    Réponses: 4
    Dernier message: 24/04/2006, 14h24

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