Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ouvrir une partie d'un fichier texte

11 réponses
Avatar
Looping
Bonjour,

mon probleme est un fichier texte de 4Go (ca fait beaucoup) et je n'ai
besoin que de garder plusieurs petites parties dont je connait les offsets
(en nombre de ligne) dans ce fichier. Existe-t-il un moyen de n'ouvrir qu'une
partie d'un fichier en connaissant l'offset ou par un autre moyen?
Merci

10 réponses

1 2
Avatar
Aski
Salutatoi Looping,

Tu t'es vachement avancé en affirmant :

Bonjour,

mon probleme est un fichier texte de 4Go (ca fait beaucoup) et je n'ai
besoin que de garder plusieurs petites parties dont je connait les
offsets (en nombre de ligne) dans ce fichier. Existe-t-il un moyen de
n'ouvrir qu'une partie d'un fichier en connaissant l'offset ou par un
autre moyen?
Merci



Tu peux ouvrir le fichier en Binary et lire les données par Get.

Aski
Avatar
Jean-Marc
"Looping" a écrit dans le message de
news:
Bonjour,

mon probleme est un fichier texte de 4Go (ca fait beaucoup) et je n'ai
besoin que de garder plusieurs petites parties dont je connait les offsets
(en nombre de ligne) dans ce fichier. Existe-t-il un moyen de n'ouvrir


qu'une
partie d'un fichier en connaissant l'offset ou par un autre moyen?



Hello,

le problème ici est que tu connais un pseudo Offset (nombre de lignes).
Si tu connaissais l'Offset en position (bytes) alors le tour serait joué
avec un
open en mode binary.

J'ai beaucoup travaillé sur des fichiers texte de grande taille, si tu
donnes quelques
précisions je pense bien pouvoir te fournir des solutions efficaces.

En particulier, peux tu préciser:
- Le nombre de lignes (même très approximatif)
- Les lignes font elles toutes la même taille (auquel cas ce sera facile)
- Ce que tu veux faire exactement (par exemple, lire 3 lignes à partir de
la ligne N° 123456, etc.)

En attendant plus d'infos,

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Looping
heu je vois pas vraiment ce que c'est que "get".
mais je peux pas ouvrir le fichier en entier parce que aucun logiciel comme
le notepad ne peut ouvrir un fichier de 4 Go en entier et en une seule
fois. alors pour accelerer les choses je voudrais extraire juste par exemple
la 10ieme ligne puis la 110ieme puis la 210ieme ...
en esperant etre plus clair maintenant...

"Aski" a écrit :

Salutatoi Looping,

Tu t'es vachement avancé en affirmant :

> Bonjour,
>
> mon probleme est un fichier texte de 4Go (ca fait beaucoup) et je n'ai
> besoin que de garder plusieurs petites parties dont je connait les
> offsets (en nombre de ligne) dans ce fichier. Existe-t-il un moyen de
> n'ouvrir qu'une partie d'un fichier en connaissant l'offset ou par un
> autre moyen?
> Merci

Tu peux ouvrir le fichier en Binary et lire les données par Get.

Aski





Avatar
Aski
Salutatoi Looping,

Tu t'es vachement avancé en affirmant :

heu je vois pas vraiment ce que c'est que "get".



Get #1, Position, MyRecord
Lit l'enregistrement.à la position Position et le place dans la variable
MyRecord

Mais effectivement, comme le dit Jean-Marc, cela ne sert à rien si les
longueurs de lignes sont aléatoires.

mais je peux pas ouvrir le fichier en entier parce que aucun logiciel
comme le notepad ne peut ouvrir un fichier de 4 Go en entier et en
une seule fois. alors pour accelerer les choses je voudrais extraire
juste par exemple la 10ieme ligne puis la 110ieme puis la 210ieme ...
en esperant etre plus clair maintenant...



Je ne connais pas d'autre moyen, pour des lignes aléatoires, de lire les
lignes dans une variable poubelle. Lorsque la ligne est atteint, tu
transfères la variables poubelle dans la variable de travail.

'Ouvrir le fichier en mode séquentiel
Open "TonFichier" For Input As #1
'lire les lignes jusqu'à atteindre le numéro voulu
For i = 1 to NrLineToRead
Line Input #1, TextLine.
Next i
'Affecter la ligne à lire
LineToRead = TextLine

