Deux sous-classes de processus discrets permettent d'installer un mécanisme de lecture, enregistrement par enregistrement, d'un fichier de données factuelles. On rappelle seulement ses enregistrements correspondent chacun à un instant quelconque, précisé dans les champs, et qu'ils sont rangés dans le fichier dans l'ordre croissant des instants.
Ce mécanisme nécessite la déclaration préalable d'une classe de FactualDataFile : on ne pourra lire que des fichiers physiques qui auront fait l'objet d'une instantiation de cette classe (fichier logique). Le symbole de la sous-classe en question de FactualDataFile est une propriété des processus (accessible par FileClassId()).
Les deux sous-classes sont les suivantes :
- InitFactualDataReadingProcess pour préparer la répétition du processus ponctuel de lecture d'un enregistrement
- ReadFactualDataRecordProcess pour exécuter cette lecture d'un enregistrement.
Il est d'ores et déjà important de noter que la tâche du modélisateur va se limiter à la gestion de l'initialisation, parce que celle-ci va lancer à son tour, et automatiquement, la série des lectures des enregistrements. L'attitude du modélisateur est donc ici identique à celle adoptée pour le processus (continu) de lecture des fichiers de données séquentielles (voir page dédiée). En conséquence, le modélisateur va spécifier dans le processus d'initialisation le fichier lu et la méthode d'exploitation des champs des enregistrements (méthode PostRead, voir plus loin), puis transfèrera ces spécifications au processus de lecture effective des enregistrements (classe ReadFactualDataRecordProcess).
Ces deux processus sont naturellement dotés d'une méthode d'exécution (mobilisée par la directive EXEC). Elles ont dans DIESE un corps prédéfini, mais surchargeable.
Pour le processus d'initialisation de la lecture, ce corps prédéfini réalise les tâches suivantes :
- instanciation d'un fichier logique FactualDataFile et association au fichier physique ciblé
- ouverture du fichier en lecture et saut des enregistrements d'entête, en nombre renvoyé par la méthode GetNbTopCommentLines()
- instanciation d'un premier processus de lecture (classe ReadFactualDataRecordProcess), et transfert vers lui des spécifications du fichier lu et de la méthode d'exploitation des champs des enregistrements
- programmation pour tout de suite d'un événement exécutant ce processus
Quelques remarques communes aux processus de lecture des fichiers de données factuelles et aux processus de lecture des fichiers de données séquentielles sont faites dans le chapitre dédié à ces derniers (notamment sur la possibilité de surcharger les méthodes d'exécution, et sur la manière de spécifier le fichier que doit lire le processus).
Pour le processus d'exécution de la lecture, le corps prédéfini de la méthode d'exécution appelle la méthode ReadNextEnrgt de la classe FactualDataFile, sur l'instance associée au processus. Puis, le cas échéant, la méthode qui fait l'objet du paragraphe suivant.
Un processus de cette classe est aussi doté d'une méthode d'exploitation des données contenues dans l'enregistrement qui vient d'être lu sur le fichier physique dans le pas courant du processus (et, on le sait, installés dans les "champs" du fichier logique). Cette méthode n'est pas dotée d'un corps prédéfini. Si le développeur veut l'exploiter, il doit obligatoirement définir et écrire la fonction qui deviendra le corps de la méthode (par un appel à SetPostRead). A titre d'exemple, voici un contenu typique de cette fonction :
void myReadFiles_postReadProcesss_Body(ProcessMethod* pM) { ReadFactualDataRecordProcess* pCP = (ReadFactualDataRecordProcess*)pM->DescribedProcess(); BasicEntity* pE = pCP->ProcessedBasicEntity(); FactualDataFile* pF = pCP->GetFile(); float x = pF->GetFloatFieldValue(FIELD_X); // la valeur d'un champ est affectée à un descripteur d'une entité pE->SetFloatVarValue(X, x); ... }Pour la mise en oeuvre d'un processus de cette classe, se reporter à la documentation des processus (continus) de lecture d'un fichier de données séquentielles (voir page dédiée).