Страница 1 из 1

Сравнение значений в столбцах

Добавлено: 25 мар 2013, 15:17
Pavel
Доброго времени суток!

Засыпался вот на такой задачке. Имеем таблицу атрибутов с двумя полями и значениями в них:

|_id_|_vid_|
|_2__|____|
|_3__|____|
|_5__|_2__|
|_10_|_19_|
|_13_|____|
|_19_|____|
|_21_|_2__|

В поле vid значения соответсвуют значениям в id. То есть vid "ссылается" на колонку id.
Нужно найти сторки, на которые есть "ссылка" и поставить в колонку result какой-либо идентификатор соответствия (пусть будет "1").
В итоге должно получится так:
|_id_|_vid_|_result_|
|_2__|____|___1___|
|_3__|____|_______|
|_5__|_2__|___1___|
|_10_|_19_|___1___|
|_13_|____|_______|
|_19_|____|___1___|
|_21_|_2__|___1___|

Пытался сделать на питоне. Но получалось, что он сравнивал только строки.
Как такое можно реализовать?

Re: Сравнение значений в столбцах

Добавлено: 25 мар 2013, 15:50
Александр Мурый
На всякий случай вариант на <awk>:

Код: Выделить всё

awk '{if($2 is notnull) $3 = 1; print $1,$2,$3}' table.txt

Re: Сравнение значений в столбцах

Добавлено: 25 мар 2013, 16:07
Pavel
Да, только в таком случае, он ставит единички там, где vid<>0. А еще бы поставить единичку напротив id, на который ссылается vid. То есть, если vid = 19, то result для id = 10 и для id = 19 равно 1.

Re: Сравнение значений в столбцах

Добавлено: 25 мар 2013, 18:37
trir
sql access

Код: Выделить всё

UPDATE test1 SET result=1
where Not (test1.vid=IsNull([test1]![vid]))

Re: Сравнение значений в столбцах

Добавлено: 26 мар 2013, 17:52
Александр Мурый
Что-то типа того:

Код: Выделить всё


import csv

list1 = []
list2 = []
list3 = []

with open('table.txt', 'rb') as f:
reader = csv.reader(f, delimiter = ' ')
for row in reader:
if row:
col1 = row[0]
col2 = row[-1]
list1.append(col1)
list2.append(col2)
else:
pass

common = [x for x in list1 if x in list2]

with open('table.txt', 'rb') as f:
reader = csv.reader(f, delimiter = ' ')
for rows in reader:
col3 = [1 for i in common if i in rows]
list3.append(' '.join(map(str,col3[:1])))

length = len(list1)

result = open('result.txt', 'wb')
output = csv.writer(result, delimiter = '\t')

for i in range(0,length):
row = list1, list2, list3
output.writerow(row)

result.close()


На выходе:

Код: Выделить всё

2     1
3   		
5   2 1
10 19 1
13  
19    1
21  2 1
Правда, с "delimiter = ' '" (пробел) плохо работает на выходе, нужно ставить либо запятую (','), либо табуляцию ('\t').

Re: Сравнение значений в столбцах

Добавлено: 27 мар 2013, 12:54
Pavel
Хоршее решение. Даже очень хорошее!
Пытался все это дело провернуть в Pyculator, но он все-равно упорно сравнивает по строкам... Может я чего-то не допонимаю... Или все-таки структуры массивов отличаются от того, берем ли обычный файл или таблицу атрибутов?
Чтобы не быть голословным, что пытался сделать:

Код: Выделить всё

list3 = []
row = [[ <id> ], [<vid>]]
col1 = row[0]
col2 = row[-1]
a = [x for x in col1 if x in col2]
col3 = [1 for i in a if i in row]
list3.append(' '.join(map(str,col3[:1])))

value = list3
Хотя, я так подозреваю, что можно обойтись и без первых трех строк, просто записать их как

Код: Выделить всё

col1 = [id]
col2 = [vid]
В общем, что-то я в конец запутался...