Il faut bien sûr tester la fin de fichier.

Mais cette solution oblige à lire tout le fichier. Jean-Marc semble avoir
une solution plus élégante.

Aski
Avatar
Jean-Marc
"Aski" a écrit dans le message de
news:%
Salutatoi Looping,

Tu t'es vachement avancé en affirmant :

> heu je vois pas vraiment ce que c'est que "get".

Get #1, Position, MyRecord
Lit l'enregistrement.à la position Position et le place dans la variable
MyRecord

Mais effectivement, comme le dit Jean-Marc, cela ne sert à rien si les
longueurs de lignes sont aléatoires.

> mais je peux pas ouvrir le fichier en entier parce que aucun logiciel
> comme le notepad ne peut ouvrir un fichier de 4 Go en entier et en
> une seule fois. alors pour accelerer les choses je voudrais extraire
> juste par exemple la 10ieme ligne puis la 110ieme puis la 210ieme ...
> en esperant etre plus clair maintenant...

Je ne connais pas d'autre moyen, pour des lignes aléatoires, de lire les
lignes dans une variable poubelle. Lorsque la ligne est atteint, tu
transfères la variables poubelle dans la variable de travail.

'Ouvrir le fichier en mode séquentiel
Open "TonFichier" For Input As #1
'lire les lignes jusqu'à atteindre le numéro voulu
For i = 1 to NrLineToRead
Line Input #1, TextLine.
Next i
'Affecter la ligne à lire
LineToRead = TextLine

Il faut bien sûr tester la fin de fichier.

Mais cette solution oblige à lire tout le fichier. Jean-Marc semble avoir
une solution plus élégante.



Hello,

La méthode que tu décris est la seule qui marchera dans le cas le plus
général,
sans informations supplémentaires je n'ai à priori rien de mieux à proposer.

En fait ce n'est même pas si lent (j'ai créé un fichier de 1 million de
lignes,
et j'accède à la 999999ème en environ 2 secondes). Bon, tout dépend de
l'usage
de son fichier, est ce qu'il doit faire des accès fréquents, le temps
d'accès
est il critique ou est ce du batch, est ce une manip qu'il doit faire 100
fois
par jour ou seulement 2 fois par mois, etc.

MAIS,
ce que je pense, c'est que bien souvent en fonction du cas, on se rend
compte
qu'on peut ramener le problème à quelque chose de plus malin et donc de plus
rapide. Tout dépend donc des contraintes.

J'ai eu souvent à traiter ce genre de cas et dans 99% des cas, on se rend
compte
que:
- la structure des données n'est pas adaptée
- qu'un bon pre-processing règle en général le problème

<digression>
J'aimerais savoir en pratique l'usage d'un fichier texte de 4 Go,
visiblement
non indexé, dans lequel on "sait" à l'avance que l'information recherchée
est
à la ligne x ou y. Looping pourrait sans doute nous renseigner ?
</digression>

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Aski
Salutatoi Jean-Marc,

<digression>
J'aimerais savoir en pratique l'usage d'un fichier texte de 4 Go,
visiblement
non indexé, dans lequel on "sait" à l'avance que l'information
recherchée est
à la ligne x ou y. Looping pourrait sans doute nous renseigner ?
</digression>



Pour un tel fichier, je commencerais par créer un fichier à accès direct
tout bête.
Il serait peut-être plus gros, mais l'accès en serait tellement simple et
rapide ... ;-)

Cordialement

Aski
Avatar
Jean-Marc
"Aski" a écrit dans le message de
news:%
Salutatoi Jean-Marc,

> <digression>
> J'aimerais savoir en pratique l'usage d'un fichier texte de 4 Go,
> visiblement
> non indexé, dans lequel on "sait" à l'avance que l'information
> recherchée est
> à la ligne x ou y. Looping pourrait sans doute nous renseigner ?
> </digression>

Pour un tel fichier, je commencerais par créer un fichier à accès direct
tout bête.
Il serait peut-être plus gros, mais l'accès en serait tellement simple et
rapide ... ;-)



Je ferais ça aussi. Un petit préprocess pour transformer son fichier en un
fichier à enregistrements de taille fixe, et hop le tour est joué.

