Page 1 sur 1

[RESOLU]problème avec FileSeek

Publié : ven. 27/juil./2018 16:54
par pierre003
Bonjour, c’est encore moi.
Pour l’instant j’ai récupéré les données qui m’intéressent de la base GedCom et crée un fichier avec un enregistrement fixe de 200 pour chaque personne, ça a l’air d’être bon pour l’extraction des données aussi mais j’ai un problème avec FileSeek.
Jusqu’au 4 ème enregistrement ça marche super, mais ensuite il y a un décalage.
J’ai vérifié la position du début du 5 ème il est à 1000 et FileSeek(1,a.q) a.q=1000 mais il y a un décalage de -2 et ce n’est pas linéaire.
J’ai tenté de changer le type de variables mais c’est la même chose.
La fin de chaque fiche c’est des « *** » (du nom au dernier * c’est normalement 200 caractères).
Voila le fichier et le programme pour les enregistrements de 1 a 4 c’est ok, mais ensuite il y a un décalage de -2 pour le 5ème, - 3 pour le 7ème …
J’ai peut être pas tout compris a la manœuvre mais ça me chauffe quand même la tête.
Ligne 6 pour changer de N° d'enregistrement.
1 la base
2 le programme (avec pleins de Debug pour tenter de trouver la faille) :oops: :roll:
Merci a tous (j'ai encore dû me planter quelque part)

Code : Tout sélectionner

HERBELIN,Honore-Pierre-Alexandre,M,2,0,24 FEB 1835,Saint-Maixent,72320,Sarthe,Pays de la Loire,FRANCE,,22 FEB 1895,Saint-Maixent,72320,Sarthe,Pays de la Loire,FRANCE,**********************************DEBRAY,Louise-Victoire,F,2,0,4 APR 1838,Nogent-le-Bernard,72110,Sarthe,Pays de la Loire,FRANCE,,21 JUN 1918,Saint-Maixent,72320,Sarthe,Pays de la Loire,FRANCE,*****************************************HERBELIN,Pierre,M,3,0,25 JUN 1793,Saint-Maixent,72320,Sarthe,Pays de la Loire,FRANCE,,16 MAR 1869,Saint-Maixent,72320,Sarthe,Pays de la Loire,FRANCE,***************************************************RIGAULT,Marie-Louise,F,3,0,1794,Vibraye,72320,Sarthe,Pays de la Loire,FRANCE,,10 JUN 1862,Saint-Maixent,72320,Sarthe,Pays de la Loire,FRANCE,***********************************************************DEBRAY OU DEBRÉ,Charles Noel,M,5,0,25 DEC 1805,Gréez-sur-Roc,72320,Sarthe,Pays de la Loire,FRANCE,,,****************************************************************************************************ROUSSEAU,Marie Louise,F,5,0,3 MAY 1804,Cormes,72400,Sarthe,Pays de la Loire,FRANCE,,13 JAN 1858,Sceaux-sur-Huisne,72160,Sarthe,Pays de la Loire,FRANCE,*************************************************HERBELIN,Jean,M,7,0,20 SEP 1744,Jauzé,72110,Sarthe,Pays de la Loire,FRANCE,,22 JAN 1809,Saint-Maixent,72320,Sarthe,Pays de la Loire,FRANCE,*************************************************************BARRÉ,Louise,F,7,0,1757,,19 DEC 1803,Saint-Maixent,72320,Sarthe,Pays de la Loire,FRANCE,****************************************************************************************************************RIGAULT,Maurice Nicolas,M,9,0,26 AUG 1762,Vibraye,72320,Sarthe,Pays de la Loire,FRANCE,,,***************************************************************************************************************

Code : Tout sélectionner

EnableExplicit
Define long.l
Define Person.s, aa.s, i.l, rect.i
Define No.q
Define a.q
No=4  ;N° d'enregistrement

a=No*200
OpenFile(1,"D:\purebasic\recup gedcom\Base.TXT")
FileSeek(1,a);   position de départ 
Debug "Position de FileSeek : " + Str(Loc(1))   
Debug " "
Person=ReadString(1, #PB_UTF8    ,200)
CloseFile(1)
long=Len(Person)
For i= 1 To long
  If Mid(Person,i,1)<>","
      aa+Mid(Person,i,1)
  Else
      Debug aa
      aa=""
   EndIf
Next
Debug "N° d'enregistrement  : "+No 
Debug " Fileseek  :"+a  

Re: problème avec FileSeek

Publié : ven. 27/juil./2018 19:06
par Ulix
Salut Pierre003 !

Pourquoi vouloir utilisé Fileseek ?

Sans ça marche très bien !

Code : Tout sélectionner


EnableExplicit


Enumeration 
#Fichier
EndEnumeration


Define long.l
Define Person.s, aa.s, i.l, rect.i
Define No.q
Define a.q


Define R$

;	Pourquoi utilisé Fileseek ??   :oops: 


;	Attention : je suis sous linux choisir le bon OpenFile

;If OpenFile(1,"D:\purebasic\recup gedcom\Base.TXT")
If OpenFile(#Fichier,".../Bureau/Base.TXT")	 ; Si le fichier peut être lu , on continue...

While Eof(#Fichier) = 0           ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File') 
R$ = ReadString(#Fichier, #PB_UTF8, 200)	: 	Debug R$      ; Affiche une ligne de 200 caractéres


		;	Découpe la ligne et mise en variables (chaine liste avec structure) ???
		Debug "Nom : " + StringField(R$, 1, ",")
		Debug "Prénom : " + StringField(R$, 2, ",")
		Debug "Sexe : " + StringField(R$, 3, ",")
		;  Etc .....
		


Wend
CloseFile(#Fichier)               ; Ferme le fichier précédemment ouvert

Else 	;	Problème de fichier

EndIf


A+ :P
Ulix

Re: problème avec FileSeek

Publié : ven. 27/juil./2018 19:56
par El Papounet
Le décalage observé est dû au fait que ton fichier "Base.TXT" est au format UTF8.

Dans ce format certains caractères comme les caractères accentués sont codés sur 2 octets alors que les autres ne le sont que sur 1 seul.

Passe ton fichier texte en ASCII ou en Unicode en utilisant respectivement #PB_ASCII ou #PB_UNICODE pour l'instruction ReadString.

Re: problème avec FileSeek

Publié : ven. 27/juil./2018 20:34
par pierre003
[quote="Ulix"]Salut Pierre003 !
Pourquoi vouloir utilisé Fileseek ?
Sans ça marche très bien !

Bonsoir Ulix,
Si j’ai bien compris on lit tout le fichier, c’est justement ce que je ne veux pas faire car ici j’ai coupé le fichier pour les tests mais sinon il est bien plus lourd.
Et lorsqu’il sera utilisé il faudra qu’il sorte 40 ou 60 noms (pour un mariage c’est 2 fois ça) qui seront en n’importe quel endroit du fichier. (Dans certaines communes on pourrait utiliser la règle des 20-80 pour les connaisseurs ; 20% des noms correspondent 80% des personnes de cette commune).
Et je pensais faire un index qui pourra justement pointer sur le début de l’enregistrement pour récupérer les 200 caractères.
El Papounet m’a donné la combine et ça marche nickel.
A+ Pierre

Re: problème avec FileSeek

Publié : ven. 27/juil./2018 20:36
par pierre003
El Papounet a écrit :Le décalage observé est dû au fait que ton fichier "Base.TXT" est au format UTF8.

Dans ce format certains caractères comme les caractères accentués sont codés sur 2 octets alors que les autres ne le sont que sur 1 seul.

Passe ton fichier texte en ASCII ou en Unicode en utilisant respectivement #PB_ASCII ou #PB_UNICODE pour l'instruction ReadString.
Bonsoir El Papounet
Ça marche nickel, avec #PB_ASCII, mais pas avec #PB_UNICODE
Avec un fichier de 2800 personnes c’est 3-4 secondes pour le créer depuis GedCom(de 1080ko) et un accès instantané pour lire une fiche.
Merci beaucoup et bonne soirée
Pierre

Re: problème avec FileSeek

Publié : ven. 27/juil./2018 20:37
par Ar-S
Intéresse toi à SQlite pour ce genre de chose, c'est fait pour ça !

Re: problème avec FileSeek

Publié : sam. 28/juil./2018 10:36
par pierre003
Ar-S a écrit :Intéresse toi à SQlite pour ce genre de chose, c'est fait pour ça !
Bonjour,
SQlite doit surement être intéressant, mais avec mon âge pour me mettre des nouvelles choses dans la tête…
Je viens de tester la recherche et l’affichage.

TempsDepart.q = ElapsedMilliseconds()
lecture/affichage des 64 personnes trouvées/2850
Debug ElapsedMilliseconds()-TempsDepart me donne 33 (millisecondes ?)

Je ne suis pas sûr de la formule pour trouver le temps de traitement, mais c’est instantané.
Donc pas nécessaire de me torturer le cerveau, et comme je vais rajouter d’autres infos sur chaque personne, le temps ne devrait pas changer (un peu comme ce bon vieux fichier a accès direct que j’adorais quand je bossais :wink: ).
Je vous souhaite à toutes et a tous un bon WE.
Pierre
PS : comme le projet n’est pas près d’être terminé, je reviendrais surement encore vous ennuyer avec mes questions :oops: .

Re: problème avec FileSeek

Publié : sam. 28/juil./2018 21:55
par Ar-S
120, 200 noms.. c'est rien pour un soft :mrgreen: Il pourrait le gérer même en liste avec fichier prefs que tu charges au démarrage.