Кто-нибудь может подсказать мне (может быть, простой и быстрый запрос, если есть, или какой-то быстрый код), чтобы преобразовать мой файл данных CSV (с разделением запятыми):
1,A,C,Z,F,G
2,G,Q,R,C,
3,Z,G,Q,
4,C,F,
5,O,P,
6,O,X,Y,J,
7,A,P,X,
У меня есть эта таблица с ~ 1 000 000 записей
как эти 7 записей, которые вы видите (в реальной базе данных A, B, C, ... являются словами в строке), записи 1 и 2 являются общими для значений G и C, а также 2,3 и 1,3 и ...
Я хочу синхронизировать записи, если они имеют как минимум два общих значения, таких как записи 1 и 2,3,4 (но записи 5,6,7 не имеют по крайней мере 2 общих значения с другими), и создать такой список :
1 A C Z F G Q R
2 G Q R C A Z F
3 Z G Q A C F R
4 C F A Z G Q R
5 O P
6 O X Y J
7 A P X
в конце мы должны иметь 4 одинаковые записи, если мы сортируем данные, и еще одну без синхронизации:
1 A C F G Q R Z
2 A C F G Q R Z
3 A C F G Q R Z
4 A C F G Q R Z
5 O P
6 J O X Y
7 A P X
Может быть, я не использую хороший термин для моего значения, см .:
1 A C Z F G
2 G Q R C
запись 1 имеет C и G, общие с Record 2, теперь 1 не имеет R и Q, поэтому у нас должно быть 1 ACZFG + Q и R, а у Record 2 нет A, Z и F, таким образом, мы должны иметь: 2 GQRC + A, Z и F, таким образом, в конце мы имеем:
1 A C Z F G Q R
2 G Q R C A Z F
Мне нужны все записи соответственно в очереди сверху вниз.
написал код Delphi, но это так медленно.
Кто-то предложил мне этот отличный код:
def f=[:]
new File('Data.csv').readLines().each{
def items=it.split(',')
def name
items.eachWithIndex { String entry, int i ->
if(i==0){
name=entry
}
else if(entry){
if(!f[entry])
f[entry]=[]
f[entry]<<name
}
}
}
f.findAll {it.value.size()>1}
Это очень быстро (из-за использования файла карты, я думаю), но находит только общие значения.