2010-10-15 5 views
2

J'ai une liste de 50 000 ID dans un fichier plat et devez supprimer tous les ID en double. Existe-t-il un algorithme efficace/recommandé pour mon problème?Supprimer les ID en double?

Merci.

+1

Probablement pas la solution la plus rapide, mais je me suis souvenu de array_unique. Placez-les tous dans un tableau (1 id par élément), utilisez array_unique et écrivez-les dans le fichier. Quelque chose contre ce faisant? –

+0

sont-ils séparés par des sauts de ligne? (\ n)? – Hannes

+0

Oui, ils sont séparés par des sauts de ligne. –

Répondre

2

J'ai fait quelques expériences une fois et la solution la plus rapide que j'ai pu obtenir en PHP était de trier les éléments et de supprimer manuellement tous les éléments en double.

Si la performance est pas vraiment un problème pour vous (que je soupçonne, 50 000 est pas tant que ça) que vous pouvez utiliser array_unique(): http://php.net/array_unique

+0

J'ai couru ceci et il l'a complété dans environ une seconde. Je pensais que ça prendrait plus de temps. Merci. –

+0

@Jamie: L'E/S compliquera probablement le traitement, car la génération d'un ensemble unique aura une complexité algorithmique maximale de n log n, qui est assez rapide, et la plupart des E/S du disque sont très lentes. –

3

Lire dans un dictionnaire ligne par ligne, en supprimant les doublons. Lorsque tout est lu, écrivez dans un nouveau fichier.

0

je suppose que si vous avez l'allocation de mémoire suffisamment grande, vous pouvez mettre tous ces ids dans le tableau

$array[$id] = $id; 

ceci automatiquement les mauvaises herbes dupes.

0

Vous pouvez faire:

file_put_contents($file,implode("\n",array_unique(file($file))); 

Comment ça marche?

  • Lire le fichier en utilisant la fonction file qui retourne un tableau.
  • Débarrassez-vous des lignes en double à l'aide array_unique
  • imploser ces lignes uniques avec « \ n » pour obtenir une chaîne
  • écrire la chaîne dans le fichier en utilisant file_put_contents

Cette solution suppose que vous avez un ID par ligne dans le fichier plat.

0

Si vous pouvez utiliser un terminal (ou l'exécution native unix) , le plus simple: (en supposant qu'il n'y a rien d'autre dans le fichier):

sort < ids.txt | uniq > filteredIds.txt

+0

uniq ne fonctionnera que si les identifiants sont consécutifs et les doublons sont les uns à côté des autres. – thetaiko

+0

Bon point; Je pensais que uniq auto-triait: 'sort filteredIDS.txt' – zebediah49

4

Vous pouvez utiliser le programme en ligne de commande sort pour commander et filtrer la liste des ids. C'est un programme très efficace et évolue bien aussi.

sort -u ids.txt > filteredIds.txt 
0

Vous pouvez le faire via réseau/array_unique, dans cet exemple, je suppose que vos identifiants sont séparés par BRAKS de ligne, si c'est pas le cas juste changer

$file = file_get_contents('/path/to/file.txt'); 
$array = explode("\n",$file); 
$array = array_unique($array); 
$file = implode("\n",$array); 
file_put_contents('/path/to/file.txt',$file); 
+0

Merci pour la réponse complète. J'ai choisi une réponse avant de voir celle-ci. –

+0

@Jamie Redmond ne le transpire pas :) – Hannes

0

Si vous pouvez simplement exploser la contenu du fichier sur une virgule (ou un délimiteur), alors array_unique produira le code le moins (et le plus propre), sinon si vous analysez le fichier avec le $ array [$ id] = $ id est la solution la plus rapide et la plus propre .

Questions connexes