2 votes

Recherche de données du fichier 1 dans le fichier 2

J'ai deux fichiers csv avec la même structure.

fichier1.csv :

352075|6505286781|6505286781|165|A|2.6.37-3.2|25353gb1FAa8
172238|8136090512|8136090512|1|A|2.6.37-3.2|255411429E02
105767|1783707658|1783707658|82|A|2.6.37-3.2|375g1043DC92
352092|2214612065|2214612065|22|A|2.6.37-3.2|07k9975cad1e

fichier2.csv :

274451|24575|24575|3872531727|23|24575|2017-11-08 11:43:21.15|2017-11-25 16:30:21.061|STB|375g1043DC92|375g1043DC92
506406|280335|280335|4516157218|22|280335|2017-11-22 15:44:54.307|2017-11-29 11:26:02.123|STB|256d9739d3cc|256d9739d3cc
367536|163226|163226|5007632889|9|163226|2017-11-15 20:37:02.034|2017-11-28 20:55:24.891|STB|25353gb1FAa8|25353gb1FAa8
374253|254874|254874|9263432532|23|254874|2017-11-16 19:17:52.827|2017-11-28 19:25:23.805|STB|37fe9739b5a0|37fe9739b5a0

Je dois vérifier les données du fichier 1 dans le fichier 2 (données du fichier 1 de la colonne [6]).

J'aimerais utiliser Python pour ce faire. J'ai essayé :

import csv
with open('file1.csv', newline='') as csvfile:
  list1 = csv.reader(csvfile, delimiter='|')
  for row in list1:
    print(row[6])

Mais comment puis-je vérifier ces données une par une dans le fichier file2.csv et si les données sont présentes - les imprimer, si elles sont absentes, fournir une autre opération ?

1voto

Videonauth Points 31896

Vous n'auriez même pas besoin d'utiliser csv.reader() pour avoir fait cela. Voici un exemple (en Python 3.6) de la façon de le faire sans, en utilisant simplement les fonctions intégrées de Python et la fonction sys bibliothèque pour l'analyse de la ligne de commande. Voici donc l'exemple 1 sans le csv appelons-la search_basic.py :

#!/usr/bin/env python3.6

from sys import argv

def parse_files(name_1, name_2):
    """Opens two files and checks if pos #6 in each row of file 1 is present in file2 via simple build-ins"""
    try:
        with open(file=name_1) as file_1, open(file=name_2) as file_2:
                data_1 = file_1.readlines()
                data_2 = file_2.readlines()
                mapping = {
                    row.strip('\n').split('|')[-1]: row.strip('\n').split('|')
                    for row in data_2
                }
                for row in data_1:
                    last_column = row.strip('\n').split('|')[-1]
                    if last_column in mapping:
                        print(f'{last_column} found in {mapping[last_column]}')
                    else:
                        print(f'{last_column} not found, doing other operation')
    except FileNotFoundError as error:
        print('{}'.format(error))
        exit(1)
    else:
        return

if __name__ == "__main__":
    if len(argv) <= 1:
        print('No parameters given...')
        exit(1)
    elif len(argv) == 2:
        print('Only one file was given...')
        exit(1)
    else:
        parse_files(argv[1], argv[2])
        exit(0)

Mais si vous insistez pour utiliser le csv Voici un exemple de bibliothèque (fonctionnant avec Python 3.6) qui permet de le faire à l'aide de csv.reader() appelons-le search_csv.py :

#!/usr/bin/env python3.6

import csv
from sys import argv

def parse_files(name_1, name_2):
    """Opens two files and checks if pos #6 in each row of file 1 is present in file2 via simple build-ins"""
    try:
        with open(file=name_1) as file_1, open(file=name_2) as file_2:
            mapping = {
                row[-1]: row
                for row in csv.reader(file_2, delimiter='|')
            }

            for row in csv.reader(file_1, delimiter='|'):
                last_column = row[-1]
                if last_column in mapping:
                    print(f'{last_column} found in {mapping[last_column]}')
                else:
                    print(f'{last_column} not found, doing other operation')
    except FileNotFoundError as error:
        print('{}'.format(error))
        exit(1)
    else:
        return

if __name__ == "__main__":
    if len(argv) <= 1:
        print('No parameters given...')
        exit(1)
    elif len(argv) == 2:
        print('Only one file was given...')
        exit(1)
    else:
        parse_files(argv[1], argv[2])
        exit(0)

Bien sûr, vous devez donner un chmod aux deux fichiers pour permettre leur exécution :

chmod 755 search_basic.py
chmod 755 search_csv.py

Compte tenu de ce qui précède file1 y file2 les deux produisent la même sortie avec la ligne ./search_basic.py file1 file2 (ou respectivement ./search_csv.py file1 file2 ) :

25353gb1FAa8 found in ['367536', '163226', '163226', '5007632889', '9', '163226', '2017-11-15 20:37:02.034', '2017-11-28 20:55:24.891', 'STB', '25353gb1FAa8', '25353gb1FAa8']
255411429E02 not found, doing other operation
375g1043DC92 found in ['274451', '24575', '24575', '3872531727', '23', '24575', '2017-11-08 11:43:21.15', '2017-11-25 16:30:21.061', 'STB', '375g1043DC92', '375g1043DC92']
07k9975cad1e not found, doing other operation

1voto

J. Starnes Points 1879

Pour ceux qui trouvent cette question et préfèrent une solution bash. Le script suivant fournit la même fonctionnalité en moins de lignes.

Bien qu'il existe probablement une méthode plus efficace sur le plan informatique. C'était ma méthode rapide pour récupérer la sortie de grep "$i" "$DRC" sans prendre la peine d'exécuter deux fois les commandes. Si la sortie de grep "$i" "$DRC" n'est pas souhaité. if grep -q "$i" "$DRC" servira de test.

#!/bin/bash
SRC=/path/to/file1.csv
DRC=/path/to/file2.csv

for i in $(cut -d "|" -f 7 "$SRC")
    do
    LINE="$(grep "$i" "$DRC")"
    if [ $? == 0 ]
        then
            echo "$i Found in $LINE"
        else
            echo "$i NOT Found"
        fi
    done

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X