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.
Un problème, peu connu, vient des limites de FINDSTR. Lorsqu'on tente de dépasser ces limites, on obtient un "FINDSTR write error"
Malheureusement, je manque de détails sur ces limites.
@-salutations
Michel Claveau
sympatix
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 ----------------------------------------------------------- -- Cordialement sympatix Antispam: Supprimer les "toto" pour me répondre
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
-----------------------------------------------------------
--
Cordialement
sympatix
Antispam: Supprimer les "toto" pour me répondre
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 ----------------------------------------------------------- -- Cordialement sympatix Antispam: Supprimer les "toto" pour me répondre
Jean
En parlant de batch, je vais faire le boulot de Michel et montrer que cet environnement a encore de beaux jours devant lui:
findstr /g:t1.txt t2.txt > t3.txt
C'est findstr.exe qui a de beaux jours devant lui :-)
On peut utiliser exactement la même commande dans une console PowerShell :-)
Amicalement,
-- Jean - JMST Belgium
En parlant de batch, je vais faire le boulot de Michel et montrer que cet
environnement a encore de beaux jours devant lui:
findstr /g:t1.txt t2.txt > t3.txt
C'est findstr.exe qui a de beaux jours devant lui :-)
On peut utiliser exactement la même commande dans une console
PowerShell :-)
On peut utiliser exactement la même commande dans une console PowerShell :-)
On peut également utiliser la même commande dans PeJBshell. Directement, si on est en mode DOS ; précédée d'un point (".") si on est en mode PYTHON.
-- @-salutations
Michel Claveau
bayosky
Notre ami sympatix tapota :
(...)
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 ----------------------------------------------------------- Bonsoir,
la demande initiale ne donnait aucune indication concernant le nombre probable de lignes... ç'est pourtant une info importante :o)
Il me semble qu'en lisant tout d'un coup et en séparant les lignes avec split, on devrait accélérer sensiblement la manip. Le FSO n'est pas très véloce et mieux vaut limiter ses interventions :o)
HB
Notre ami sympatix tapota :
(...)
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
-----------------------------------------------------------
Bonsoir,
la demande initiale ne donnait aucune indication concernant le nombre
probable de lignes...
ç'est pourtant une info importante :o)
Il me semble qu'en lisant tout d'un coup et en séparant les lignes
avec split, on devrait accélérer sensiblement la manip. Le FSO n'est
pas très véloce et mieux vaut limiter ses interventions :o)
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 ----------------------------------------------------------- Bonsoir,
la demande initiale ne donnait aucune indication concernant le nombre probable de lignes... ç'est pourtant une info importante :o)
Il me semble qu'en lisant tout d'un coup et en séparant les lignes avec split, on devrait accélérer sensiblement la manip. Le FSO n'est pas très véloce et mieux vaut limiter ses interventions :o)
HB
sympatix
In news:, bayosky typed:
la demande initiale ne donnait aucune indication concernant le nombre probable de lignes... ç'est pourtant une info importante :o)
C'est vrai, juste le poids. En plus, un fichier peut être petit pour certains, et gros pour d'autre, tout est relatif :-)
Il me semble qu'en lisant tout d'un coup et en séparant les lignes avec split, on devrait accélérer sensiblement la manip. Le FSO n'est pas très véloce et mieux vaut limiter ses interventions :o)
Merci pour la suggestion. Si j'ai le temps, j'essayerai cette méthode, je connais moins, ce sera l'occas d'apprendre...mais là, pfff, fait chaud ;-)
...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
(Antispam: Ôter les "toto" dans l'adresse, pour me répondre)
In news:O4Y7v5ljGHA.2200@TK2MSFTNGP05.phx.gbl,
bayosky <bidonus@pasla.ici> typed:
la demande initiale ne donnait aucune indication concernant le nombre
probable de lignes...
ç'est pourtant une info importante :o)
C'est vrai, juste le poids. En plus, un fichier peut être petit pour
certains, et
gros pour d'autre, tout est relatif :-)
Il me semble qu'en lisant tout d'un coup et en séparant les lignes
avec split, on devrait accélérer sensiblement la manip. Le FSO n'est
pas très véloce et mieux vaut limiter ses interventions :o)
Merci pour la suggestion. Si j'ai le temps, j'essayerai cette méthode, je
connais moins, ce sera
l'occas d'apprendre...mais là, pfff, fait chaud ;-)
...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
la demande initiale ne donnait aucune indication concernant le nombre probable de lignes... ç'est pourtant une info importante :o)
C'est vrai, juste le poids. En plus, un fichier peut être petit pour certains, et gros pour d'autre, tout est relatif :-)
Il me semble qu'en lisant tout d'un coup et en séparant les lignes avec split, on devrait accélérer sensiblement la manip. Le FSO n'est pas très véloce et mieux vaut limiter ses interventions :o)
Merci pour la suggestion. Si j'ai le temps, j'essayerai cette méthode, je connais moins, ce sera l'occas d'apprendre...mais là, pfff, fait chaud ;-)
...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