À intervalles réguliers, nous recevons des fichiers CSV provenant d'une source externe sur laquelle nous avons peu de contrôle. Ces fichiers sont des ensembles complets d'enregistrements en cours; cependant, tous les enregistrements qui ont été supprimés depuis le précédent ne sont pas présents. Nous aimerions comparer les deux fichiers et créer un fichier distinct d'enregistrements supprimés afin que nous puissions effectuer un traitement supplémentaire sur eux. Dans une application dans un autre domaine, nous avons un paquet de tri commercial (CoSort) qui le fait hors de la boîte; Cependant, nous n'y avons pas accès ici. Les volumes ne sont cependant pas très importants, et il semble que ce soit quelque chose que les outils standards ou gratuits puissent gérer assez facilement. Idéalement, cela prendrait la forme d'un fichier de commandes Windows, mais les solutions Perl ou awk seraient également acceptables. Exemple les fichiers d'entrée:Sous Windows, comment comparer deux fichiers et ne renvoyer que les enregistrements manquants dans le second fichier qui étaient initialement présents dans le premier fichier?
Fichier précédent:
X_KEY,X_NAME,X_ATTRIBUTE
123,Name 123,ATT X
111,Name 111,ATT X
777,Name 777,ATT Y
fichier entrant:
X_KEY,X_NAME,X_ATTRIBUTE
777,Name 777,ATT Y
123,Name 123,ATT CHANGED
résultant fichier doit être au minimum:
111,Name 111
Mais si les attributs de la suppression les enregistrements viennent aussi, c'est bien.
Jusqu'à présent, je dispose d'un fichier batch qui utilise CMSort freeware pour trier les deux fichiers moins l'en-tête pour le rendre plus facile pour un certain type de processus diff:
REM Sort Previous File, Skip Header
C:\Software\CMSort\cmsort.exe /H=1 x_previous.txt x_previous_sorted.txt
REM Sort Incoming File, Skip Header
G:\Software\CMSort\cmsort.exe /H=1 x_incoming.txt x_incoming_sorted.txt
Mais le « comparer et montrer que la les enregistrements manquants du premier fichier 'm'échappent. Une partie de la complexité est que de nombreux attributs peuvent changer parmi les enregistrements qui restent, donc ce n'est pas un diff pur. Cependant, cela ressemble à une commande de diff spécialisée - celle qui se limite à vérifier uniquement le champ de la clé, pas l'ensemble de l'enregistrement. Cependant, je n'arrive pas à avoir la syntaxe correcte. Des idées? Le nombre d'enregistrements ne doit pas dépasser 50 000 enregistrements.
Remarque: Si c'était SQL et que les données étaient dans des tables, nous pourrions utiliser le EXCEPT operator mais le déplacement des données vers la base de données dans ce cas n'est pas une option.
puisque vous mentionnez diff, il est intéressant de noter que diffutils est disponible pour windows : http: //gnuwin32.sourc eforge.net/packages/diffutils.htm – si28719e