12
votes

Script pour trouver des doublons dans un fichier CSV

J'ai un fichier CSV de 40 Mo avec 50 000 enregistrements. C'est une liste de produits géants. Chaque rangée a près de 20 champs. [Article #, UPC, DESC, etc.]

Comment puis-je,

a) Trouvez et imprimez des lignes en double. [Ce fichier est un grand fichier ajouté. J'ai donc plusieurs en-têtes inclus dans le fichier que je dois supprimer, de sorte que je voulais connaître des lignes exactes qui sont en double en premier.]

B) Trouvez et imprimez des lignes en double en fonction de la colonne. [Voir si une UPC est affectée à plusieurs produits]

J'ai besoin d'exécuter la commande ou le script sur le serveur et j'ai installé Perl et Python. Même Bash Script ou Command fonctionnera aussi pour moi.

Je n'ai pas besoin de préserver l'ordre des rangées. etc

J'ai essayé,

trier grandfile.csv | UNIQ -D

Pour obtenir les duplicats, mais je ne reçois pas la réponse attendue.

Idéalement, j'aimerais Bash Script ou commander, mais si quelqu'un a une autre suggestion, ce serait trop grand aussi.

merci


voir: Supprimer des lignes en double d'un gros fichier en python sur le débordement de pile


2 commentaires

Pourquoi n'est-il pas UNIQ -D vous donnant la réponse attendue?


Vous devez afficher des données d'échantillon (désinfectées si nécessaire), y compris ce que vous considérez comme des duplicats et des non-duplicats. Spécifiquement, si le premier champ (article n °) est différent, mais le deuxième champ (UPC) est identique ou si l'enregistrement entier est le même, etc. Vous devez également être plus précis sur ce que "je ne reçois pas la réponse attendue " moyens. UniQ ne regarde que toute la ligne, à moins que vous ne le disiez de sauter une partie de la ligne (mais cela n'utilise pas de virgules comme séparateurs de champs). De plus, les fichiers CSV peuvent être difficiles à traiter à moins que vous utilisiez des outils effectués à cet effet (par exemple, Python Lib).


5 Réponses :


2
votes

Vous pouvez éventuellement utiliser SQLITE Shell pour importer votre fichier CSV et créer des index pour effectuer des commandes SQL plus rapidement.


0 commentaires

12
votes

Recherchez et imprimez des lignes en double en Perl:

perl -F/,/ -ane 'print if $SEEN{$F[4]}++' < input-file


2 commentaires

Il convient de noter que ce dernier fonctionne si et uniquement si les données CSV ne contiennent jamais de séparateur cité 1,2, "3,3", 4 .


@MOB: Il semble que, pour tout groupe de lignes en double, la dernière ligne n'est pas imprimée avec cet exemple.



0
votes

Pour la deuxième partie: lisez le fichier avec du texte :: CSV dans un hachage à clé de votre (s) clé (s) unique (s), vérifiez si une valeur existe pour le hachage avant de l'ajouter. Quelque chose comme ceci:

données (à ne pas nécessiter de trier), dans cet exemple, nous avons besoin que les deux premières colonnes soient uniques: xxx

code: xxx

qui imprime quelque chose comme ceci: xxx


0 commentaires

12
votes

Essayez ce qui suit:

# Sort before using the uniq command
sort largefile.csv | sort | uniq -d


2 commentaires

Vous avez deux fois genre.


J'ai également essayé la version Perl ici et est plus rapide que celle-ci, du moins à Ubuntu Shell sur Windows 10. Mais les deux travaillent bien



1
votes

Ici mon script (très simple) pour le faire avec Ruby & Rake Gem.

Créez d'abord A RakeFile EM> et écrivez ce code: P>

$ rake csv:double["2017.04.07-Export.csv",1] 
File contains duplicates


0 commentaires