1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.
  2. Bonjour tout le monde ! Veillez consulter la Politique de forum pour comprendre nos règles, Merci a vous !
    Rejeter la notice

algorithmes pour lire fichiers texte sans séparateurs - windev

Discussion dans 'Windev' créé par JML, Avr 1, 2018.

  1. JML

    JML New Member

    Inscrit:
    Mar 17, 2018
    Messages:
    11
    J'aime reçus:
    3
    Bonjour ,

    Je cherche des algorithmes pour lire des fichiers textes sans séparateurs et extraire les données.
    Je cherche notamment une fonction windev qui permettrait de parcourir le fichier comme un "curseur" qui agirait de concert avec la fonction flit.


    voici un exemple avec un extrait d'un fichier plan comptable :
    "1 - Comptes de capitaux 10 - Capital et réserves 101 – Capital 1011 - Capital souscrit - non appelé"

    le résultat attendu est :
    "1 - Comptes de capitaux"
    "10 - Capital et réserves"
    "101 - Capital"
    "1011 - Capital souscrit - non appelé"

    A noter : ce n'est qu'un résultat intermédiaire , l'objectif étant de séparer le numéro de comptes et le libellé pour l'inclure dans un fichier HFSQL : cette partie est simple grâce à la fonction extraitchaîne.

    si vous avez des pistes, vos commentaires sont les bienvenus !
    Je vous remercie
    JML

    ps : je debute avec windev et je suis en pleine reconversion professionnel apprenant à développer sous windev et webdev.
     
  2. popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,882
    J'aime reçus:
    1,532
    attention selon l'os tu peut avoir des retour chariot différents
    de plus il y a toujours des séparateur dans un fichier texte
    c'est un espace par exemple
    a toi d'analyser le fichier
     
    JML apprécie ceci.
  3. JML

    JML New Member

    Inscrit:
    Mar 17, 2018
    Messages:
    11
    J'aime reçus:
    3
    Merci Popoy de la confirmation des séparateurs.
    Si je comprends bien, la méthode consiste à "découper" les chaines du fichier en choisissant les séparateurs adéquats, inclure les chaines découpées dans un tableau.
    Ensuite plusieurs solutions : intégrer les éléments du tableau dans un fichier, un champ table etc....
     
  4. AbouZizou

    AbouZizou Active Member
    MEMBRE WX WXG 21

    Inscrit:
    Fev 28, 2018
    Messages:
    170
    J'aime reçus:
    106
    Salut, l'exemple que tu as donné contient des séparateurs
    "1 - Comptes de capitaux 10 - Capital et réserves 101 – Capital 1011 - Capital souscrit - non appelé"
    le "-", un fichier texte sans séparateurs implique que les champs sont coller avec une longueur propre à chaque champs donc ayant une structure (pour les champs numérique on utilise des zéros non significatif "0001" pour les champs texte des espaces en fin du champs)
    J'ai déjà développé des applications qui importe à partir d'un fichier texte pour les deux cas (lecture machine de pointage, et aussi lecture de machine de billetterie automatique).
    Alors c'est quoi le type de fichier texte que tu veux importer et je peux t'aider
     
    JML et joker aiment ça.
  5. JHDSoft

    JHDSoft Member

    Inscrit:
    Mar 4, 2018
    Messages:
    41
    J'aime reçus:
    25
    Tu peut partager un .txt pour l analysee c mieux je crois non !!!
     
  6. JML

    JML New Member

    Inscrit:
    Mar 17, 2018
    Messages:
    11
    J'aime reçus:
    3
    Bonjour,
    Je vous remercie de vos commentaires. Voici le fichier texte en pièce jointe.
    Bonne journée,
    JML
     

    Fichiers attachés:

    • PCG.txt
      Taille de fichier:
      39.6 KB
      Affichages:
      61
  7. popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,882
    J'aime reçus:
    1,532

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    pour information il existe des exemple WD de comptabilité avec journaux bilan etc iil y a peu être une table déjà rempli avec tous les numéro de compte
     
    JML apprécie ceci.
  8. JML

    JML New Member

    Inscrit:
    Mar 17, 2018
    Messages:
    11
    J'aime reçus:
    3
    Merci Popoy, grâce aux infos de toutes les réponses , j'ai pu obtenir ce que je voulais. Je profitais de mon problème pour avoir des avis sur les méthodes utilisées pour extraire les données des fichiers textes. Merci à tous ! JML
     
  9. JHDSoft

    JHDSoft Member

    Inscrit:
    Mar 4, 2018
    Messages:
    41
    J'aime reçus:
    25
    salam tlm
    JML
    Code (Text):
    Vartext est une chaîne =fChargeTexte("PCG.txt")
    Text,PhraD,PhraF est chaîne=""
    POUR TOUTE CHAÎNE li DE Vartext SEPAREE PAR RC
        Text="" ; PhraF="" ; PhraD=""
        POUR TOUTE CHAÎNE mo DE li SEPAREE PAR ". "
            SI Val(ExtraitChaîne(mo,1," "))>0 ALORS
                Text=mo
            SINON
                PhraF=ExtraitChaîne(mo,1," ",DepuisFin)
                SI Val(PhraF)>0 ALORS
                    Text=Text+PhraD+" "+ChaîneSupprime(mo,PhraF)
                    PhraD=PhraF
                SINON
                    Text=Text+PhraD+" "+mo
                FIN
                 Trace(Text)
                Text=""
            FIN
        FIN
        Multitâche()
    FIN
     
     
    JML, suenodesign et joker aiment ça.
  10. joker

    joker New Member
    MEMBRE WX

    Inscrit:
    Jan 30, 2018
    Messages:
    0
    J'aime reçus:
    13

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    salam tlm
    JML
    Code (Text):
    Vartext est une chaîne =fChargeTexte("PCG.txt")
    Text,PhraD,PhraF est chaîne=""
    POUR TOUTE CHAÎNE li DE Vartext SEPAREE PAR RC
        Text="" ; PhraF="" ; PhraD=""
        POUR TOUTE CHAÎNE mo DE li SEPAREE PAR ". "
            SI Val(ExtraitChaîne(mo,1," "))>0 ALORS
                Text=mo
            SINON
                PhraF=ExtraitChaîne(mo,1," ",DepuisFin)
                SI Val(PhraF)>0 ALORS
                    Text=Text+PhraD+" "+ChaîneSupprime(mo,PhraF)
                    PhraD=PhraF
                SINON
                    Text=Text+PhraD+" "+mo
                FIN
                 Trace(Text)
                Text=""
            FIN
        FIN
        Multitâche()
    FIN
     
    Cliquez pour agrandir...
    !YES!
    Une trace extrait du résultat de ton code :

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

     
    Kill3rbko apprécie ceci.
  • FreudWD

    FreudWD Well-Known Member
    MEMBRE WX WXG 21

    Inscrit:
    Jan 22, 2018
    Messages:
    199
    J'aime reçus:
    368
    L'idée du point et de l'espace est bonne, mais Je viens de vérifier, il y a beaucoup de bug,
    par exemple les comptes 4246, 4452, 6017 ont un point et un espace dans le libellé, mais je ne sont pas des comptes.

    Source :

    4246. Réserve spéciale (art. L. 442-2 du code du travail) 4248. Comptes courants
    4452. T.V.A. due intracommunautaire 4455. Taxes sur le chiffre d'affaires à décaisser 44551. T.V.A. à décaisser
    6017. Fournitures A, B, C, ... 6063. Fournitures d'entretien et de petit équipement 6064. Fournitures administratives 6068. Autres matières et fournitures

    Résultat :

    4246 Réserve spéciale (art
    L
    442-2 du code du travail) 4248 Comptes courants

    4452 T.V.A
    due intracommunautaire
    4455 Taxes sur le chiffre d'affaires à décaisser
    44551 T.V.A
    44551 à décaisser
    44558 Taxes assimilées à la T.V.A
    445644558 Taxes sur le chiffre d'affaires déductibles
    44562 T.V.A
    44562 sur immobilisations
    44563 T.V.A
    44563 transférée par d'autres entreprises
    44566 T.V.A
    44566 sur autres biens et services
    44567 Crédit de T.V.A
    44567 à reporter

    6017 Fournitures A, B, C, ..
    60636017 Fournitures d'entretien et de petit équipement
    6064 Fournitures administratives

    Et il faut garder que les comptes, pas les entêtes de groupe.
    Code (Text):
    nNb, nPos, nDepart, nSuivant sont des entiers
    sText est une chaîne = fChargeTexte("PCG.txt")

    POUR TOUTE CHAÎNE sLigne DE sText SEPAREE PAR RC
        nNb = ChaîneOccurrence(sLigne, ". ")
        SI nNb = 1 ALORS
            Trace(sLigne)
        SINON
            nDepart = 1 // Début du compte
            nSuivant = 7 // Fin du compte
            POUR nOcc = 2 _À_ nNb + 1
                nPos = Position(sLigne, ". ", nSuivant)
                SI nPos > 0 ALORS
                    SI EstNumérique(sLigne[[nPos - 1]]) ALORS // Vérifie si c'est un code
                        nSuivant = nPos - 2
                        TANTQUE EstNumérique(sLigne[[nSuivant]]) // Remonte jusqu'au debut du code
                            nSuivant--
                        FIN
                        Trace(sLigne[[nDepart À nSuivant]])
                        nDepart = nSuivant + 1
                    FIN
                    nSuivant = nPos + 1
                SINON
                    Trace(sLigne[[nDepart À]]) // Le dernier
                FIN
            FIN
        FIN
    FIN
    Résultat, pas de classe :

    4246. Réserve spéciale (art. L. 442-2 du code du travail)
    4248. Comptes courants

    44551. T.V.A. à décaisser
    44558. Taxes assimilées à la T.V.A.
    4456. Taxes sur le chiffre d'affaires déductibles
    44562. T.V.A. sur immobilisations
    44563. T.V.A. transférée par d'autres entreprises
    44566. T.V.A. sur autres biens et services
    44567. Crédit de T.V.A. à reporter
    44568. Taxes assimilées à la T.V.A.
    4457. Taxes sur le chiffre d'affaires collectées par l'entreprise
    44571. T.V.A. collectée
    44578. Taxes assimilées à la T.V.A.

    6017. Fournitures A, B, C, ...
    6063. Fournitures d'entretien et de petit équipement
    6064. Fournitures administratives
    6068. Autres matières et fournitures

    Et moi, j'ai aussi un bug sur :
    471 à 475. Comptes d'attente 476. Différence de conversion - Actif

    Résultat, pas de libellé et pas de compte 476 :
    471 à
    475. Comptes d'attente
    4761. Diminution des créances
     
    #11 FreudWD, Avr 4, 2018
    Dernière édition: Avr 4, 2018
    Kill3rbko, JHDSoft et JML aiment ça.
  • JML

    JML New Member

    Inscrit:
    Mar 17, 2018
    Messages:
    11
    J'aime reçus:
    3
    Bonjour, je vous remercie de vos codes et explications : je vais les étudier pour comprendre leur structure et pour voir les adapter à d'autres problématiques d'intégrations de fichiers.
    bonne journée
    JML
     
    joker apprécie ceci.
  • JHDSoft

    JHDSoft Member

    Inscrit:
    Mar 4, 2018
    Messages:
    41
    J'aime reçus:
    25
    bonjour tlm
    j’espère qu il y a pas de bug mtn
    je vérifier juste qlq bug que FreudWD a remarquer


    Code (Text):



    Vartext est une chaîne =fChargeTexte("PCG.txt")
    Vartext=Remplace(Vartext,"10131 ","10131. ")
    POUR i=0 A 9
       Vartext=Remplace(Vartext,i+".",i+" JHDSoft ") // :|
    FIN
    Text,PhraD,PhraF est chaîne=""
    POUR TOUTE CHAÎNE li DE Vartext SEPAREE PAR RC
       Text="" ; PhraF="" ; PhraD=""
       POUR TOUTE CHAÎNE mo DE li SEPAREE PAR " JHDSoft " // :P
           SI Val(ExtraitChaîne(mo,1," "))>0 ALORS
               Text=mo
           SINON
               PhraF=ExtraitChaîne(mo,1," ",DepuisFin)
               SI Val(PhraF)>0 ALORS Text+=PhraD+" ===> "+ChaîneSupprime(mo,PhraF) ; PhraD=PhraF SINON Text+=PhraD+" ===> "+mo
               SI Val(ExtraitChaîne(Text,1," ")) > 0 ALORS   Trace(Text)
               Text=""
           FIN
       FIN
       Multitâche()
    FIN

     
     
    #13 JHDSoft, Avr 4, 2018
    Dernière édition: Avr 4, 2018
    Kill3rbko apprécie ceci.
  • FreudWD

    FreudWD Well-Known Member
    MEMBRE WX WXG 21

    Inscrit:
    Jan 22, 2018
    Messages:
    199
    J'aime reçus:
    368
    @

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    On commence à frôler la perfection, mais j'ai encore des remarques sur les comptes 60, 8092 et 4438 (aussi 3452, 3312, 3352, 3412, 3451, 8092) :


    Source :
    CLASSE 6 : COMPTES DE CHARGES
    60. Achats (sauf 60:relievedface:
    601. Achats stockés - Matières premières (et fournitures)
    ...
    4438. Intérêts courus sur créances figurant au compte 4431
    ...
    8091. Contrepartie 801 8092. Contrepartie 802
    88. Résultat en instance d'affectation 89. Bilan

    Résultat, il manque 603 sur l'une, 4431 et 802 sur les autres :
    60 ===> Achats (sauf
    601 ===> Achats stockés - Matières premières (et fournitures)
    ...
    4438 ===> Intérêts courus sur créances figurant au compte
    449 ===> Quotas d'émission à restituer à l'Etat
    ...
    8091 ===> Contrepartie 801
    8092 ===> Contrepartie
    88 ===> Résultat en instance d'affectation

    et sur 515, il manque les doubles cotes.

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    Pour corriger mon bug, j'ai pensé que 7 suffisait pour le trouver le second, mais non.

    Il faut donc remplacer la ligne :
    nSuivant = 7 // Fin du compte

    Par ceci, qui recherche la première occurrence :
    nSuivant = Position(sLigne, ". ") + 1 // Fin du compte

    Et si tu veux voir le résultat dans une table, il faut remplacer les 3 traces par ceci :
    TableAjouteLigne(TABLE_SansNom1, Gauche(sLigne, Position(sLigne, ". ") - 1), SansEspace(Milieu(sLigne, Position(sLigne, ". ") + 1)))
    TableAjouteLigne(TABLE_SansNom1, Milieu(sLigne, nDepart, Position(sLigne, ". ", nDepart) - nDepart), SansEspace(Milieu(sLigne, Position(sLigne, ". ", nDepart) + 1, nSuivant - Position(sLigne, ". ", nDepart))))
    TableAjouteLigne(TABLE_SansNom1, Milieu(sLigne, nDepart, Position(sLigne, ". ", nDepart) - nDepart), SansEspace(Milieu(sLigne, Position(sLigne, ". ", nDepart) + 1)))


    J'ai un souci avec le compte 10131, il n'a pas de point, du coup il est dans le libellé du 1013, de même pour les comptes 10641 et 10681.

    Et pour une meilleure lisibilité sur code, j'aurais dû nommer nNb en nNbPointEspace et nOcc en nOccPointEspace,
    et je peux vous dire que cela à de l'importance, surtout quand on y revient 2, 3, 5 ou 10 ans plus tard.
    C'est comme la boucle POUR nOcc = 2 _À_ nNb + 1 qui fonctionnerait avec POUR nOcc = 1 _À_ nNb vu qu'on n'utilise pas nOcc,
    mais dans plusieurs années, on lira qu'on traite l'occurrence 2 à n plus un dernier, et non du premier au dernier.
     
    JML apprécie ceci.
  • joker

    joker New Member
    MEMBRE WX

    Inscrit:
    Jan 30, 2018
    Messages:
    0
    J'aime reçus:
    13
    A tester ...

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    , Dans ton cas, je me servirai de :
    -> SI VérifieExpressionRégulière(monNum2PlanComptale, "[-.0-9] ...

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    Doc PCMou :

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

     
  • FreudWD

    FreudWD Well-Known Member
    MEMBRE WX WXG 21

    Inscrit:
    Jan 22, 2018
    Messages:
    199
    J'aime reçus:
    368
    J'ai rencontré un problème pour remplacer simplement le premier séparateur (ici point espace) et seulement le premier, en TAB pour un ajout rapide dans la table.
    Je suis donc passé de :

    Trace(sLigne)
    Trace(sLigne[[nDepart À nSuivant]])
    Trace(sLigne[[nDepart À]])

    à
    TableAjouteLigne(TABLE_SansNom1, Gauche(sLigne, Position(sLigne, ". ") - 1), Milieu(sLigne, Position(sLigne, ". ") + 2))
    TableAjouteLigne(TABLE_SansNom1, Milieu(sLigne, nDepart, Position(sLigne, ". ", nDepart) - nDepart), Milieu(sLigne, Position(sLigne, ". ", nDepart) + 2, nSuivant - Position(sLigne, ". ", nDepart)))
    TableAjouteLigne(TABLE_SansNom1, Milieu(sLigne, nDepart, Position(sLigne, ". ", nDepart) - nDepart), Milieu(sLigne, Position(sLigne, ". ", nDepart) + 2))


    pas simple, il m'aurait fallu une fonction Remplace en précisant sur quelle occurrence, et non sur toutes.

    J'ai donc créé RemplaceOccurrence(sTexte, sRecherche, sRemplace, nDepart, nFin), où l'on précise l'indice de début et fin (si besoin) des occurrences.

    Je suis donc passé de :
    Trace(sLigne)
    Trace(sLigne[[nDepart À nSuivant]])
    Trace(sLigne[[nDepart À]])

    à
    TableAjoute(TABLE_SansNom1, RemplaceOccurrence(sLigne, ". ", TAB, 1))
    TableAjoute(TABLE_SansNom1, RemplaceOccurrence(sLigne[[nDepart À nSuivant]], ". ", TAB, 1))
    TableAjoute(TABLE_SansNom1, RemplaceOccurrence(sLigne[[nDepart À]], ". ", TAB, 1))

    beaucoup plus simple et surtout plus lisible.


    Code (Text):
    PROCÉDURE RemplaceOccurrence(sTexte, sRecherche, sRemplace, nDepart, nFin = 0)

    nPosDepart, nPosFin sont des entiers
    sTexteModifie est une chaînes

    SI sTexte = "" ALORS RENVOYER sTexte
    SI sRecherche = "" ALORS RENVOYER sTexte
    SI nDepart < 1 ALORS RENVOYER sTexte
    SI nFin < 1 ALORS nFin = nDepart

    nPosDepart = PositionOccurrence(sTexte, sRecherche, nDepart)
    SI PAS nPosDepart = 0 ALORS

        SI nDepart = nFin ALORS
            nPosFin = nPosDepart + Taille(sRecherche) - 1
        SINON
            nPosFin = PositionOccurrence(sTexte, sRecherche, nFin)
            SI PAS nPosFin = 0 ALORS
                nPosFin += Taille(sRecherche)
            SINON
                nPosFin = Taille(sTexte)
            FIN      
        FIN

        sTexteModifie = Remplace(sTexte[[nPosDepart À nPosFin]], sRecherche, sRemplace)

    SINON
        RENVOYER sTexte
    FIN

    nPosDepart--
    nPosFin++

    RENVOYER sTexte[[1 À nPosDepart]] + sTexteModifie + sTexte[[nPosFin À]]

    Je devrait faire la même chose en acceptant un tableau des indices.
     
    Gemini1961 et JML aiment ça.
  • FreudWD

    FreudWD Well-Known Member
    MEMBRE WX WXG 21

    Inscrit:
    Jan 22, 2018
    Messages:
    199
    J'aime reçus:
    368
    Chose promise chose due, voici la surcharge avec un tableau en entrée des index d'occurrence :
    Code (Text):
    PROCÉDURE RemplaceOccurrence(sTexte, sRecherche, sRemplace, tabOccurence est un tableau d'entiers)

    nPosRecherche est un entier
    sMarqueur est une chaîne = "¶" // Alt+182 pied de mouche (00B6)
    nTailleRecherche est un entier = Taille(sRecherche)
    sCopieTexte est une chaîne = sTexte
    tabPosition est un tableau d'entiers

    SI sTexte = "" ALORS RENVOYER sTexte
    SI sRecherche = "" ALORS RENVOYER sTexte
    SI tabOccurence..Occurrence = 0 ALORS RENVOYER sTexte

    POUR TOUT nPos DE tabOccurence // Sauvegarde les positions
        nPosRecherche = PositionOccurrence(sTexte, sRecherche, nPos)
        SI PAS nPosRecherche = 0 ALORS
            Ajoute(tabPosition, nPosRecherche)
        FIN
    FIN

    POUR TOUT nPos DE tabPosition // Marquage des recherches
        POUR nPosMarquage = 0 _À_ nTailleRecherche - 1
            sCopieTexte[[nPos + nPosMarquage]] = sMarqueur
        FIN
    FIN

    RENVOYER Remplace(sCopieTexte, Répète(sMarqueur, nTailleRecherche), sRemplace)
    Il faut simplement que le texte ne possède pas le caractère "pied de mouche" regroupé sur le nombre de caractères recherchés.
    Le caractère "pied de mouche" est utilisé pour marquer les caractères à remplacer, simple et rapide.


    Exemples :
    sRes = RemplaceOccurrence(sLigne, ". ", TAB, [1])
    sRes = RemplaceOccurrence(sLigne, ". ", "$", [3,5])
    sRes = RemplaceOccurrence(sLigne, ". ", "$", tabListeOccu)

    Edit :
    Le caractère "pied de mouche" est celui de fin de ligne des éditeurs de textes.
     
    #17 FreudWD, Avr 8, 2018
    Dernière édition: Avr 9, 2018
  • JML

    JML New Member

    Inscrit:
    Mar 17, 2018
    Messages:
    11
    J'aime reçus:
    3

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    ,

    Merci beaucoup de ton aide, à charge de revanche quand j'aurai progressé sur windev !
    Bonne journée,
    JML
     
    joker apprécie ceci.
  • JML

    JML New Member

    Inscrit:
    Mar 17, 2018
    Messages:
    11
    J'aime reçus:
    3

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    ,
    Je viens d'intégrer ton code dans mon projet, je viens de lancer ton code vraiment Nickel et je vais étudier ta méthode pour m'en inspirer pour d'autres cas !
    Pas sûr de pouvoir te rendre la pareille ou alors pas avant quelques mois voire années !!!
    Merci encore
    JML
     
    joker apprécie ceci.
  • Freddy KINHOU

    Freddy KINHOU New Member

    Inscrit:
    Juin 15, 2019
    Messages:
    4
    J'aime reçus:
    0
    Hello. J'ai besoins de votre aide. @

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    j'ai lut votre commentaire et j'aurais besoins de votre lumière .
    Alors voila je développe une application qui doit récupérer des information d'une facture fichier txt fournil par un autre logiciel pour ensuite
    l’exploiter. il s'agit ici d'une facture d'une pharmacie. Mon souci est que dans mon fichier en question il y a plusieurs séparateur et du coup j'ai du mal à trouver l'algo quil faut pour tiré juste les information que je veux(liste des médicaments vendu prix unitaire et quantité).
    voici mon fichier txt
     

    Fichiers attachés:

    • IM.TXT
      Taille de fichier:
      718 bytes
      Affichages:
      26
  • Partager cette page

    Chargement...