开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6097|回复: 42
打印 上一主题 下一主题
收起左侧

[易源码分享] 取文本行数 取200M文本不到半秒 支持忽略空行

[复制链接]

结帖率:100% (9/9)
跳转到指定楼层
楼主
发表于 2022-3-30 14:24:08 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式   广西壮族自治区崇左市
分享源码
界面截图: -
是否带模块: -
备注说明: -
本帖最后由 福仔 于 2022-3-30 14:26 编辑



  
窗口程序集名保 留  保 留备 注
程序集1   
子程序名返回值类型公开备 注
_启动子程序整数型 请在本子程序中放置动态链接库初始化代码
测试 ()  ' 在初始化代码执行完毕后调用测试代码
返回 (0)  ' 返回值被忽略。
子程序名返回值类型公开备 注
测试  
变量名类 型静态数组备 注
文件路径文本型 
文件号整数型 
行数整数型 
空行数整数型 
i整数型 
文本字节集 
文本长度整数型 
文本指针整数型 
计时整数型 
获取到的行数_去除空行整数型 
获取到的行数_保留空行整数型 
输出文本文本型 
文件路径 = 取运行目录 ()“\测试文本.txt”
如果真 ()  ' 如果已经生成了文件, 那这里可以改成假, 生成文件耗时很大, 又懒得用c函数来弄
文件号 = 打开文件 (文件路径, #重写, #无限制 )
置随机数种子 ()
行数 = 1000000  ' 随机100万行以上的行数, 生成的文本大概有200M
行数 = 取随机数 (行数, 行数 + 32767)
计次循环首 (行数, i)
如果真 (取随机数 (1, 100) = 1)  ' 随机加入空行
空行数 = 空行数 + 1
写出文本 (文件号, #换行符 )

判断 (行数 = i)
写出文本 (文件号, 到文本 (i)“-”取随机字母 (取随机数 (100, 300)))  ' 每行随机100-300个字符
写文本行 (文件号, 到文本 (i)“-”取随机字母 (取随机数 (100, 300)))  ' 每行随机100-300个字符

计次循环尾 ()
关闭文件 (文件号)

文本 = 读入文件 (文件路径)
文本长度 = 取字节集长度 (文本)
计时 = 取启动时间 ()
文本指针 = 取指针_字节集型 (文本)
获取到的行数_去除空行 = 取文本行数 (文本指针, )
获取到的行数_保留空行 = 取文本行数 (文本指针, )
计时 = 取启动时间 () - 计时
输出文本 = “生成的行数 = ”到文本 (行数)“, 空行数 = ”到文本 (空行数)“, 总行数 = ”到文本 (行数 + 空行数)#换行符
输出文本 = 输出文本 + “生成的文本一共 ”到文本 (文本长度)“ 个字节, ”到文本 (四舍五入 (文本长度 ÷ 1024, 2)) + “KB, ”
输出文本 = 输出文本 + 到文本 (四舍五入 (文本长度 ÷ 1024 ÷ 1024, )) + “MB”#换行符#换行符
输出文本 = 输出文本 + “获取到的行数_去除空行 = ”到文本 (获取到的行数_去除空行)“, 获取到的行数_保留空行 = ”到文本 (获取到的行数_保留空行)
输出文本 = 输出文本 + #换行符“执行两次一共耗时 ”到文本 (计时)“ 毫秒”
输出调试文本 (输出文本)
信息框 (输出文本, 0, , )
子程序名返回值类型公开备 注
取文本行数整数型 
参数名类 型参考可空数组备 注
str整数型
removeEmptyLine逻辑型是否删除空行, 为真空行不记录
' 85, 139, 236, push ebp     mov ebp, esp, 这几行易语言的子程序已经自带了
置入代码 ({ 131, 236, 12, 139, 69, 8, 137, 69, 252, 131, 125, 252, 0, 116, 19, 185, 1, 0, 0, 0, 107, 209, 0, 139, 69, 252, 15, 190, 12, 16, 133, 201, 117, 7, 51, 192, 233, 180, 0, 0, 0, 199, 69, 248, 1, 0, 0, 0, 15, 182, 85, 12, 133, 210, 116, 29, 139, 69, 252, 15, 190, 8, 131, 249, 13, 116, 11, 139, 85, 252, 15, 190, 2, 131, 248, 10, 117, 7, 199, 69, 248, 0, 0, 0, 0, 139, 77, 252, 15, 190, 17, 133, 210, 116, 123, 139, 69, 252, 137, 69, 244, 139, 77, 252, 131, 193, 1, 137, 77, 252, 139, 85, 244, 15, 190, 2, 131, 248, 13, 116, 11, 139, 77, 244, 15, 190, 17, 131, 250, 10, 117, 81, 139, 69, 244, 15, 190, 8, 131, 249, 13, 117, 20, 139, 85, 252, 15, 190, 2, 131, 248, 10, 117, 9, 139, 77, 252, 131, 193, 1, 137, 77, 252, 15, 182, 85, 12, 133, 210, 116, 33, 139, 69, 252, 15, 190, 8, 131, 249, 13, 116, 11, 139, 85, 252, 15, 190, 2, 131, 248, 10, 117, 11, 139, 77, 252, 131, 193, 1, 137, 77, 252, 235, 215, 139, 85, 248, 131, 194, 1, 137, 85, 248, 233, 123, 255, 255, 255, 139, 69, 248, 139, 229, 93, 194, 8, 0 })
返回 (0)  ' 编译他也是执行这段机器码, 不编译也是执行这一段机器码, 所以, 调试和编译没什么区别, 有区别的话看是生成文本有区别了
子程序名返回值类型公开备 注
取指针_字节集型整数型 取到的是变量堆地址,和 取变量数据地址() 一样
参数名类 型参考可空数组备 注
字节集字节集
置入代码 ({ 139, 69, 8, 139, 0, 133, 192, 15, 132, 3, 0, 0, 0, 131, 192, 8, 201, 194, 4, 0 })
返回 (0)
子程序名返回值类型公开备 注
取随机字母文本型 取随机26个字母
参数名类 型参考可空数组备 注
要取的字符数整数型要取字符个数
变量名类 型静态数组备 注
bin字节集 
i整数型 
bin = 取空白字节集 (要取的字符数)
计次循环首 (要取的字符数, i)
bin [i]取随机数 (97, 122)
计次循环尾 ()
返回 (到文本 (bin))



上面取文本行数的那一段机器码是下面这段c++代码编译后的机器码
这里就不贴汇编了, 贴汇编哪有贴源码舒服, 是吧
[C++] 纯文本查看 复制代码
// 取文本行数
// ptr = 文本指针, \0结尾
// removeEmptyLine = 删除空行, 为真则忽略空行
int GetTextLineCount(LPCSTR pStr, bool removeEmptyLine)
{
    LPCSTR ptr = pStr;
    if ( !ptr || !ptr[0] ) return 0;
    int count = 1;  // 文本有值, 那不管有没有换行, 最少有一行
    if ( removeEmptyLine && ( *ptr == '\r' || *ptr == '\n' ) )
        count = 0;  // 如果第一行是空行, 且是清除空行, 那就初始行数为0
    while ( *ptr )
    {
        const char& ch = *ptr++;
        if ( ch == '\r' || ch == '\n' )
        {
            // \r\n 指针指向\n后面
            if ( ch == '\r' && *ptr == '\n' )
                ++ptr;
            while ( removeEmptyLine && ( *ptr == '\r' || *ptr == '\n' ) )
                ++ptr;  // 空行的话, 换行后面就是 '\r' 或者 '\n', 这些连着的都清除

            ++count;
        }
    }
    return count;
}

点评

老当益壮,宁移白首之心   北京市北京市  发表于 2022-4-18 23:37

评分

参与人数 10好评 +10 精币 +11 收起 理由
钟白 + 1 + 2 我愿称之为最快的男人!!
fjgh + 1 + 2 支持开源~!感谢分享
懒癌晚期患者 + 1 + 2 支持开源~!感谢分享
subing + 1 支持开源~!感谢分享
wuqingg + 1 大佬出品,必出精品。我还在用你的进程守护呢
超级の赛亚人 + 1 + 1 支持开源~!感谢分享
熬夜 + 1 + 2 支持开源~!感谢分享
reveriexue + 1 支持开源~!感谢分享
1301ok + 1 感谢分享,很给力!~
廿六 + 1 + 2 支持开源~!感谢分享

查看全部评分


本帖被以下淘专辑推荐:

签到天数: 23 天

42
发表于 2025-3-13 19:25:57 | 只看该作者   山东省青岛市
哇,处理200M文本不到半秒,这速度也太惊人了吧!支持忽略空行这个功能也很贴心呢。福仔大神果然厉害啊。
回复 支持 反对

使用道具 举报

签到天数: 23 天

41
发表于 2025-3-13 19:25:06 | 只看该作者   山东省青岛市
哇,处理200M文本不到半秒,这速度也太惊人了吧!忽略空行的功能也很实用呢。福仔大神果然厉害啊!
回复 支持 反对

使用道具 举报

结帖率:81% (17/21)

签到天数: 7 天

40
发表于 2025-3-13 18:19:53 | 只看该作者   广东省江门市
支持开源
回复 支持 反对

使用道具 举报

签到天数: 7 天

39
发表于 2025-3-13 15:51:17 | 只看该作者   湖北省襄阳市
感谢无私奉献!
回复 支持 反对

使用道具 举报

38
发表于 2024-4-3 03:55:50 | 只看该作者   福建省泉州市
66666666666666
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 14 天

37
发表于 2024-2-29 10:07:08 | 只看该作者   河北省石家庄市
感谢分享。
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
36
发表于 2024-2-29 09:16:42 | 只看该作者   广东省广州市
好好好好
回复 支持 反对

使用道具 举报

签到天数: 6 天

35
发表于 2023-2-2 21:47:06 | 只看该作者   广东省茂名市
666666666666666666666
回复 支持 反对

使用道具 举报

结帖率:14% (1/7)
34
发表于 2022-7-6 11:00:40 | 只看该作者   浙江省金华市
读入内存了就没啥意义了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:[email protected]
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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