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

Afficher n dernieres lignes

20 réponses
Avatar
technicland
Bonjour
j'ai vu pas mal d'exemple pour exploiter le contenu d'un fichier, seulement
ca fait un petit moment que je butte sur ceci:
- Comment copier dans un nouveau fichier les n dernieres lignes d'un autre
fichier
De plus si y a un moyen de ne pas compter la totalitée des lignes car mon
fichier fait environ 800 000 lignes alors le comptage prend plusieurs
minutes. Je me demandai si un truc du genre endofstream -100 ou quelque
chose comme ca n'existait pas :)

Bref mes connaissances vbs sont limitées pour aller plus loin dans ce genre
de chose si vous avez une idée

Merci
Laurent

10 réponses

1 2
Avatar
Fred
Dans : news:,
technicland disait :
Bonjour


Bonjour,

j'ai vu pas mal d'exemple pour exploiter le contenu d'un fichier,
seulement ca fait un petit moment que je butte sur ceci:
- Comment copier dans un nouveau fichier les n dernieres lignes d'un
autre fichier
De plus si y a un moyen de ne pas compter la totalitée des lignes car
mon fichier fait environ 800 000 lignes alors le comptage prend
plusieurs minutes. Je me demandai si un truc du genre endofstream
-100 ou quelque chose comme ca n'existait pas :)



Rien n'existe pour cela (à ma connaissance).
Avec vbs, dans un fichier texte, la lecture étant séquentielle, tu dois
lire toutes les lignes depuis le début.
Si tu connais le nombre de lignes à copier, tu peux utiliser la
technique du buffer circulaire.
Un tableau de N chaînes.
Un pointeur que tu incrémentes à chaque lecture et que tu remets à zéro
quand la fin du tableau est atteinte.
Ainsi, la N+1ème chaîne écrasera la première lue (N+2 la deuxième etc
...)
À la fin du fichier, tu aura donc bien dans ton tableau les N dernières
lignes lues. Pas besoin de revenir en arrière ou de recommencer depuis
le début.

Je ne pense pas que cela soit si long, même avec 800000 lignes. Tu
utilises ReadLine ?

--
Fred

Avatar
Jacques Barathon [MS]
"technicland" wrote in message
news:
Bonjour
j'ai vu pas mal d'exemple pour exploiter le contenu d'un fichier,
seulement ca fait un petit moment que je butte sur ceci:
- Comment copier dans un nouveau fichier les n dernieres lignes d'un autre
fichier
De plus si y a un moyen de ne pas compter la totalitée des lignes car mon
fichier fait environ 800 000 lignes alors le comptage prend plusieurs
minutes. Je me demandai si un truc du genre endofstream -100 ou quelque
chose comme ca n'existait pas :)


Je ne crois pas que ça existe tel que tu le souhaiterais, à moins que
quelque chose m'échappe (possible, vu ma connaissance moyenne de VBS :-)).
Si j'ai raison, il faudra en effet lire la totalité du fichier avant de
faire l'opération de suppression.

Je ne fournirai pas la solution en VBS, n'étant pas assez habitué aux
manipulations du FSO et autres objets liés aux fichiers pour donner une
réponse optimale. Je me contenterai de t'indiquer une solution en
PowerShell, que je t'invite à découvrir si tu ne l'as pas encore fait. Sous
PowerShell tu peux lire l'intégralité du contenu de ton fichier dans une
variable (qui sera stockée comme un tableau), puis indiquer à PowerShell
d'écrire le contenu du tableau des lignes "total - n" à "total" où total
correspond au nombre de lignes total et n le nombre de lignes de fin que tu
veux recopier. Ca donne un script comme ça par exemple:

-- couper ici --
param($source, $destination, $lines, [switch]$append)
$input = type $source
$input[($input.length - $lines)..($input.length - 1)] | out-file
$destination -append:$append
-- couper ici --

Si tu sauvegardes les lignes ci-dessus dans un fichier copy-lastlines.ps1,
tu pourras par exemple l'exécuter ainsi:

copy-lastlines c:logssource.log c:tempresultat.log 100

L'exemple ci-dessus copiera les 100 dernières lignes de source.log dans
resultat.log. Si un fichier resultat.log existait déjà, il sera écrasé. Pour
éviter cela et ajouter les lignes à la fin du fichier existant, tu peux
ajouter le paramètre -append:

copy-lastlines c:logssource.log c:tempresultat.log 100 -append

Jacques

Avatar
Jacques Barathon [MS]
"Jacques Barathon [MS]" wrote in message
news:%
<...>
-- couper ici --
param($source, $destination, $lines, [switch]$append)
$input = type $source
$input[($input.length - $lines)..($input.length - 1)] | out-file
$destination -append:$append
-- couper ici --


Attention, les lignes suivantes doivent être regroupées en une seule ligne
dans ton script:

Avatar
Jacques Barathon [MS]
Oops, un CTRL+Enter malencontreux a envoyé ce mail trop rapidement... Je
termine...

"Jacques Barathon [MS]" wrote in message
news:%
"Jacques Barathon [MS]" wrote in message
news:%
<...>
-- couper ici --
param($source, $destination, $lines, [switch]$append)
$input = type $source
$input[($input.length - $lines)..($input.length - 1)] | out-file
$destination -append:$append
-- couper ici --



Attention, les lignes suivantes doivent être regroupées en une seule ligne
dans ton script:

$input[($input.length - $lines)..($input.length - 1)] | out-file
$destination -append:$append

