精易论坛

标题: 取文本行数 取200M文本不到半秒 支持忽略空行 [打印本页]

作者: 福仔    时间: 2022-3-30 14:24
标题: 取文本行数 取200M文本不到半秒 支持忽略空行
本帖最后由 福仔 于 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;
}


作者: a019872140    时间: 2022-3-30 14:25
线程会挂掉不??????????
作者: 福仔    时间: 2022-3-30 14:34
a019872140 发表于 2022-3-30 14:25
线程会挂掉不??????????

试试就知道了
作者: xjshuaishuai    时间: 2022-3-30 14:48
谢谢分享!
作者: gaoqing    时间: 2022-3-30 18:09
谢谢分享
作者: zytlj    时间: 2022-3-30 18:36
谢谢分享。
作者: 1347379245    时间: 2022-3-30 19:25
谢谢分享
作者: zhl624220482    时间: 2022-3-30 19:44
下载收藏了
作者: sinewtec    时间: 2022-3-30 19:48
感谢分享,很给力!~
作者: reveriexue    时间: 2022-3-30 20:48

作者: 杨明煜    时间: 2022-3-30 21:06
学习看看..!....
作者: 一C    时间: 2022-3-30 21:19
支持大佬   
作者: 7ian    时间: 2022-3-31 09:36
removeEmptyLine=真时最后一行为空没有清掉
作者: 超级の赛亚人    时间: 2022-3-31 09:58
https://125.confly.eu.org/thread-14352531-1-1.html

作者: 嫂子    时间: 2022-3-31 16:46
本帖最后由 嫂子 于 2022-3-31 16:51 编辑

投机取巧的办法  因为已经载入内存了。且这个方法是最普通的办法  速度并不快
文件如果超大 就不行了。

应该把文件读写加进去  这样才可以应对文件大小的不固定。且要用缓冲区分块读取文件

作者: 瓶中仙子    时间: 2022-3-31 17:08
嫂子 发表于 2022-3-31 16:46
投机取巧的办法  因为已经载入内存了。且这个方法是最普通的办法  速度并不快
文件如果超大 就不行了。

大神,你放一个出来吧
作者: 吃干饭的锅    时间: 2022-3-31 17:53
感谢楼主分享
作者: 嫂子    时间: 2022-3-31 18:45
瓶中仙子 发表于 2022-3-31 17:08
大神,你放一个出来吧

放啥?
这东西有没有啥实际意义的。
你会有取几百M 文本行数的需求?
作者: 嫂子    时间: 2022-3-31 18:56
瓶中仙子 发表于 2022-3-31 17:08
大神,你放一个出来吧
  
子程序名返回值类型公开备 注
Ker1整数型 
参数名类 型参考可空数组备 注
data字节集
变量名类 型静态数组备 注
num整数型 
len整数型 
i整数型 
len = 取字节集长度 (data)
计次循环首 (len, i)
如果真 (data [i] = 10)
num = num + 1

计次循环尾 ()
返回 (num)


普通核心库的办法 差距也没多少  200M  汇编 391ms  这个函数530ms

作者: 瓶中仙子    时间: 2022-4-1 01:55
嫂子 发表于 2022-3-31 18:45
放啥?
这东西有没有啥实际意义的。
你会有取几百M 文本行数的需求?

你说的是事实,一般是没有这个需求的,只是想看看方法是怎么处理的。
作者: 嫂子    时间: 2022-4-2 00:17
瓶中仙子 发表于 2022-4-1 01:55
你说的是事实,一般是没有这个需求的,只是想看看方法是怎么处理的。

方法 无非就是 遍历字节 没其他特殊方法的。
作者: lzbkunming    时间: 2022-4-4 11:34
还复杂了
作者: cqcc    时间: 2022-4-10 08:26
学习才能进步
作者: yangdoudou    时间: 2022-4-11 17:55
哥,你这写得好
作者: 懒癌晚期患者    时间: 2022-4-27 15:38
支持开源
作者: 53770zhang    时间: 2022-4-27 16:05
支持支持 很有用
作者: hitlerfrank    时间: 2022-4-27 17:07
支持开源~!感谢分享
作者: 紫色风铃    时间: 2022-4-27 23:23
本帖最后由 紫色风铃 于 2022-4-27 23:30 编辑

爬 c++汇编 可看这个 https://blog.csdn.net/zyhse/article/details/106604570

作者: chen123cj    时间: 2022-4-28 21:38
牛逼,从你的头像就看出来了
作者: 易友软件    时间: 2022-4-30 20:12
顶~顶~列健康~
作者: jinky2022    时间: 2022-6-2 01:01
厉害了大神
作者: fjgh    时间: 2022-6-13 17:43

作者: 梦境吖    时间: 2022-6-27 20:22
碉堡了
作者: chencong5025    时间: 2022-7-6 11:00
读入内存了就没啥意义了
作者: 长安啊    时间: 2023-2-2 21:47
666666666666666666666
作者: SHIWOOOO    时间: 2024-2-29 09:16
好好好好
作者: xmtian    时间: 2024-2-29 10:07
感谢分享。
作者: Pan先森°    时间: 2024-4-3 03:55
66666666666666
作者: hbqjb    时间: 2025-3-13 15:51
感谢无私奉献!
作者: 805400753    时间: 2025-3-13 18:19
支持开源
作者: tonc    时间: 2025-3-13 19:25
哇,处理200M文本不到半秒,这速度也太惊人了吧!忽略空行的功能也很实用呢。福仔大神果然厉害啊!
作者: eklove    时间: 2025-3-13 19:25
哇,处理200M文本不到半秒,这速度也太惊人了吧!支持忽略空行这个功能也很贴心呢。福仔大神果然厉害啊。




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4