开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 901|回复: 8
收起左侧

[已解决] 如何取大文本的行数

 关闭 [复制链接]

结帖率:88% (43/49)
发表于 2022-3-22 20:24:37 | 显示全部楼层 |阅读模式   山东省烟台市
12精币
比如一个20MB的txt文本,可能有1千万行文本。
有什么好的办法快速取不?

最佳答案

查看完整内容

取文本指针, 循环逐个字节判断, 直到\0为止 遇到 \r 就继续判断后面是不是\n, 然后行数+1 c++代码 [mw_shl_code=cpp,true]// ptr = 文本指针, \0结尾 // removeEmptyLine = 删除空行, 为真则忽略空行 int dadsa(LPCSTR pStr, bool removeEmptyLine) { LPCSTR ptr = pStr; if (!ptr || !ptr[0]) return 0; int count = 1; // 文本有值, 那不管有没有换行, 最少有一行 if (removeEmptyLine && ( *ptr == '\r' || * ...

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳

本帖被以下淘专辑推荐:

结帖率:88% (43/49)

签到天数: 5 天

 楼主| 发表于 2022-3-22 20:26:53 | 显示全部楼层   山东省烟台市
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
变量名类 型静态数组备 注
文本文本型 
t整数型 
a整数型 
b整数型 
c整数型 
文本字节集字节集 
文本 = 取重复文本 (1000, #换行符 )
t = 取启动时间 ()
计次循环首 (1000000, )
a = 文本_取行数1 (文本)
计次循环尾 ()
t = 取启动时间 () - t
调试输出 (a, t)
t = 取启动时间 ()
计次循环首 (1000000, )
b = 文本_取行数2 (文本)
计次循环尾 ()
t = 取启动时间 () - t
调试输出 (b, t)
文本字节集 = 到字节集 (文本)
t = 取启动时间 ()
计次循环首 (1000000, )
c = 汇编_取文本行数 (文本字节集)
计次循环尾 ()
t = 取启动时间 () - t
调试输出 (b, t)
t = 取启动时间 ()
计次循环首 (1000000, )
c = 取文本行数 (文本)
计次循环尾 ()
t = 取启动时间 () - t
调试输出 (c, t)
子程序名返回值类型公开备 注
取文本行数整数型 
参数名类 型参考可空数组备 注
文本文本型
置入代码 ({ 252, 51, 201, 87, 139, 125, 8, 139, 63, 131, 255, 0, 116, 37, 184, 0, 13, 10, 0, 174, 116, 20, 79, 193, 232, 8, 102, 175, 117, 6, 65, 193, 224, 8, 235, 239, 193, 224, 8, 79, 235, 233, 102, 129, 127, 253, 13, 10, 116, 1, 65, 139, 193, 95, 201, 194, 4, 0 })
返回 (0)
' cld
' xor ecx, ecx
' push edi
' mov edi, dword [ebp+0x08]
' mov edi, dword [edi]
' cmp edi, 0x00000000
' je Label1
' mov eax, 0x000A0D00
' Label4:
' scasb
' je Label2
' dec edi
' shr eax, 0x08
' scasw
' jne Label3
' inc ecx
' shl eax, 0x08
' jmp Label4
' Label3:
' shl eax, 0x08
' dec edi
' jmp Label4
' Label2:
' cmp word [edi-0x03], 0x0A0D
' je Label1
' inc ecx
' Label1:
' mov eax, ecx
' pop edi
' leave
' retn 0x0004
子程序名返回值类型公开备 注
汇编_取文本行数整数型 
参数名类 型参考可空数组备 注
参数一字节集
变量名类 型静态数组备 注
返回值整数型 
置入代码 ({ 96, 139, 69, 8, 139, 0, 139, 72, 4, 141, 88, 8, 184, 10, 0, 0, 0, 49, 210, 56, 3, 117, 1, 66, 67, 226, 248, 137, 85, 252, 97 })
返回 (返回值)
' pushad
' mov eax,[ebp+8]
' mov eax,[eax]
' mov ecx,[eax+4]
' lea ebx,[eax+8]
' mov eax,10
' xor edx,edx
' begin:
' cmp byte ptr [ebx],al
' jnz addr1
' inc edx
' addr1:
' inc ebx
' loop Begin
' mov [ebp-4],edx
' popad
子程序名返回值类型公开备 注
文本_取行数1整数型 取一个文本共有有多少行。
参数名类 型参考可空数组备 注
文本文本型
置入代码 ({ 139, 125, 8, 139, 63, 49, 192, 138, 15, 128, 249, 0, 116, 9, 71, 128, 249, 10, 117, 243, 64, 235, 240, 137, 236, 93, 194, 4, 0 })
返回 (0)
' mov edi, dword [ebp+0x08]
' mov edi, dword [edi]
' xor eax, eax
' Label2:
' mov cl, byte [edi]
' cmp cl, 0x00
' je Label1
' inc edi
' cmp cl, 0x0A
' jne Label2
' inc eax
' jmp Label2
' Label1:
' mov esp, ebp
' pop ebp
' retn 0x0004
子程序名返回值类型公开备 注
文本_取行数2整数型 取一个文本共有有多少行。
参数名类 型参考可空数组备 注
文本文本型
置入代码 ({ 139, 69, 8, 139, 48, 49, 201, 172, 132, 192, 116, 7, 60, 10, 117, 247, 65, 235, 244, 137, 200, 137, 236, 93, 194, 4, 0 })
返回 (0)
' mov eax, dword [ebp+0x08]
' mov esi, dword [eax]
' xor ecx, ecx
' Label2:
' lodsb
' test al, al
' je Label1
' cmp al, 0x0A
' jne Label2
' inc ecx
' jmp Label2
' Label1:
' mov eax, ecx
' mov esp, ebp
' pop ebp
' retn 0x0004



i支持库列表   支持库注释   
spec特殊功能支持库


自己挖坑自己填
回复

使用道具 举报

结帖率:100% (8/8)

签到天数: 23 天

发表于 2022-3-22 20:24:38 | 显示全部楼层   广西壮族自治区崇左市
取文本指针, 循环逐个字节判断, 直到\0为止
遇到 \r 就继续判断后面是不是\n, 然后行数+1

c++代码
[C++] 纯文本查看 复制代码
// ptr = 文本指针, \0结尾
// removeEmptyLine = 删除空行, 为真则忽略空行
int dadsa(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;
}


机器字节码=
[C++] 纯文本查看 复制代码
{
0x55, 0x8b, 0xec, 0x83, 0xec, 0x0c, 0x8b, 0x45, 0x08, 0x89, 0x45, 0xfc, 0x83, 0x7d, 0xfc, 0x00, 0x74, 0x13, 0xb9, 0x01
0x00, 0x00, 0x00, 0x6b, 0xd1, 0x00, 0x8b, 0x45, 0xfc, 0x0f, 0xbe, 0x0c, 0x10, 0x85, 0xc9, 0x75, 0x07, 0x33, 0xc0, 0xe9
0xb4, 0x00, 0x00, 0x00, 0xc7, 0x45, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x0f, 0xb6, 0x55, 0x0c, 0x85, 0xd2, 0x74, 0x1d, 0x8b
0x45, 0xfc, 0x0f, 0xbe, 0x08, 0x83, 0xf9, 0x0d, 0x74, 0x0b, 0x8b, 0x55, 0xfc, 0x0f, 0xbe, 0x02, 0x83, 0xf8, 0x0a, 0x75
0x07, 0xc7, 0x45, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x4d, 0xfc, 0x0f, 0xbe, 0x11, 0x85, 0xd2, 0x74, 0x7b, 0x8b, 0x45
0xfc, 0x89, 0x45, 0xf4, 0x8b, 0x4d, 0xfc, 0x83, 0xc1, 0x01, 0x89, 0x4d, 0xfc, 0x8b, 0x55, 0xf4, 0x0f, 0xbe, 0x02, 0x83
0xf8, 0x0d, 0x74, 0x0b, 0x8b, 0x4d, 0xf4, 0x0f, 0xbe, 0x11, 0x83, 0xfa, 0x0a, 0x75, 0x51, 0x8b, 0x45, 0xf4, 0x0f, 0xbe
0x08, 0x83, 0xf9, 0x0d, 0x75, 0x14, 0x8b, 0x55, 0xfc, 0x0f, 0xbe, 0x02, 0x83, 0xf8, 0x0a, 0x75, 0x09, 0x8b, 0x4d, 0xfc
0x83, 0xc1, 0x01, 0x89, 0x4d, 0xfc, 0x0f, 0xb6, 0x55, 0x0c, 0x85, 0xd2, 0x74, 0x21, 0x8b, 0x45, 0xfc, 0x0f, 0xbe, 0x08
0x83, 0xf9, 0x0d, 0x74, 0x0b, 0x8b, 0x55, 0xfc, 0x0f, 0xbe, 0x02, 0x83, 0xf8, 0x0a, 0x75, 0x0b, 0x8b, 0x4d, 0xfc, 0x83
0xc1, 0x01, 0x89, 0x4d, 0xfc, 0xeb, 0xd7, 0x8b, 0x55, 0xf8, 0x83, 0xc2, 0x01, 0x89, 0x55, 0xf8, 0xe9, 0x7b, 0xff, 0xff
0xff, 0x8b, 0x45, 0xf8, 0x8b, 0xe5, 0x5d, 0xc3
}


这些字节码就是上面那段c++编译后的字节码

点评

还是忘了东西了, 字节码最后的 0xc3, 改成 0xc2, 0x08, 0x00, 这个只是把函数改成__stdcall, 还有, 用不了置入代码, 这个是个函数, 可以直接调用....   广西壮族自治区崇左市  发表于 2022-3-22 21:11
机器码每个换行忘了加逗号, 需要转换成置入代码的自己加一下, 自己转成10进制就可以用 置入代码了   广西壮族自治区崇左市  发表于 2022-3-22 21:08
子程序名随便打的, 不要在意这些细节   广西壮族自治区崇左市  发表于 2022-3-22 21:07
像这种小文本的, 一般都是10毫秒内就处理完了, 看***运算速度了   广西壮族自治区崇左市  发表于 2022-3-22 21:06

评分

参与人数 1荣誉 +1 收起 理由
笨潴 + 1 热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!

查看全部评分

回复

使用道具 举报

结帖率:96% (66/69)

签到天数: 10 天

发表于 2022-3-22 21:04:20 | 显示全部楼层   安徽省合肥市
你这些的貌似有问题啊,难不成你一次性直接导入20mb的txt吗,那我真话说了
回复

使用道具 举报

结帖率:100% (18/18)

签到天数: 22 天

发表于 2022-3-22 22:18:49 | 显示全部楼层   广东省梅州市
模块里好像有个 文本_分割文本_汇编()  应该1秒内能判断到
回复

使用道具 举报

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

本版积分规则 致发广告者

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

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

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