Comment supprimer toutes les lignes dupliquées d'un fichier texte ?

Hey, Scripting Guy!

Hey, Scripting Guy!

Bienvenue dans la rubrique TechNet dans laquelle les Microsoft Scripting Guys répondent aux questions fréquentes sur les scripts d'administration de système. Vous avez une question sur les scripts d'administration de système ? Envoyez-la par courrier électronique à scripter@microsoft.com. Nous ne pouvons pas garantir que nous pourrons répondre à toutes les questions qui nous parviendrons, mais nous vous promettons de faire tout notre possible.

Et pensez à consulter la nouvelle rubrique améliorée Hey, Scripting Guy! archive.

La question du jour : Comment supprimer toutes les lignes dupliquées d'un fichier texte ?

Comment supprimer toutes les lignes dupliquées d'un fichier texte ?Comment supprimer toutes les lignes dupliquées d'un fichier texte ?

Hey, Scripting Guy! Comment supprimer toutes les lignes dupliquées d'un fichier texte ?

-- SW

Bonjour, SW. Être un Scripting Guy, c'est se lancer dans une quête sans fin à la recherche de la solution parfaite à un problème donné. (C'est du moins ce que nous disons à notre responsable lorsqu'il nous demande pourquoi rien ne semble jamais finalisé : « Mais chef, les quêtes sans fin prennent du temps »). Et, pour cette raison, nous sommes heureux de recevoir votre question. Il y a quelque temps, nous avons répondu à une question similaire et expliqué comment supprimer les noms en double dans un fichier texte. La solution que nous avions trouvée était assez simple et fonctionnait bien, mais nous n'étions pas convaincus qu'il s'agissait de la meilleure solution. Aujourd'hui, grâce à votre question, nous avons une nouvelle occasion de nous pencher sur le problème. À vous de juger si cette solution est meilleure/plus rapide/plus simple que celle que nous avions proposée auparavant.

Pour commencer, nous supposons que vous avez un fichier texte dans lequel chaque ligne correspond à un enregistrement distinct. Bien que cela soit peu probable, votre fichier peut ressembler à ceci :

              This is one of the lines in the text file.
              This is one of the lines in the text file.
              This is another line in the text file.
              This is one of the lines in the text file.
              This is yet another line in the text file.
              This is another line in the text file.
              This is another line in the text file.
              This is one of the lines in the text file.
            

Vous recherchez un script capable de supprimer les lignes en double et donner un résultat similaire à celui-ci :

              This is one of the lines in the text file.
              This is another line in the text file.
              This is yet another line in the text file.
            

SW, vous avez frappé à la bonne porte :

              Const adOpenStatic = 3
              Const adLockOptimistic = 3
              Const adCmdText = &H0001

              Set objConnection = CreateObject("ADODB.Connection")
              Set objRecordSet = CreateObject("ADODB.Recordset")

              strPathToTextFile = "C:\Scripts\"
              strFile = "Test.txt"

              objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
              "Data Source=" & strPathtoTextFile & ";" & _
              "Extended Properties=""text;HDR=NO;FMT=Delimited"""

              objRecordSet.Open "Select DISTINCT * FROM " & strFile, _
              objConnection, adOpenStatic, adLockOptimistic, adCmdText

              Do Until objRecordSet.EOF
              Wscript.Echo objRecordSet.Fields.Item(0).Value
              objRecordSet.MoveNext
              Loop
            

Nous trouvons ce script assez intéressant car nous utilisons ici des objets ADO (ActiveX Data Object) et nous traitons ce fichier texte comme s'il s'agissait d'une base de données. Nous n'allons pas passer trop de temps à expliquer comment traiter un fichier texte comme s'il s'agissait d'une base de données, mais si vous voulez en savoir plus, consultez la rubrique Scripting Clinic qui traite de ce sujet en détail. Pour l'instant, contentons-nous de dire que nous travaillons avec le fichier texte C:\Scripts\Test.txt et attribuons les valeurs appropriées aux variables strPathToTextFile et strFile :

              strPathToTextFile = "C:\Scripts\"
              strFile = "Test.txt"
            

Comment cela nous aide-t-il à éliminer les lignes en double ? En fait, il existe un type de requête de base de données appelé Select DISTINCT qui vous permet de sélectionner tous les enregistrements distincts (ou uniques) d'une table. Supposons que vous ayez une base de données simple, avec les entrées suivantes :

              Red
              Red
              Blue
              Red
            

Si vous utilisez une requête Select DISTINCT, vous allez obtenir un jeu d'enregistrements constitué exclusivement d'enregistrements uniques :

              Red
              Blue
            

Vous vous dites certainement : « Récupérer les enregistrements uniques revient plus ou moins à supprimer les enregistrements en double. » Et nous sommes prêts à l'admettre - Mais, attendez : vous avez entièrement raison. Notre fichier texte est construit comme une table de base de données, chaque ligne du fichier texte représentant un seul champ d'un seul enregistrement. Si nous exécutons une requête Select DISTINCT sur ce fichier texte, nous récupérerons exclusivement les lignes uniques. En fait, nous obtiendrons un jeu d'enregistrements similaire à ceci :

              This is one of the lines in the text file.
              This is another line in the text file.
              This is yet another line in the text file.
            

Et c'est exactement les données que nous voulions obtenir. Merci de nous l'avoir fait remarquer !

Après avoir extrait notre jeu d'enregistrements, nous utilisons ce code pour reproduire les lignes uniques à l'écran :

              Do Until objRecordset.EOF
              Wscript.Echo objRecordset.Fields.Item(0).Value
              objRecordset.MoveNext
              Loop
            

Si nous l'avions voulu, nous aurions pu utiliser l'objet FileSystemObject pour ouvrir le fichier texte et remplacer le contenu existant par les seules lignes uniques, ce qui aurait eu pour effet de supprimer toutes les lignes dupliquées du fichier texte. (Ce serait si simple de pouvoir utiliser une requête de type Update mais, en ce qui concerne les fichiers texte, ADO est en lecture seule.)

Est-ce notre dernier mot à propos de la suppression d'éléments en double (noms ou ligne entières) d'un fichier texte ? Qui sait ? Après tout, les quêtes sans fin prennent du temps ! (En réalité, nous avons vu qu'elles prenaient entre deux et trois jours. Passé ce délai, l'ennui nous gagne et nous passons à autre chose.)

Pour en savoir plus

Consultez la rubrique Hey, Scripting Guy! - Archive