有人可以指导我(如果有简单快速的查询或一些快速代码)转换我的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,
我有一个包含1000000条记录的表,就像你看到的这7条记录(在真实的数据库a,b,c,。。。是字符串中的单词),记录1和2在g和c值以及2,3和1,3和。。。
如果记录至少有两个公共值,如记录1&2,3,4(但记录5,6,7没有至少两个与其他记录共享的值),我希望同步这些记录,并生成如下列表:
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与记录2相同,现在1没有r和q,因此我们必须有1 a c z f g+q和r,记录2没有a,z和f,因此我们必须有:2 g q r c+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}
它非常快(因为我认为使用了一个Map文件),但是它只找到公共值。
1条答案
按热度按时间0yycz8jy1#
如果您想使用sql解决方案,那么可以将csv数据放入一个规范化的表中,并按照id和word展开数据。
一旦你有了它,它就变成了一个自动加入表格的问题。把单词按字母顺序连在一起。
SQLFIDLE测试
不过,不确定这种方法在一个有1000k条记录的表上的速度有多快。
但这是一个有趣的难题。
样本数据:
带数字的理货台:
展开文字:
结果表:
结果:
额外的
为了标记已添加的单词,填充结果表的查询变得有点复杂。
结果:
这里还有其他的实验