ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: hellikawhi2

[求助] 百万条数据,提取唯一值

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-9-14 17:56 | 显示全部楼层
https://club.excelhome.net/thread-1598993-1-1.html

看看这个贴子 百万级也是秒秒钟的事情     ado+sql

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-9-15 08:32 | 显示全部楼层
wodewan 发表于 2021-9-14 17:09
xll格式的插件,分32位,64位,包括单元格写入时间,时间在5秒左右。方法如下图:

牛哇牛哇,感谢大佬

TA的精华主题

TA的得分主题

发表于 2021-9-15 10:49 | 显示全部楼层
本帖最后由 wodewan 于 2021-9-15 12:53 编辑
hellikawhi2 发表于 2021-9-15 08:32
牛哇牛哇,感谢大佬

语言用的是C#+Excel的xll插件的方式,方法是延时计算。计算代码其实没几句的,去重求差集,Linq里现成的轮子,就是数据量大点,EXCEL读写和类型转换麻烦点。
如果强类型,估计真和上面的朋友说的,百万数据秒秒钟的事情。

更新了下:
1. 增加了并集,合集
2. 结果数如果超过1048576,自动分列写入
3. 加个进度条
4. 增加一些操作提示,避免未选择数据导致程序错误
5. 整体速度应该更快

修正一下:多列数量显示错误



1.gif

Test.rar

404.98 KB, 下载次数: 26

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-9-15 12:11 | 显示全部楼层
不要 sql ,vba 使用sql 有bug

大量数据不适用. 用数组
排序后再操作.

TA的精华主题

TA的得分主题

发表于 2021-9-15 12:12 | 显示全部楼层
hmlstfqtl 发表于 2021-9-14 17:56
https://club.excelhome.net/thread-1598993-1-1.html

看看这个贴子 百万级也是秒秒钟的事情     ado+sq ...

vba excel 超过6万5 好像就 失效了.

TA的精华主题

TA的得分主题

发表于 2021-9-15 13:14 | 显示全部楼层
a.jpg


'19楼附件。去重后结果数:961166,升序输出

'总用时8s左右,对不对就不知道了,自己可以比较一下

Option Explicit

Sub test()
  Dim i As Long, m As Long, flag(1) As Boolean, cnt As Long
  Dim arr(1 To 3 * 2 ^ 20, 1 To 2), t As Single
  t = Timer
  Call getvalue(arr, "a", m, 1)
  Call getvalue(arr, "b", m, 1)
  Call getvalue(arr, "d", m, 2)
  Call qsort(arr, 1, m, 1, 2, 1)
  For i = 1 To m
    If arr(i, 2) = 1 Then flag(0) = True Else flag(1) = True
    If arr(i, 1) <> arr(i + 1, 1) Then
      If flag(0) And flag(1) = False Then cnt = cnt + 1: arr(cnt, 1) = arr(i, 1)
      flag(0) = False: flag(1) = False
    End If
  Next
  Debug.Print Timer - t, m, cnt
  With [f:f]
    .ClearContents
    If cnt > 2 ^ 20 Then MsgBox cnt: Exit Sub
    If cnt > 0 Then .Resize(cnt) = arr
  End With
  Debug.Print Timer - t, m, cnt
End Sub

Function getvalue(brr, s, m, n)
  Dim arr, i As Long
  arr = Range(s & "2:" & s & Cells(Rows.Count, s).End(xlUp).Row).Value
  For i = 1 To UBound(arr, 1)
    m = m + 1
    brr(m, 1) = arr(i, 1): brr(m, 2) = n
  Next
End Function

Function qsort(arr, first, last, left, right, key)
  Dim i As Long, j As Long, k As Long, x, t
  i = first: j = last: x = arr((first + last) \ 2, key)
  While i <= j
    While arr(i, key) < x: i = i + 1: Wend
    While x < arr(j, key): j = j - 1: Wend
    If i <= j Then
      For k = left To right
        t = arr(i, k): arr(i, k) = arr(j, k): arr(j, k) = t
      Next
      i = i + 1: j = j - 1
    End If
  Wend
  If first < j Then qsort arr, first, j, left, right, key
  If i < last Then qsort arr, i, last, left, right, key
End Function


评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-9-15 13:19 来自手机 | 显示全部楼层
hellikawhi2 发表于 2021-9-14 14:38
测试测试测试测试测试测试测试测试测试测试

attach database 'bigdata.db' as 'big';create table bigdata2 as with aa as(select 数据1 from bigdata union select 数据2 from bigdata) select 数据1 from aa where 数据1 not in (select 数据3 from bigdata)


attach database 'bigdata.db' as 'big';select 数据1 from bigdata union select 数据2 from bigdata) select 数据1 from aa where 数据1 not in (select 数据3 from bigdata) limit 100

6秒左右

如果在一列而不是二列应该更快。
Screenshot_2021-09-15-13-14-59-178_com.chrome.dev.jpg
Screenshot_2021-09-15-13-15-25-466_com.chrome.dev.jpg
Screenshot_2021-09-15-13-17-24-356_com.chrome.dev.jpg

TA的精华主题

TA的得分主题

发表于 2021-9-15 14:24 来自手机 | 显示全部楼层
zpy2 发表于 2021-9-15 13:19
attach database 'bigdata.db' as 'big';create table bigdata2 as with aa as(select 数据1 from bigdat ...

重后结果数:961167,

导入了数据有个空行。。。
Screenshot_2021-09-15-14-20-29-384_com.chrome.dev.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-9-15 15:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一把小刀闯天下 发表于 2021-9-15 13:14
'19楼附件。去重后结果数:961166,升序输出

'总用时8s左右,对不对就不知道了,自己可以比较一下
...

感谢感谢,我去试试

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-9-15 15:47 | 显示全部楼层
zpy2 发表于 2021-9-15 13:19
attach database 'bigdata.db' as 'big';create table bigdata2 as with aa as(select 数据1 from bigdat ...

感谢感谢,新手看不懂,看着像是sql,
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-3-29 05:04 , Processed in 0.054305 second(s), 13 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表