请教如何检索文本内容中重复的关键字

yalan 2020-02-21 11:25:54
文本格式如下,每行一条登录退出信息,首列为账号:
123abc|2019-10-22|登录|2019-10-23|退出
223cbc|2019-10-22|登录|2019-10-24|退出
323xbc|2019-10-23|登录|2019-10-23|退出
123abc|2019-10-24|登录|2019-10-26|退出

想要筛选出这个文件中账号相同的信息,即只保留
123abc|2019-10-22|登录|2019-10-23|退出
123abc|2019-10-24|登录|2019-10-26|退出

其实就是想要统计这个文件中账号登录的次数大于一次的

文件大小为40G,数十亿行。。。。导入数据库处理也不现实,求教高手
...全文
1164 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
于小九 2020-03-01
  • 打赏
  • 举报
回复
引用 3 楼 yalan的回复:
[quote=引用 1 楼 于小九 的回复:]
虽然没解决,还是感谢您的热心帮助[/quote] php直接处理这么大的文件是不太现实,不过我近期的话我这边有帮你留意这个问题,在同事那边注意到linux系统中的grep命令,处理你那边的大文件效率不知道怎么样。这几天想回复找不到你的帖子,如果你的服务器是linux系统的话可以试试看,因为我这边没有这么大的数据文件可以测试,不知道对你的大文件效率会怎么样,然后就是因为直接调用的服务器命令行,所以安全方面可能得你自己再进一步的去加强,我这边只是把大概的逻辑写一下
<?php
$username = '123abc';
exec('cat log.txt | grep "' . escapeshellcmd($username) . '|"', $output);
//这里可以看到我们查询的结果均以数组的形式返回了
var_dump($output);
yalan 2020-03-01
  • 打赏
  • 举报
回复
引用 1 楼 于小九 的回复:
虽然没解决,还是感谢您的热心帮助
于小九 2020-02-22
  • 打赏
  • 举报
回复
你这文件太大了,直接一次性读取的话不太现实,而且数十亿行的数据处理起来真的太久了,特别每个用户查询的时候都要读取一次,内存消耗也会很大,可以考虑一下直接把储存文件全部处理到数据库中会方便许多,这里提供一下简单的格式化方式:
<?php
//以只读方式打开一个文件
$handle = fopen('ceshi.txt',"r");
//函数检测是否已到达文件末尾
while(!feof($handle)){ 
    //从文件指针中读取一行
    if($content = fgets($handle)){
        //分割行内容
        $arr = explode('|', $content);
        //整合每个用户的操作信息
        $result[$arr[0]][] = array($arr[1] => $arr[2], $arr[3] => $arr[4]);
        //这里你可以加其他的操作,例如储存到 Redis Mysql等便于管理的数据库中,否则的话每次需要查询单个用户的日志却跑了整个文件效率真的蛮低的
        //处理完成移除对象
        unset($content, $arr);
    };
}
//释放文件
fclose($handle);
//输出所有用户日志
//var_dump($result);
//输出某个用户日志
var_dump($result['123abc']);
yalan 2020-02-22
  • 打赏
  • 举报
回复
感谢楼上分享心得哈,看来对php这种语言来说真不容易处理这么大的数据啊 如果真不方便处理,我试试python或java是否处理能快点 我本来是想把文件当成数据库来操作,可是没接触过这方面的东西唉

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