卑微民警在线求助使用 Python 的 excel 数据分析

2020-08-20 23:46:19 +08:00
 fishspecial

在邻市的乡镇派出所基层锻炼期间,手上有一个关于侵犯公民个人信息的案子,取证出来的数据大概有 19k 左右个 excel 文件,要对其进行清洗去重得出有多少条个人信息(按 excel 行数计),但是导出的文件名、excel 行列都没有统一格式。但是只有 sheet1 有数据,并且需要统计其中的手机号的条数就可以。最主要的是要对最后的结果进行去重,一个手机号出现多次也只能算一次。
太久没用 py,粗略的拉稀代码跑跑了一下,最后结果有一亿多条,这是在对文件去重(因为是从后台拖出来的数据,有的时候一个文件保存了多次,通过 md5 去重了)情况下得出来的。但是没有对手机号来进行总的去重。条数涉及证据严谨和对犯人的量刑,本来所里是打算一个半月发动全所之力来复制粘贴的,我心里觉得这真的是对警力资源的浪费。现在想来求助大家给点小民警可以 ctrl c/v 的代码来尽量解决这个问题。
//没有钱。可能仅有的好处就是有点打击黑产的光荣感? 有 v 友对体制和公考感兴趣的,也可在下面留言,我也会知无不言。
谢谢大家!

9923 次点击
所在节点    问与答
109 条回复
PublicUser
2020-08-20 23:53:31 +08:00
我觉得你申请一下办公经费,找个外包更靠谱
dji38838c
2020-08-20 23:57:42 +08:00
上面说的没错,一个人干一个人的活,不要想着把所有人的工作都做了
EscYezi
2020-08-20 23:59:48 +08:00
提一个比较简单粗暴的方法,遍历每一个文件每一行每一个单元格,然后把所有 1 开头的字符串提取出来,去重后再过滤掉含有非数字字符的字符串,最后统计个数。
calmzhu
2020-08-21 00:06:02 +08:00
支持民警
不算复杂的需求,我应该可以做。

但是需求有点不清楚 。
意思是 19000 个 excel(可能有重复),然后从每个 excel 的 sheet1 中提取出电话号码并去重计算次数吗?

有个问题。第二张图里面。一行看有多个电话号码的。这种是算一个记录还是每个不重复的算一个。
hankai17
2020-08-21 00:06:11 +08:00
手机号正则匹配
fishspecial
2020-08-21 00:08:05 +08:00
@PublicUser 乡镇派出所不可能有这个经费的,我现在加班的夜宵都是自己掏钱。
fishspecial
2020-08-21 00:08:36 +08:00
@dji38838c 到时候我也逃不脱的哈哈哈,觉得做这个事情很蠢。
ys0290
2020-08-21 00:08:54 +08:00
妄加揣摩一下,成了以后这种事都得你搞,不成就得顶得住压力。外包吧……
calmzhu
2020-08-21 00:09:28 +08:00
然后我记得 excel 好像是类似 xml 的标记文本格式。
如果需求跟上面我说的匹配,直接把 excel 当文本,然后用正则把所有电话号码过滤出来,再去重
fishspecial
2020-08-21 00:15:17 +08:00
@calmzhu 谢谢你的回答! 19000 左右的 excel 中,因为被多次保存,有些 excel 是一模一样的数据,我就通过计算 excel 的行数来保证没有相同行数的 excel (相同行数的数据不同的 excel 这种情况忽略不计)达成去重的目的。因为不管哪个 excel 文件,每一行数据都会包含手机号,也就是手机号的条数就是 excel 的行数,但是这样就会导致,假如一个手机号在多个文件里出现就引起重复计算,所以的确没想好怎么提取 19000 个 excel 的所有手机号来进行总的去重。一假如可以不花太多功夫,一行中有多个手机号的每个不重复的算一个,但假如太麻烦那就统共算一条吧。毕竟数据量太大了,平均一个文件都有 10000 行左右。
fishspecial
2020-08-21 00:17:30 +08:00
@ys0290 我过几个月估计就调回去了。不过这不是在公司跟资本家做事,打击犯罪分子的话,做起来肯定是会当自己的事情去处理的,毕竟也的确是自己的工作任务。(当然自己技术实在有限哈哈哈)
fishspecial
2020-08-21 00:20:24 +08:00
@calmzhu 我怕出 memoryerror,而且这么长时间没接触代码了,数据结构和算法都忘的一干二净。今天写了一个很简单的 demo 对相同文件进行去重后,统计所有 excel 的行数,最后算来有一亿多条,这还是跑到 14000 千个文件左右就爆出 memoryerror 的情况之下。实在是数据量太大了。现在就想有 v2 能帮助下,有大概的代码改改我就可以解决问题就好。
calmzhu
2020-08-21 00:21:38 +08:00
@calmzhu 看过了,直接打开乱码。看来不是直接的文本了。。
fishspecial
2020-08-21 00:21:45 +08:00
@EscYezi 应该是爆内存了...可能优化之后能行?我技术实在太菜了 /无奈
fishspecial
2020-08-21 00:22:48 +08:00
@calmzhu 是的,txt 转为 excel 文件是可行的,但是 excel 无法直接转成文本格式
binux
2020-08-21 00:27:14 +08:00
分两步
1. 提取出电话,一行一个输出 txt 。直接单元格正则就 OK 了。
2. sort -u
waytoshine
2020-08-21 00:28:52 +08:00
很好解决的问题啊,最笨的办法,你不是说内存会爆,你就把所有 Excel 多分几堆,一堆放一个文件夹,然后 Python 肯定有操作 Excel 文件的库啊,用那个库,把所有的 Excel 的文字提取出来放在 txt 里,放 txt 的时候用逗号或者分号分隔,然后再用正则去匹配手机号,然后插入数据库里,完事处理完所有 Excel 的数据之后,再用 Python 操作数据库,把正则匹配到的手机号插入数据库一个表,然后 select distinct phonenumer from telephone,整个流程都不需要什么高深的技术,就很顺其自然的要这么做
manhere
2020-08-21 00:33:15 +08:00
没必要去重,以行数计就行。
clrss
2020-08-21 00:34:05 +08:00
库么听说过 xlwing, 没实际用过.
fishspecial
2020-08-21 00:40:38 +08:00
@waytoshine 谢谢指点!过程我能理解,但是代码上还是觉得困难了点…唉

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/700095

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX