2014-04-04 3 views
2

У меня есть большой файл .csv с этим форматом:Loop через файлы .csv с условиями в разных столбцах

«Строка 1», «Строка 2», «Строка 3», «Строка 4» , «Строка 5», «Строка 6» и т. Д.

Я заинтересован в извлечении информации из столбца при условии, что он связан со следующим.

Чтобы дать более ясный пример, предположим, что столбцы 3 и 4 сформированы командами, и они представляют, кого они размещают (col 3 - это местная команда).

"Первый", "Результат", "Филадельфия", "Майами" и т.д.
"Второй", "Результат", "Даллас", "Кливленд" и т.д.
"Третий", "Результат" "Майами", "Кливленд" и т.д.
"Четвертый", "Результат", "Кливленд", "Майами" и т.д.
"Пятый", "Результат", "Даллас", "Филадельфия", и т.д.
«6», «Результат», «Кливленд», «Даллас» и т. Д.
«Седьмой», «Результат», «Майами», «Филадельфия» и т. Д.
«Восьмой», «Результат», «Филадельфия», «Майами» и т. Д.
«Девятый», «Результат», «Кливленд», «Майами» и т.д.

И я хочу, чтобы получить список, состоящий из команд, они хозяевах, без повторения

Cleveland hosts 
Dallas 
Miami 

Dallas hosts 
Cleveland 
Philadelphia 

Miami hosts 
Cleveland 
Philadelphia 

Philadelphia hosts 
Miami 

После этого я Я бы хотел написать в файле все строки, касающиеся обоих шаблонов, это, если бы я хотел видеть совпадения между Кливлендом и Майами, я хотел бы иметь .csv, как это,

«Третий», «Результат», «Майами», «Кливленд» и т. Д.
«Четвертый», «Результат», «Кливленд», «Майами» и т. Д.
«Девятый», «Результат», «Кливленд», «Майами» и т.д.

С помощью следующего кода, мне удалось прочитать один столбец и сохранить все уникальные элементы в словаре, так что я могу выбрать слово оттуда позже. Я мог бы сделать то же самое с номером столбца 4 и повторять код, изменив значение параметра Wanted_Column 3

import csv 
from collections import Counter, defaultdict, OrderedDict 

Var = 1 
Wanted_Column = 2 # Col I want to analyze 

with open('file.csv', "rb") as inputfile: 
    data = csv.reader(inputfile) 
    seen = defaultdict(set) 

    countd = Counter(
     row[Wanted_Column] 
     for row in data 
     if row[Wanted_Column] and row[Wanted_Column] not in seen[row[Var]] and not seen[row[Var]].add(row[Wanted_Column]) 
    ) 

y = OrderedDict(sorted(countd.items(), key = lambda t: t[0])) 

for line in y: 
    print line 

В результате,

Cleveland 
Dallas 
Miami 
Philadelphia 

Итак, мой вопрос, что я должен добавить, чтобы иметь двойное условие и показывать элементы так, как я показал?

После этого, чтобы писать строки в другой файл, я получил этот код,

look_for = set([ELEMENT IN DICTIONARY]) 

with open('file.csv','rb') as inf, open('output_file.csv','wb') as outf: 
    incsv = csv.reader(inf, delimiter=',') 
    outcsv = csv.writer(outf, delimiter=',') 

    outcsv.writerows(row for row in incsv if row[Wanted_column] in look_for) 

И только с одним элементом он работает хорошо, но, конечно же, как и предыдущее условие не определена, я не знаю, что я должен изменить, чтобы получить результат, который я хочу.

ответ

1

Вы можете использовать словарь наборов для отслеживания хостинговых команд и уникальных команд для посещения. Вот пример.

import csv 

# load the csv file 
rows = [r for r in csv.reader(file('sample.csv','r'))] 

# order preservation list 
preserve_order = [] 

# track the schedule from the hosting team's point of view 
hosting_teams = {} 

# change the wanted column here 
wanted_column = 3 

for row in rows: 
    # strip out the double quotes 
    row = [c.replace('"','') for c in row] 

    the_host = row[2] 
    the_order = row[0] 

    preserve_order.append(the_order) 

    # create a dictionary with a unique set of visiting teams 
    host_schedule = hosting_teams.setdefault(the_host,set([])) 

    # add the team visit 
    visiting_team = row[wanted_column] 
    host_schedule.add((visiting_team,the_order)) 



output = [] 
for hosting_team,host_schedule in hosting_teams.items(): 
    for visiting_team,the_order in host_schedule: 
     output.append([the_order,"Result",hosting_team,visiting_team])  

output.sort(key=lambda x:preserve_order.index(x[0])) 

csv.writer(file('output.csv','wb')).writerows(output)  
+0

Спасибо за помощь, проблема в том, что если я это сделаю, то .csv является глобальным (все совпадения появляются) и сортируются случайным образом, это игра 9 могут появиться перед игрой 4, несмотря на то, что оба игрока были сыграны в Клелланде, а Майами была принимающей командой, и я также увижу матчи, которые играют Филадельфия и Даллас. Если я не ошибаюсь, ваш код будет писать .csv со всеми строками, собранными вторым столбцом. Это работает, но на самом деле это не решает мою проблему. Во-первых, как я мог использовать OrderedDict с двумя аргументами, отсортированными по первому из них, а во-вторых, как бы я написал только один из «двойных паттернов» в .csv? –

+0

Я добавил код, чтобы держать игры в порядке. – Genome

2

Не могли бы вы просто использовать словарь наборов?

f = open('test.csv') 
hosts = {} 

#read 
for line in f: 
    line = line.replace('"', '') 
    res = line.split(',') 

    if not hosts.get(res[2]): 
     hosts[res[2]] = set([]) 

    hosts.get(res[2]).add(res[3]) 

#print 
for key in sorted(hosts.keys()): 
    print 'HOST', key 
    for guest in sorted(list(hosts[key])): 
     print 'GUEST', guest 

print hosts 

Тогда окончательная печать будет просто перекручивание через hosts ключи и печати содержимого набора.

И если число столбцов не известно фронт, но вы знаете, что идет host, guest то его просто вопрос, имеющий внутреннюю петлю, которая пересекает всю строку, начиная с позиции 2.

добавил последнюю строку для показа отсортированной печати. Единственное различие между входами в этом скрипте и вашей - это удалить столбец .etc и предположить, что вход останавливается там. Расширение этого должно быть тривиальным

+0

спасибо. На самом деле я не думал об этом, я посмотрю на это. Из моего последнего фрагмента кода, части для записи, что мне нужно изменить в последней строке? –

+0

смотрите пример выше. Он также сортируется для вас. Просто измените свой скрипт, чтобы следовать шаблонам в моем. – nsfyn55

+0

просто измените выражения 'print' на записи файлов с помощью правил форматирования – nsfyn55

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