menu
  Home  ==>  articles  ==>  colibri_utilities  ==>  file_byte_frequency   

Fréquence des octets de fichiers(s) Article - John COLIBRI.

  • résumé : un utilitaire permettant d'afficher la fréquence de chaque octet d'un ou plusieurs fichiers. Utile pour détecter l'absence d'interligne ou les caractères indésirables
  • mots clé : calcul de fréquence - analyse de caractères - interligne - caractères de contrôle - détection unicode
  • logiciel utilisé : Windows XP personnel, Delphi 6.0
  • matériel utilisé : Pentium 2.800 Mhz, 512 Meg de mémoire, 250 Giga disque dur
  • champ d'application : Delphi 1 à 5, Delphi 6, Delphi 7, Delphi 2006, Turbo Delphi, Delphi 2007, Delphi 2009 sur Windows
  • niveau : développeur Delphi
  • plan :


1 - Calcul de Fréquence

Ce petit utilitaire calcule et affiche la fréquence de chaque octet dans un ou plusieurs fichiers.

Il permet de rapidement vérifier

  • que le nombre de retour à la ligne et interligne (#13 et #10) est identique (dans le cas contraire la position d'une erreur du compilateur en Delphi 6 peut être décalée)
  • que le nombre de parenthèses ou crochets ouvrant et fermants est la même
  • quels sont les caractères indésirables figurant dans le texte (tabulation, caractères non attendus, tel que caractères inférieurs à 32 ou supérieurs à 127).
  • que le fichier est bien en ASCII 8 bits (une fréquence anormale de caractères #0 ou non habituels le signalerait). Cet utilitaire pourrait donc se révéler utile en ces temps d'Unicode ou autre UCS2, UCS4 et UTF8 !)

    Nous avons pu tester son utilité dans les cas suivants

    • nous avions copié / collé des définition de procédures d'une spécifiction envoyée par un client, et la partie collée ne comportait pas d'interligne après entrée. Le même problème a été rencontré fréquemment pour les sources Pascal venant de Kylix (Linux n'utilise pas d'interligne)
    • certains sources trouvés sur Internet comportent souvent des tabulations (#9) ou d'autres caractères inusuels (#26 pour terminer les anciens fichiers DOS)
    • un client avait copié des lignes générées ou tapées dans un tRichEdit et les avait collées dans l'Editeur Pascal. Dans ce cas, ce qui a été placé dans le presse papier dépend du controle Microsoft (de mémoire du .RTF), mais ce qui a été collé dans l'éditeur Delphi dépend de cet éditeur, qui apparemment interprète mal ce texte
    Dans tous ces cas, un profilage rapide des fréquences permet instantannément de détecter le problème.
  • nous avons surtout utilisé cet outil pour analyser les fichiers .PAS, mais comme il calcule la fréquence des octets, il pourrait être utilisé pour tout autre tâche de profilage.
Dans tous ces cas, seul d'utilisateur de l'utilitaire sait comment interpréter (ce qui est attendu ou non) le résultat des fréquences




2 - Projet de Calcul de Fréquences

Le projet est des plus simples
  • un tableau contenant 255 fréquence (entiers) est initialisé
  • les fichiers sont chargés dans un tableau d'octets
  • un simple boucle ajoute la fréquence de chaque caractère au tableau
  • le résultat (pour les fréquences non nulles est affiché)
Le calcul des fréquences est:

Procedure compute_frequency_call_back(p_pathp_file_nameString);
  Var l_indexInteger;
  Begin
    With c_byte_buffer.create_byte_buffer('', 10) Do
    Begin
      load_from_file(p_pathp_file_name);

      // -- compute the frequencies
      For l_index:= 0 To m_write_index- 1 Do
        Inc(g_byte_frequency[m_oa_byte_buffer[l_index]]);

      Free;
    End// with c_byte_buffer
  End// compute_frequency_call_back

et l'affichage se fait par

Procedure TForm1.display_frequencies_Click(SenderTObject);
  Var l_indexInteger;
      l_characterChar;
  Begin
    // -- display only the > 0 values
    display(Format('frequencies of %-5s files, file_count=%3d in ',
        [FileListBox1.Maskg_file_count]) + g_path);
    For l_index:= 0 To 255 Do
      If g_byte_frequency[l_index]> 0
        Then Begin
            If l_index In [0..32]
              Then l_character:= ' '
              Else l_character:= chr(l_index);
            display(Format('%3d %1s %7d',
                [l_indexl_characterg_byte_frequency[l_index]]));
          End;
  End// display_frequencies_Click




3 - Mini Mode d'emploi

Voici une image du projet en pleine action:

file_byte_frequency



Pour utiliser le projet
   sélectionnez le répertoire
   sélectionnez les fichiers dont la fréquence sera calculée par l'un des trois moyens suivants:
  • en cliquant un fichier de la tFileListBox
  • en sélectionnant "all_dir_" pour tous les fichiers d'un répertoire
  • en sélectionnant "dir_recursive_" pour tous les fichiers d'un répertoire récursivement
   les fréquences sont calculées
   sélectionnez "display_frequencies_" pour voir le résultat
Par ailleurs

  • par défaut le masque est "*.pas". Vous pouvez le changer dans l'Inspecteur d'Object (tFileListBox.Mask)
  • "mute_" évite l'affichage de chaque fichier analysé
  • "reset_byte_frequency_" remet les fréquences à zéro
  • "check_return_linefeed_" détecte les retours (#13) non suive d'interligne (#10)

  • "h_" permet d'utiliser un mémo pour une aide modifiable
  • le premier fichier contient des "favoris" (l'équivalent d'un tFilterComboBox, mais non drop-down)



4 - Commentaires et Améliorations

Parmi les possibilités
  • utiliser un tFileStream au lieu d'un Array of Byte
  • ajouter des options pour signaler des plages de caractères à signaler (ou la plage des caractères acceptables)



5 - Télécharger le code source Delphi

Vous pouvez télécharger: Ce .ZIP qui comprend:
  • le .DPR, la forme principale, les formes annexes eventuelles
  • les fichiers de paramètres (le schéma et le batch de création)
  • dans chaque .ZIP, toutes les librairies nécessaires à chaque projet (chaque .ZIP est autonome)
Ces .ZIP, pour les projets en Delphi 6, contiennent des chemins RELATIFS. Par conséquent:
  • créez un répertoire n'importe où sur votre machine
  • placez le .ZIP dans ce répertoire
  • dézippez et les sous-répertoires nécessaires seront créés
  • compilez et exécutez
Ces .ZIP ne modifient pas votre PC (pas de changement de la Base de Registre, de DLL ou autre). Pour supprimer le projet, effacez le répertoire.

La notation utilisée est la notation alsacienne qui consiste à préfixer les identificateurs par la zone de compilation: K_onstant, T_ype, G_lobal, L_ocal, P_arametre, F_unction, C_lasse. Elle est présentée plus en détail dans l'article La Notation Alsacienne



Comme d'habitude:

  • nous vous remercions de nous signaler toute erreur, inexactitude ou problème de téléchargement en envoyant un e-mail à jcolibri@jcolibri.com. Les corrections qui en résulteront pourront aider les prochains lecteurs
  • tous vos commentaires, remarques, questions, critiques, suggestion d'article, ou mentions d'autres sources sur le même sujet seront de même les bienvenus à jcolibri@jcolibri.com.
  • plus simplement, vous pouvez taper (anonymement ou en fournissant votre e-mail pour une réponse) vos commentaires ci-dessus et nous les envoyer en cliquant "envoyer" :
    Nom :
    E-mail :
    Commentaires * :
     

  • et si vous avez apprécié cet article, faites connaître notre site, ajoutez un lien dans vos listes de liens ou citez-nous dans vos blogs ou réponses sur les messageries. C'est très simple: plus nous aurons de visiteurs et de références Google, plus nous écrirons d'articles.



6 - L'auteur

John COLIBRI est passionné par le développement Delphi et les applications de Bases de Données. Il a écrit de nombreux livres et articles, et partage son temps entre le développement de projets (nouveaux projets, maintenance, audit, migration BDE, migration Xe_n, refactoring) pour ses clients, le conseil (composants, architecture, test) et la formation. Son site contient des articles avec code source, ainsi que le programme et le calendrier des stages de formation Delphi, base de données, programmation objet, Services Web, Tcp/Ip et UML qu'il anime personellement tous les mois, à Paris, en province ou sur site client.
Created: jan-04. Last updated: mar-2020 - 250 articles, 620 .ZIP sources, 3303 figures
Contact : John COLIBRI - Tel: 01.42.83.69.36 / 06.87.88.23.91 - email:jcolibri@jcolibri.com
Copyright © J.Colibri   http://www.jcolibri.com - 2001 - 2020
Retour:  Home  Articles  Formations  Développement Delphi  Livres  Pascalissime  Liens  Download
l'Institut Pascal

John COLIBRI

+ Home
  + articles_avec_sources
    + bases_de_donnees
    + web_internet_sockets
    + services_web_
    + prog_objet_composants
    + office_com_automation
    + colibri_utilities
      – difference_textuelle
      – iso_cd_extractor
      – find_uses
      – interprete_expression
      – file_byte_frequency
    + uml_design_patterns
    + graphique
    + delphi
    + outils
    + firemonkey
    + vcl_rtl
    + colibri_helpers
    + colibri_skelettons
    + admin
  + formations
  + developpement_delphi
  + présentations
  + pascalissime
  + livres
  + entre_nous
  – télécharger

contacts
plan_du_site
– chercher :

RSS feed  
Blog