Si c'est impossible (genre il y a une autre appli qui continue à écrire
dedans à l'ancien format), il faut trouver d'autre solutions, certainement
la création d'indexs bien choisis. Avec 1 milliard de lignes (sic) il
suffirait d'un index d'une dizaine de milliers de lignes (donc
au pire 1000 tests) pour se ramener à une lecture brutale de
10.000 lignes (au pire).

On a alors des temps d'accès à l'info de l'ordre de 100 ms, pour une taille
d'index < 100 Ko :-) Que du bonheur!

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Aski
Salutatoi Jean-Marc,

Tu t'es vachement avancé en affirmant :

"Aski" a écrit dans le message de
news:%
Salutatoi Jean-Marc,

<digression>
J'aimerais savoir en pratique l'usage d'un fichier texte de 4 Go,
visiblement
non indexé, dans lequel on "sait" à l'avance que l'information
recherchée est
à la ligne x ou y. Looping pourrait sans doute nous renseigner ?
</digression>



Pour un tel fichier, je commencerais par créer un fichier à accès
direct tout bête.
Il serait peut-être plus gros, mais l'accès en serait tellement
simple et rapide ... ;-)



Je ferais ça aussi. Un petit préprocess pour transformer son fichier
en un fichier à enregistrements de taille fixe, et hop le tour est
joué.

Si c'est impossible (genre il y a une autre appli qui continue à
écrire dedans à l'ancien format), il faut trouver d'autre solutions,
certainement la création d'indexs bien choisis. Avec 1 milliard de
lignes (sic) il suffirait d'un index d'une dizaine de milliers de
lignes (donc
au pire 1000 tests) pour se ramener à une lecture brutale de
10.000 lignes (au pire).

On a alors des temps d'accès à l'info de l'ordre de 100 ms, pour une
taille d'index < 100 Ko :-) Que du bonheur!



Et looping est en vrille.
lol rofl lol

Henri
Avatar
Looping
pour repondre a la digression, i ls'agit "tout simplement" d'un
enregistrement de données emises sur liaison série (pendant un certain laps
de temps ;)
et evidement la plupart des données sont a jeter... donc sur les 4 Go il ne
va plus rester grand chose.

j'ai deja essayé le petit bout de code de Aski et il me semble tout a fait
adapté et je vais l'utiliser.

Merci

"Jean-Marc" a écrit :

"Aski" a écrit dans le message de
news:%
> Salutatoi Jean-Marc,
>
> > <digression>
> > J'aimerais savoir en pratique l'usage d'un fichier texte de 4 Go,
> > visiblement
> > non indexé, dans lequel on "sait" à l'avance que l'information
> > recherchée est
> > à la ligne x ou y. Looping pourrait sans doute nous renseigner ?
> > </digression>
>
> Pour un tel fichier, je commencerais par créer un fichier à accès direct
> tout bête.
> Il serait peut-être plus gros, mais l'accès en serait tellement simple et
> rapide ... ;-)

Je ferais ça aussi. Un petit préprocess pour transformer son fichier en un
fichier à enregistrements de taille fixe, et hop le tour est joué.

Si c'est impossible (genre il y a une autre appli qui continue à écrire
dedans à l'ancien format), il faut trouver d'autre solutions, certainement
la création d'indexs bien choisis. Avec 1 milliard de lignes (sic) il
suffirait d'un index d'une dizaine de milliers de lignes (donc
au pire 1000 tests) pour se ramener à une lecture brutale de
10.000 lignes (au pire).

On a alors des temps d'accès à l'info de l'ordre de 100 ms, pour une taille
d'index < 100 Ko :-) Que du bonheur!

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;




Avatar
Aski
Salutatoi Looping,

Tu t'es vachement avancé en affirmant :

pour repondre a la digression, i ls'agit "tout simplement" d'un
enregistrement de données emises sur liaison série (pendant un
certain laps de temps ;)
et evidement la plupart des données sont a jeter... donc sur les 4 Go
il ne va plus rester grand chose.

j'ai deja essayé le petit bout de code de Aski et il me semble tout a
fait adapté et je vais l'utiliser.

Merci



Nous sommes là pour aider quand on peut.

Aski
1 2