2015-04-26 2 views
-2

у меня есть два файла CSV, содержащие следующие строки заголовка:Найти соответствующие столбцы между двумя CSV файлов

  • файл 1:

    Product invoice,product verification,product not completed,product completed 
    
  • Файл 2:

    Product invoice,product completed 
    

Мне нужно найти общие столбцы:

Product invoice,product completed 

Обратите внимание, что столбцы должны отображаться в том же порядке как в файлах1, так и в файле2.

+0

Пожалуйста, помогите мне @unutbu – abd

+0

вы можете добавить ввод образца? –

+0

выше пример, у меня есть два файла строк, разделенных запятой, и они находятся в определенном порядке. – abd

ответ

0

Вы

list1 = ["Product invoice", "product verification", "product completed"] 
list2 = ["Product invoice", "product completed"] 

И хочу сравнить, если элементы list2 в list1, верно? Так

def compare(list1, list2): 
    list3 = [] 
    for elem in list1: 
     if elem in list2: 
      list3.append(elem) 
    return list3==list2 

Алгоритм состоит в создании List3 с элементами из list1, которые находятся в list2, а затем сравнивая, если результирующий список равен list2.

Это будет только True, если они находятся в том же порядке. Также учтите, что «Продукт завершен» отличается от «продукта завершен», поэтому вы можете захотеть, чтобы все строки были опущены (через str.lower()).

+0

Если между обычными строками находится несколько элементов, то как мы можем это сделать @ Rafael Cardoso? – abd

+0

Все элементы, которые не представлены в обоих списках, будут удалены, поэтому 1 или 10 элементов между ними не имеют значения. – RafaelC

+0

Это не сработает, если в списке 1 содержатся «Счет продукта», «проверка продукта», проверка продукта », проверка продукта "," продукт завершен " – abd

1

Сделать набор строк из каждой row[0] и row[2] в file1 форматирования, как именно он будет появляться в file2 перебирать не file2 увидеть, если появится строка в наборе:

import csv 
with open(file1) as f1, open(file2) as f2: 
    # skip headers 
    next(f1),next(f2) 
    r1 = csv.reader(f1) 
    # make set of strings matching format of file2 
    st = set("{},{}".format(row[0], row[2]) for row in r1) 
    # iterate over every line in file2 
    # and check if the line appears in the set 
    for line in f2: 
     if line.rstrip() in st: 
      print(line) 

File1:

Product invoice,product verification,product completed 
foo,1,2 
bar,3,4 
foo,foo,bar 

File2:

Product invoice,product completed 
foo,2 
bar,4 
foobar,foo 
bar,bar 

Выход:

foo,2 
bar,4 

Если вы хотите, чтобы данные в списках:

import csv 
with open(file1) as f1, open(file2) as f2: 
    r1 = csv.reader(f1) 
    r2 = csv.reader(f2) 
    st = set((row[0], row[2]) for row in r1) 
    for row in r2: 
     if tuple(row) in st: 
      print(row) 
['Product invoice', 'product completed'] 
['foo', '2'] 
['bar', '4'] 
+0

Этот код работает, когда между общими строками находится несколько строк @Padraic Cunningham – abd

+0

@abd, этот код делает именно то, что вы задали –

+0

В выводе Накладной продукта, продукт должен быть представлен @ Padraic Cunningham – abd

Смежные вопросы