Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[WD5.5] Probleme de lecture sur un fichier texte

128 views
Skip to first unread message

Olivier KRIEGER

unread,
Jan 10, 2002, 4:04:30 AM1/10/02
to
Bonjour,

J'ai un probleme de lecture sur un fichier texte (format csv).

Ce fichier est composé de cinq champs separes par des points virgules
dont voici un exemple partil :
45590809;01-11-2001;113640843;XXXXXXX xxxxxx;32,34
45590810;01-11-2001;W8GLK000;XXXXXXX xxxxxx;133.27
45590811;01-11-2001;112943200;XXXXXXX xxxxxx;87.22
45590812;01-11-2001;113769964;XXXXXXX xxxxxx;6.21
45590813;01-11-2001;111795251;XXXXXXX xxxxxx;15.11

A la fin de chaque ligne, il y a un retour chariot. J'ai visualise ce
fichier sous Ultra Edit en hexa et je retrouve bien a chaque fin de
ligne la sequence de caractère 0x0D 0x0A.

Voici le code qui traite ce fichier :

numfic = fouvre(msRepTrans+msNomFichier,folecture+foTexte)
si numfic >= 0 alors
numligne=1
ligne=flitligne(numfic)
FIN

Nous sommes bien daccord que dans la variable ligne on devrait
retrouver la chaine suivante :
45590809;01-11-2001;113640843;XXXXXXX xxxxxx;32,34
sans le Retour chariot.

Hors voici ce que contient la variable ligne :
45590809;01-11-2001;113640843;XXXXXXX xxxxxx;32,34{10}45590810;01-11-
2001;W8GLK000;XXXXXXX xxxxxx;133.27{10}45590811;01-11-2001;112943200;
XXXXXXX xxxxxx;87.22{10}45590812;01-11-2001;113769964;XXXXXXX xxxxxx;6.
21{10}45590813;01-11-2001;111795251;XXXXXXX xxxxxx;15.11

En fait ligne contient les 4096 premiers caracteres de mon fichier qui
contient environ 2 millions de lignes. C donc que flitligne ne trouve
pas le retour chariot !

Precisions :
Le fichier fait un peu plus de 100 Mo.
Avec un fichier identique (en fait extrait et genere de la meme maniere
et provenant de la meme base) mais de 15 Mo (environ 300 000 enreg) la
lecture se passe bien.

Voila j'espere avoir ete assez clair !

Merci par avance pour votre aide et bonne annee en retard !

Olivier


--
Article posté depuis le site FORUMS WINDEV® :
http://windev.wdscript.com
Une archive de plus de 65000 articles sur Windev® et Webdev®
--

philippe chaissac

unread,
Jan 10, 2002, 4:41:59 AM1/10/02
to
Bonjour,

Olivier KRIEGER écrivait dans le message
news:105F003D948600...@windev.wdscript.com :

> J'ai un probleme de lecture sur un fichier texte (format csv).
>
> Ce fichier est composé de cinq champs separes par des points virgules
> dont voici un exemple partil :
> 45590809;01-11-2001;113640843;XXXXXXX xxxxxx;32,34
> 45590810;01-11-2001;W8GLK000;XXXXXXX xxxxxx;133.27
> 45590811;01-11-2001;112943200;XXXXXXX xxxxxx;87.22
> 45590812;01-11-2001;113769964;XXXXXXX xxxxxx;6.21
> 45590813;01-11-2001;111795251;XXXXXXX xxxxxx;15.11
>
> A la fin de chaque ligne, il y a un retour chariot. J'ai visualise ce
> fichier sous Ultra Edit en hexa et je retrouve bien a chaque fin de
> ligne la sequence de caractère 0x0D 0x0A.

Donc ton fichier est conforme, c'est une base.



> Voici le code qui traite ce fichier :
>
> numfic = fouvre(msRepTrans+msNomFichier,folecture+foTexte)
> si numfic >= 0 alors
> numligne=1
> ligne=flitligne(numfic)
> FIN
>
> Nous sommes bien daccord que dans la variable ligne on devrait
> retrouver la chaine suivante :
> 45590809;01-11-2001;113640843;XXXXXXX xxxxxx;32,34
> sans le Retour chariot.

Tout à fait

> Hors voici ce que contient la variable ligne :
> 45590809;01-11-2001;113640843;XXXXXXX xxxxxx;32,34{10}45590810;01-11-
> 2001;W8GLK000;XXXXXXX xxxxxx;133.27{10}45590811;01-11-2001;112943200;
> XXXXXXX xxxxxx;87.22{10}45590812;01-11-2001;113769964;XXXXXXX xxxxxx;6.
> 21{10}45590813;01-11-2001;111795251;XXXXXXX xxxxxx;15.11
>
> En fait ligne contient les 4096 premiers caracteres de mon fichier qui
> contient environ 2 millions de lignes. C donc que flitligne ne trouve
> pas le retour chariot !

