Поиск данных из файла1 в файле2

У меня есть два CSV-файла с одинаковой структурой.

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

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

Мне нужно проверить данные из файла1 в файле2 (данные из файла1 из столбца [6]).

Я хотел бы использовать Python для этого. Я попытался:

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

Но как я могу проверить эти данные одну за другой в file2.csv и, если они есть, распечатать их, если их нет, выполнить другую операцию?

2
задан 3 December 2017 в 11:20

2 ответа

Для тех, кто нашел этот вопрос и предпочитает решение bash. Следующий скрипт предоставляет ту же функциональность в меньшем количестве строк.

Хотя, вероятно, существует более эффективный в вычислительном отношении метод. Это был мой быстрый способ получить выходные данные из grep "$i" "$DRC", не удосуживаясь выполнить какие-либо команды дважды. Если вывод grep "$i" "$DRC" не нужен. if grep -q "$i" "$DRC" будет служить тестом.

#!/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
1
ответ дан 3 December 2017 в 11:20

Вы даже не должны были бы использовать csv.reader() для того, чтобы сделать это. Вот пример (работающий в python 3.6), как сделать это без, просто с помощью встроенных функций Python и sys библиотека для парсинга командной строки. Таким образом, вот пример один без csv библиотека, позволяет, называют его 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)

Но если Вы настаиваете на том, чтобы использовать csv библиотека здесь является примером (работающий в python 3.6) два выполнения его с csv.reader(), давайте назовем его 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)

Конечно, Вам нужны к chmod оба файла для разрешения выполнения:

chmod 755 search_basic.py
chmod 755 search_csv.py

Данный Ваш выше file1 и file2, оба производят тот же вывод со строкой ./search_basic.py file1 file2 (или соответствующий ./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
1
ответ дан 3 December 2017 в 11:20

Другие вопросы по тегам:

Похожие вопросы: