2013-07-09 2 views
1

Я пытаюсь найти все строки в определенном столбце в файле csv, чтобы увидеть, содержат ли они строку в другом файле csv. Если они содержат эту строку, я хочу записать соответствующее значение в другой конкретный столбец.Запись значения в столбце csv на основе другого значения в другом csv

Например file1:

Search Value,Location 
UK,United Kingdom 
United Kingdom,United Kingdom 
United States,United States 
Hong Kong,Hong Kong 
Florida,"Florida, United States" 

и file2:

Name,Default,Geo Location 
DRE UK,, 
Production United States,, 
Development Hong Kong,, 
United Kingdom Sales,, 
Florida Marketing,, 

Я хочу, чтобы найти строки, в которых имя из file2 содержит строку из Полезность поиска в file1 затем записать соответствующее значение из Местоположение в файле1 для Geo Location в файле2. Таким образом, результат таков:

Name,Default,Geo Location 
DRE UK,,United Kingdom 
Production United States,,United States 
Development Hong Kong,,Hong Kong 
United Kingdom Sales,,United Kingdom 
Florida Marketing,,"Florida, United States" 

Я искал ответ, и я наткнулся на loop through rows of one csv file to find corresponding data in another. Я основал код, основанный на этом, но я не знаю, правильно ли это, и я застрял.

import csv 

file1reader = csv.reader(open('file1.csv','rb')) 
file2reader = csv.reader(open('file2.csv','rb')) 
writer=csv.writer(open('file3.csv','wb')) 

header1 = file1reader.next() #header 
header2 = file2reader.next() #header 


for Search Value, Location in file1reader: 
    for Name, Default, Geo Location in file2reader: 
     if Search Value in Name: # found it 

Представленные данные являются примером того, что я хочу сделать. Фактические файлы будут довольно большими, поэтому имейте это в виду.

Любая помощь приветствуется.

EDIT

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

Пример если file2 был, как это вместо того, чтобы и я хотел, не являющиеся согласующие линии включены также:

Name,Default,Geo Location 
DRE UK,, 
Production United States,, 
Development Hong Kong,, 
United Kingdom Sales,, 
Florida Marketing,, 
Stuff,,Somewhere 
More Stuff,, 
+0

Отсортированы ли ваши файлы? Ответ, который вы основываете на своем коде, предполагает, что оба файла сортируются одним и тем же ключом. Это необходимо для того, чтобы подход был эффективным! – llb

ответ

1

Вот простой пример использования DictReader и DictWriter классы:

from csv import DictReader, DictWriter 

with open('file1.csv') as fin1,\ 
    open('file2.csv') as fin2,\ 
    open('file3.csv', 'wb') as fout: 

    reader1 = DictReader(fin1) 
    reader2 = DictReader(fin2) 

    writer = DictWriter(fout, fieldnames=reader2.fieldnames) 
    writer.writeheader() 

    for line2 in reader2: 
     outline = dict(line2) 
     fin1.seek(0) # resets the reader1 iterator 
     for line1 in reader1: 
      if line1['Search Value'] in line2['Name']: 
       outline['Geo Location'] = line1['Location'] 
     writer.writerow(outline) 

Сложность этого алгоритма O (п), так, как @maged указывает, оно не очень эффективно.

+0

Спасибо! Это работало очень хорошо. – CircuitB0T

+0

Как включить строки из файла file2.csv, которые также не имеют строки из имени в поле «Значение поиска»? Как если бы были другие строки, которые не соответствовали поиску, и я хочу, чтобы они включали, как они находятся в файле3.csv? Я попытался изменить это, чтобы сделать это, и все прошло не так хорошо. – CircuitB0T

+0

Я буду редактировать где-то в оригинальном посте, что я имею в виду. – CircuitB0T

0

Ваше решение является правильным.

Другим решением было бы загрузить файл в память, в структуру хеш-таблицы/словаря, чтобы повысить производительность (избегайте O (n^2)). Но поскольку вы работаете с большими файлами, и вы не делаете точное совпадение, это сделает это решение менее идеальным.

Вы также можете попробовать загрузить файлы в структуру хеш-таблицы и записать их в файл, чтобы избежать ошибок памяти (аналогично поисковому индексу). Это кажется излишним, что вы хотите сделать.

+0

Но, как мне закончить код и написать Location to Geo Location для соответствия строк? – CircuitB0T

+0

Предполагая, что вы пишете его в файле3: writer.writerow [name, '', Search_Value] – maged

+0

Имейте это в каждом цикле со значениями в случае, если Search_Value не найден. Также напишите заголовок писателю в начале – maged

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