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.
Résultat, pas de classe :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
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
-
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.
Page 1 sur 2
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.
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
Kill3rbko apprécie ceci.
@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
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.
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!
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.
Chose promise chose due, voici la surcharge avec un tableau en entrée des index d'occurrence :
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.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)
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.
michel, joker, Gemini1961 et 1 autre personne aiment ça.
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.
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:
Page 1 sur 2