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

WinDev Discussion :

Ajouter un "tag" à chaque ligne d'un fichier texte


Sujet :

WinDev

  1. #1
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut Ajouter un "tag" à chaque ligne d'un fichier texte
    Bonjour à tous !!!

    Nouveau problème :

    J'ai fichier TXT avec ce genre de contenu :

    ligne1;info1;info2;info3;<CRLF>
    ligne2;info1;info2;info3;<CRLF>
    ligne3;info1;info2;info3;<CRLF>

    <CRLF> nest pas écrit en toutes lettres. Il est visible dans NotePad++


    Je parcours ce fichier ligne par ligne pour trouver les infos avec la méthode : (exemple vite fait...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    fOuvre(MonFichier)
    MaLigne = fLitLigne(MonFichier)
    TANTQUE MaLigne <> EOT
         MonInfo = ExtraitChaine(MaLigne, MonRang, ";")
         ...
         MaLigne = fLitLigne(MonFichier)     
     
    FIN
    ça marche nickel, je reviens pas la dessus.

    MAIS :

    je souhaite, après avoir traité ma ligne, ajouter un "Tag" en début (ou fin) de ligne pour dire comme quoi la ligne a été traité.
    exemple : OK;ligne1;info1;info2;info3;<CRLF>

    et là je bloque.

    Je me bagare avec fpositionne(), fecrit() ou fecritligne() mais sans trouver de résultat
    En plus le CRLF semble me pourrir la vie...
    dommage que la fonction finsere() n'existe pas !


    Vous avez une solutoin simple pour faire ça ?

    J'ai vu qu'avec la fonction fchargebuffer(), on pouvait faire pas mal de chose, mais je n'arrive pas à l'appliquer dans mon cas...
    vu que je traite ligne par ligne...

    Merci pour votre aide !!!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Pour moi il ne faut pas tenter de lire et d'écrire dans le fichier simultanément.
    Voici ce que je ferai:
    1. Charger le fichier avec fChargeTexte
    2. Parcours du fichier avec un POUR TOUT
    3. A chaque boucle, traitement de la ligne et ajout de celle-ci à une chaine (avec ou sans tag)
    4. En sortie de boucle, un fSauveTexte pour enregistrer le résultat (la chaine du point 3)

    Le <CRLF> est en fait un "retour chariot", donc un RC (ou CRLF, trou de mémoire) en WinDev, à utiliser dans le POUR TOUT pour faire une itération par ligne.

    Tatayo

  3. #3
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut
    ha ...

    ok mais si pendant le traitement, d’autres lignes sont ajoutées dans le fichier,
    lors du fsauve(), ces dernières lignes seront perdues ?

  4. #4
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Raconte nous l'histoire de ton fichier. On n'a qu'une partie de sa vie là.
    Au fur et à mesure, tu nous donnes les infos au compte goutte
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  5. #5
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut
    oui très juste...

    c’est un fichier journalier qui est alimenté par un automate.
    Il reçoit en continu (toutes les 15 s en moyenne) une ligne complète contenant des infos séparée par un ; et finissant par ;CRLF.

    moi je souhaite tous les 1/4 d’heure prendre ces infos pour les ajouter en base.

    Mais du coup j’aimerai mettre un tag quelque part dans la ligne pour dire que cette ligne a déjà été mise en base.

    sinon l’autre solution à laquelle je pense c’est de tester avec différents champs la présence en base de cette ligne. Mais cela risque de ralentir le process... C’est pour cela que je pensait taguer la ligne directement à la source...

  6. #6
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    As tu pensé à la fonction HImporteTexte avec l'option himpCréation?
    1-Ce sera certainement plus rapide qu'une lecture séquentielle d'un fichier texte
    2-Tu n'as plus à te soucier de savoir si les données sont dans ta base de données, dans le mesure les données seront automatiquement insérées.

    En fin de journée, il suffit de récupérer les données ainsi collectées dans ta table principale en y ajoutant la date
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 174
    Points : 287
    Points
    287
    Par défaut
    Bonjour;
    on va dire que l'automate enregistre une ligne chaque 15s, donc dans 1/4 d'heure on va se trouver avec un fichier de 60 lignes;
    on intervient pour traiter ces 60 lignes;
    après un autre 1/4 d'heures on va se trouver avec un fichier de 120 lignes;
    on commence le traitement depuis la ligne n° 61
    et ainsi de suite ...

    ce qui implique, qu'on est pas obligé de taguer le fichier source, il suffit d'enregistrer le nombre de lignes traités, et commencer le traitement à partir de la ligne suivante.

    Bon Dev.

  8. #8
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    L'idée est bonne, toutefois
    Citation Envoyé par fouedusa Voir le message
    on va se trouver avec un fichier de 60 lignes;
    On parle d'une moyenne, donc il se peut qu'il y ait 58 ou 62 lignes écrites.
    Citation Envoyé par fouedusa Voir le message
    on commence le traitement depuis la ligne n° 61
    A ma connaissance on ne peut pas directement se positionner sur une ligne donnée.

    En reprenant ton idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Lire séquentiellement le fichier jusqu'à la dernière ligne lue précédemment
    Lire séquentiellement le fichier jusqu'à la fin et enregistrer les données
    Mémoriser la dernière ligne lue
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  9. #9
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 174
    Points : 287
    Points
    287
    Par défaut
    @Voroltinquo

    Exactement ce que j'ai voulu dire

    Bon Dev.

  10. #10
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Option 1 : celle proposée par Fouedusa : mémoriser le nombre de lignes lues/traitées. Ou plus précisément, écrire dans un fichier annexe le nombre de lignes traitées.
    Option 2 : quand tu commences ton traitement, tu renommes ton fichier ; du coup la remise à 0 du fichier n'est plus quotidienne, mais tous les quarts d'heure. A toi de voire si le reste de ton process est compatible avec ça.
    Je ne vois pas d'option 3.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  11. #11
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut
    peut être option 3, qui ressemble à l’option 1 que je viens d’essayer...

    je range en base les infos lues.
    j’ai créé une clé composé sur 4 rubriques (date+heure+...+... (taille max de la clé : 19 caractères)).
    ces rubriques sont assez spécifiques pour me permettre d’être sûr de ne pas louper d’enregistrements.

    à chaque relecture du fichier txt, je vérifie si ce que je veux ajouter n’existe pas déjà.

    c’est un peu simpliste mais semble bien fonctionner...

    qu’en pensez vous ?

  12. #12
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 174
    Points : 287
    Points
    287
    Par défaut
    Re Bonjour;

    oui, l'option 3 peut être une solution, mais tu as regrouper les deux soucis de l'informaticien
    perte de l'espace mémoire et du temps

    espace mémoire
    19 caractères ajoutés à chaque enregistrement

    temps
    les testes d’existence de l'enregistrement à chaque lecture

    Bon dev.

  13. #13
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut
    je vais garder l’option 3 qui semble toujours ok...

    tout en gardant à l’esprit ce côté temps/espace mémoire...

    merci pour vos idées !!

  14. #14
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    L'option 3 me semble tout à fait valable.
    En terme d'espace disque, la lé composée que tu as ajoutée est probablement indispensable. Tu l'aurais créée de toutes façons. Maintenant, en temps de traitement, en fin de journée, tu vas lire et analyser 4000 ou 5000 lignes pour en traiter environ 60. Si tu veux t'amuser à améliorer la performance, tu peux traiter les lignes à partir de la dernière. Tant que la ligne lue est nouvelle, tu la traites, et dès que tu as une ligne déjà traitée, tu peux t'arrêter. Ainsi, le test pour savoir si une ligne est utile ou non, tu le lances environ 60 fois au lieu de 5000.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  15. #15
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut
    lire en partant de la fin, pas bête ça !!!

    mais la fonction flitligne ne permet pas faire un parcours inversé...

    il faudrait passer par un fchargetexte alors ?

  16. #16
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Oui, fchargetexte() : environ 5000 lignes, d'une trentaine de caractères chacune, ça passe sans problème.

    Puis une série d'extraitchaine() en partant de la fin.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  17. #17
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut
    yes ! j’ai,compris !
    je compte le nombre rang et je décrémente un compteur

    merci pour l’idée !

  18. #18
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Ou extraitChaine avec le paramètre DepuisFin. Pas besoin de compter le nombre d'enregistrements. Il faut lire la doc
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  19. #19
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut
    j’lavais pas vu celle-là

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

Discussions similaires

  1. [Débutant] Coincée : Comment ajouter des retours à la ligne dans un fichier texte ?
    Par Alphacom dans le forum Windows Forms
    Réponses: 9
    Dernier message: 26/04/2013, 10h55
  2. Réponses: 5
    Dernier message: 28/10/2011, 12h17
  3. Lire les paramètres de chaque ligne d'un fichier text
    Par kooll77 dans le forum Fortran
    Réponses: 1
    Dernier message: 19/01/2011, 13h29
  4. Ajouter mot devant une ligne d'un fichier texte
    Par AZzjeioafh dans le forum VBScript
    Réponses: 0
    Dernier message: 18/09/2009, 20h39
  5. [BATCH] lire chaque ligne d'un fichier texte
    Par bartmarley dans le forum Windows
    Réponses: 13
    Dernier message: 22/04/2005, 21h01

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