OVH Cloud OVH Cloud

supprimer les lignes dans un fichier

34 réponses
Avatar
Trust
Bonjour,

J’ai un très gros fichier .txt
Je souhaite supprimer les lignes qui sont en double dans le fichier.
Alors je recherche un script vbs pouvant le faire.
Si quelqu’un a une suggestion.
Merci d’avance.

4 réponses

1 2 3 4
Avatar
bayosky
Notre ami sympatix tapota :

...Par contre, s'il fait moins chaud chez toi, et si t'as le
temps...(sans vouloir te commander), pour la beauté du geste :-D


ben en fait .... à toulou-ou-ou-zeu ... fépafroi ...
pi j'ai pas trop de temps en ce moment...

en revanche pour utiliser split, il faut pouvoir lire le fichier d'un
seul coup dans une chaîne et la taille est ( forcément ) limitée mais
il me faudrait vérifier exactement tout ces détails pour ne pas dire
de sottise....

L'idéal serait :

-> on lit tout et l'on met les lignes dans un tableau Lignes()
( fonction split)
-> on fait un tableau d'index rang()
où rang(p) = p

Etape 1 :
On range Lignes()
en modifiant Rang() en parallèle
pour que lignes(rang(p)) soit l'ancien p-ième ligne ...
( pour comprendre, faire à la main un truc avec 4 ou 5 termes
Je ne retiens pas ce type d'algo... mais ça se retrouve vite )

Etape 2 :
on prend un nouveau tableau LignesBis()
on lit lignes(p) dans l'ordre en comparant simplement avec le
précédent
quand c'est nouveau on met dans LignesBis(q)
sinon on met rang(p) à -1

et ainsi de suite.

Etape 3 :
à la fin on on prend rang() dans l'ordre
et on ajoute les LigneBis(rang(n))
( sauf si rang(n) = -1 )
à la queuleuleu avec un vbcrlf
dans une chaîne
Enfin, on envoie la châine avec FSO
et l'on retrouve ainsi l'ordre initial sans les doublons ...

On peut compacter les étapes 2 et 3
on stockant à mesure sans passer par LignesBis
mais c'est peut-être plus délicat à suivre
sans se mélanger les pinceaux ...


A+

HB

PS : Si je trouve le temps, je ferais un beau VBS
mais je sais que les erreurs de syntaxe
et les tests qui en découlent me feront perdre beaucoup de temps....
( je me connais un peu, tout de même)
alors, je préfère ne pas m'engager rapidement :o)

Avatar
Trust
Il lit le fichier et supprime les lignes en double.


Pour rééquilibrer ce fil de discusion ;-) et pour la beauté du geste, je
viens de faire (très modestement) un petit bout de code en bon vieux vbs, qui
fait (sauf bug) ce que tu demandes.
Je ne sais pas si la méthode que j'emploie est optimisée, mais elle a le
mérite de fonctionner plus ou moins bien quand même.
Comme le dit Jean, c'est plus compliqué à faire (quoique, je trouve mon code
bizarrement court, pour du vbs, cherchez l'erreur...?)
Le seul bug que j'ai pu constater, est la non recopie de certaines lignes
vides...mais j'ai la flemme de chercher ;-)
Sinon, après plusieurs essais sur différents fichiers, les lignes en double
sont bien supprimmées, où qu'elles soient.

2 inconvénients constatés, qui peuvent devenir gênant: la lenteur
d'exécution, ainsi que l'utilisation des ressources du processeur (quoique
dans ce cas là, 1 ou 2 petits Wscript.sleep bien placés pourraient régler le
pbl. Pour la lenteur, ça dépasse les 20mn quand on avoisine aproximativement
les 600-700ko.
Je mets le code ci-dessous, à toute fins utiles:
-----------------------------------------------------------
Const Pour_Lire = 1
Const Pour_Ajouter = 8
Source = "C:source.txt"
Cible = "C:cible.txt"

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set F1 = oFSO.OpenTextFile (source, Pour_Lire, True)
Set F3 = oFSO.OpenTextFile (cible, Pour_Ajouter, True)
Lit1 = F1.ReadLine
F3.WriteLine Lit1
Do Until F1.AtEndOfStream
Flag = False
Lit1 = F1.ReadLine
Set F2 = oFSO.OpenTextFile (cible, Pour_Lire, True)
Do Until F2.AtEndOfStream
Lit2 = F2.ReadLine
If Lit2 = Lit1 Then
Flag = True
F2.Close
Exit Do
End If
Loop
If Flag = False Then F3.WriteLine Lit1
Loop
-----------------------------------------------------------


Je vous remerci infiniment,
"Sympatix", ton script répond à ma demande.
Merci d'avoir pris de votre temps pour me répondre.
À bientôt.


Avatar
sympatix
Bonjour bayosky, dans le message
news:
tu nous disais:

.../...
PS : Si je trouve le temps, je ferais un beau VBS
.../...


Merci pour tes suggestions méthodologiques, j'en prends bonne note. Comme
Trust est satisfait, je pense il n'y a pas urgence pour la suite. Mais ce
serais quand même interressant de comparer la vitesse avec le FSO.
:-)
--
Cordialement
saint_path_x_arobase_t'es_laide_euh_point_fr

(Antispam: Ôter les "toto" dans l'adresse, pour me répondre)

Avatar
bayosky
Notre ami sympatix tapota :

Merci pour tes suggestions méthodologiques, j'en prends bonne note.
Comme Trust est satisfait, je pense il n'y a pas urgence pour la
suite. Mais ce serais quand même interressant de comparer la vitesse
avec le FSO. :-)


Salut,

s'il est est ravi moi aussi :o)

Sur un très gros fichier avec le mode de tri "actuel" avec la double
boucle est forcément beaucoup plus lent... Ceci étant, faudrait faire
de vrai tests :o)))

A+

HB

1 2 3 4