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.
...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)
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)
...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)
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.
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.
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.
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)
Bonjour bayosky, dans le message
news:uCSnwLyjGHA.4040@TK2MSFTNGP05.phx.gbl
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)
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)
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
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)))
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)))