Procurando por dados do arquivo1 no arquivo2

3

Eu tenho dois arquivos csv com a mesma estrutura.

arquivo1.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

arquivo2.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

Eu preciso verificar os dados do arquivo1 no arquivo2 (dados do arquivo1 da coluna [6]).

Eu gostaria de usar o Python para fazer isso. Eu tentei:

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

Mas como eu posso verificar esses dados um por um em file2.csv e se os dados presentes - imprimi-lo, se ausente fornecer outra operação?

    
por Oleksii 29.11.2017 / 16:08

2 respostas

2

Você nem precisaria usar csv.reader() para fazer isso. Aqui está um exemplo (trabalhando em python 3.6) como fazê-lo sem, apenas usando as funções internas do python e a biblioteca sys para analisar a linha de comando. Então, aqui está um exemplo sem a biblioteca csv , vamos chamá-lo de 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)

Mas se você insistir em usar a biblioteca csv , veja o exemplo (trabalhando em python 3.6) fazendo isso com csv.reader() , vamos chamá-lo de 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)

É claro que você precisa chmodar os dois arquivos para permitir a execução:

chmod 755 search_basic.py
chmod 755 search_csv.py

Dados seusfile1 e file2 acima, ambos produzem a mesma saída com a linha ./search_basic.py file1 file2 (ou respectivo ./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
    
por Videonauth 01.12.2017 / 11:04
1

Para quem encontra essa pergunta e prefere uma solução bash. O script a seguir fornece a mesma funcionalidade em menos linhas.

Embora seja provável que haja um método computacionalmente mais eficiente. Este foi o meu método rápido para pegar a saída de grep "$i" "$DRC" sem me preocupar em executar nenhum comando duas vezes. Se a saída de grep "$i" "$DRC" não for desejada. if grep -q "$i" "$DRC" servirá como teste.

#!/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
    
por J. Starnes 03.12.2017 / 05:04