D'accord, en fait la limite de 4096 caractères de flitligne()



> Precisions :
> Le fichier fait un peu plus de 100 Mo.
> Avec un fichier identique (en fait extrait et genere de la meme maniere
> et provenant de la meme base) mais de 15 Mo (environ 300 000 enreg) la
> lecture se passe bien.

Ce qui confirme que ton format est bon, ainsi que ton algo, et donc qu'il
y a un bug manifeste de la fonction !

Je n'ai jamais eu à traiter de si gros fichier texte, mais je me doutais
qu'il y aurait problème rien qu'en lisant la doc de fPositionne, qui
admet en paramètre Offset une valeur entière (soit un déplacement de +/-
32767 octets, ce qui est peu...). Cette limite, plus celle des 4096
octets récupérés par flitligne(), en dit long sur le codage interne de
ces fonctions... Tu es bon pour les réécrire à la main (mais une lecture
caractère par caractère sera loooonnngggggggue sur un fichier de 100
Mo... si ça marche...). Je ne suis même pas sûr qu'il faille te fendre
d'un rapport de bug. Y-aura-t'il encore des correctifs à WD5.5b ?

--
philippe
chai...@free.fr

Michel Fages

unread,
Jan 10, 2002, 7:37:21 AM1/10/02
to
> Je n'ai jamais eu à traiter de si gros fichier texte, mais je me doutais
> qu'il y aurait problème rien qu'en lisant la doc de fPositionne, qui
> admet en paramètre Offset une valeur entière (soit un déplacement de +/-
> 32767 octets, ce qui est peu...).

La doc est fausse (encore).... fPositionne prend un entier long (et non un
entier) ce qui autorise des déplacement de + ou - (2^32)/2


Jacques

unread,
Jan 10, 2002, 7:39:18 AM1/10/02
to

Peut-être que la solution (pour ne pas trop t'emmerder) serait de copier la
ligne que tu récupères dans une variable, puis de faire un:
LigneResultat = ExtraitChaine(MaLigne,iBoucle,"{10}") comme séparateur, pour
avoir tes lignes comme tu aurais dû les avoir avec fLitLigne(). C'est comme on
dit un patch, mais c'est facile à réaliser et pas trop long en traitement.
Biensûr le plus chiant à traiter c'est pour la fin de ta ligne récupérer par
fLitLigne() où tu devras ajouter un bout de ta ligne que tu devras concaténer
avec le suivant. Mais c'est mieux que de tout lire octet par octet sur un
fichier de 100 Mo.

Salut Jacques

--
Utilisez notre serveur de news 'news.foorum.com' depuis n'importe ou.
Plus d'info sur : http://nnrpinfo.go.foorum.fr/

Eric Demeester

unread,
Jan 10, 2002, 1:19:20 PM1/10/02
to
dans (in) fr.comp.developpement.agl.windev, Olivier
KRIEGER<pathf...@freesurf.fr> ecrivait (wrote) :

Bonsoir Olivier,

> J'ai un probleme de lecture sur un fichier texte (format csv).
>
> Ce fichier est composé de cinq champs separes par des points virgules

> 45590809;01-11-2001;113640843;XXXXXXX xxxxxx;32,34

> A la fin de chaque ligne, il y a un retour chariot. J'ai visualise ce

> fichier sous Ultra Edit en hexa et je retrouve bien a chaque fin de
> ligne la sequence de caractère 0x0D 0x0A.

Je ne sais pas lire l'hexa, mais en revanche je sais que la fin de ligne
sous OS Microsoft [1] se compose de <cr><lf>.

Qu'il te manque l'un des deux, comme c'est par exemple le cas lors de la
transmission d'un fichier texte en pièce jointe sans compression avec
Outlook Express (que Bill Gates soit maudit jusqu'à la fin des temps
pour toutes les cochonneries instables que son entreprise diffuse de par
le monde, mais je m'égare), et le fLitLigne plantera par overflow (et ne
reculant devant aucun sacrifice, plantera éventuellement la machine
aussi), faute d'avoir trouvé dans le fichier lu la séquence de
caractères lui expliquant qu'il est en fin de ligne.

> Nous sommes bien daccord que dans la variable ligne on devrait
> retrouver la chaine suivante :
> 45590809;01-11-2001;113640843;XXXXXXX xxxxxx;32,34
> sans le Retour chariot.

Faut voir (cf ci-dessus).

Tu devrais plutôt lire ton fichier texte caractère par caractère en
testant leur valeur, ce qui te permettrait de décider toi-même quand il
y a lieu de passer à la ligne.

[1] Rappel : caractère de fin de ligne en fonction des OS :

UNIX et dérivés : <LF>
Microsoft : <CR><LF>
Mac : <CR>

--
* WindevAsso : sources, ressources, trucs et astuces, FAQ :
* http://www.windevasso.org

0 new messages