Voilà...

Jacques


Avatar
technicland
Jacques Barathon [MS] wrote:
Je ne fournirai pas la solution en VBS, n'étant pas assez habitué aux
manipulations du FSO et autres objets liés aux fichiers pour donner
une réponse optimale. Je me contenterai de t'indiquer une solution en
PowerShell, que je t'invite à découvrir si tu ne l'as pas encore
fait.


Lut
Malheureusement je suis obligé de m en tenir a VBS c'est des serveurs en
2000 ou 2003 et je ne peux pas installer ce que je veux d apres ce que j'ai
lu y a des trucs a installer pour PowerShell
Laurent

Avatar
Jacques93
Bonjour technicland,
Jacques Barathon [MS] wrote:
Je ne fournirai pas la solution en VBS, n'étant pas assez habitué aux
manipulations du FSO et autres objets liés aux fichiers pour donner
une réponse optimale. Je me contenterai de t'indiquer une solution en
PowerShell, que je t'invite à découvrir si tu ne l'as pas encore
fait.


Lut
Malheureusement je suis obligé de m en tenir a VBS c'est des serveurs en
2000 ou 2003 et je ne peux pas installer ce que je veux d apres ce que j'ai
lu y a des trucs a installer pour PowerShell
Laurent



Peut être une piste : faire une recherche sur 'tail windows'

--
Cordialement,

Jacques.


Avatar
Jacques93

Peut être une piste : faire une recherche sur 'tail windows'

Notamment celui ci :


<http://malektips.com/xp_dos_0001.html&gt;
<http://www.microsoft.com/downloads/details.aspx?FamilyID467a69-57ff-4ae7-96ee-b18c4790cffd&DisplayLang=en&gt;

--
Cordialement,

Jacques.

Avatar
technicland
Jacques93 wrote:

Peut être une piste : faire une recherche sur 'tail windows'

Notamment celui ci :


<http://malektips.com/xp_dos_0001.html&gt;
<http://www.microsoft.com/downloads/details.aspx?FamilyID467a69-57ff-4ae7-96ee-b18c4790cffd&DisplayLang=en&gt;


Lut
merci mais je ne veux rien avoir a installer ou copier sur les serveurs mis
a part les scripts
Laurent


Avatar
technicland
Fred wrote:
Rien n'existe pour cela (à ma connaissance).
Avec vbs, dans un fichier texte, la lecture étant séquentielle, tu
dois lire toutes les lignes depuis le début.
Si tu connais le nombre de lignes à copier, tu peux utiliser la
technique du buffer circulaire.
Un tableau de N chaînes.
Un pointeur que tu incrémentes à chaque lecture et que tu remets à
zéro quand la fin du tableau est atteinte.
Ainsi, la N+1ème chaîne écrasera la première lue (N+2 la deuxième etc
...)
À la fin du fichier, tu aura donc bien dans ton tableau les N
dernières lignes lues. Pas besoin de revenir en arrière ou de
recommencer depuis le début.

Je ne pense pas que cela soit si long, même avec 800000 lignes. Tu
utilises ReadLine ?


Salut
oui c'est ReadLine la j'arrive a sortir la derniere ligne et mais j'en
voudrais environ 500 et j ai du mal avec les tableaux!
Voici un script trouvé sur google qui affiche la derniere ligne et le temps
d'execution pour 140Mo 30seondes

myFile = "C:fichier.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1 ', ForWriting = 2
Set s = fso.OpenTextFile(myFile, ForReading)


StartTime = Timer
Do until s.AtEndOfStream
LastLine = s.ReadLine
Loop


msgbox LastLine & vbcrlf & Timer - StartTime & " Seconds"
wscript.quit

Avatar
Gilles LAURENT
"technicland" a écrit dans le
message de news:
| Bonjour

Bonjour,

| j'ai vu pas mal d'exemple pour exploiter le contenu d'un fichier,
| seulement ca fait un petit moment que je butte sur ceci:
| - Comment copier dans un nouveau fichier les n dernieres lignes d'un
| autre fichier
| De plus si y a un moyen de ne pas compter la totalitée des lignes car
| mon fichier fait environ 800 000 lignes alors le comptage prend
| plusieurs minutes. Je me demandai si un truc du genre endofstream
| -100 ou quelque chose comme ca n'existait pas :)

Affichage des N dernières lignes d'un fichier texte
Note : Une ligne se termine par la séquence CRLF (Windows)

+++ Usage
PopLastNLines.vbs <filepath> <nLastLines>

+++ Exemple
cscript PopLastNLines.vbs d:testfile.txt 300

--- PopLastNLines.vbs ---

strStart=Now
Set oFs=CreateObject("Scripting.FileSystemObject")
Set oFile=oFs.OpenTextFile (WScript.Arguments(0),1)
arrLines=Split (oFile.ReadAll, VBCrLf)
For i=1 To WScript.Arguments(1)
WScript.Echo arrLines (UBound (arrLines) - i)
Next
WScript.Echo strStart
WScript.Echo Now

--- PopLastNLines.vbs ---

Temps de traitement : < 40 secondes (affichage inclus)

- Tests réalisés sur un fichier texte de 800 000 lignes
- Les lignes sont composées de 80 caractères suivis d'un CrLf
- Plateforme Pentium M 1500MHz 512 Mo
- Mémoire physique disponible < 140 Mo

--
Gilles LAURENT
http://glsft.free.fr
1 2