开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 737|回复: 7
收起左侧

[已解决] 怎么快速将字符串插入到2w行的文件中的某一行?

 关闭 [复制链接]
结帖率:71% (12/17)
发表于 2024-5-9 16:33:31 | 显示全部楼层 |阅读模式   浙江省金华市
20精币
如题
将一段文本插入到 2w行的txt文件中的某一行
将文本导入数组的方法太慢了  求能快点的

最佳答案

查看完整内容

[e=0].版本 2 .子程序 插入文本到文件, 文本文件路径 作为 文本型, 插入行号 作为 整数型, 插入文本 作为 文本型 .局部变量 临时文件路径 作为 文本型 .局部变量 当前行号 作为 整数型 .局部变量 当前行内容 作为 文本型 .局部变量 文件1 作为 文本文件 .局部变量 文件2 作为 文本文件 ' 创建临时文件名 临时文件路径 = "临时文件.txt" ' 打开原始文件和临时 ...

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:88% (14/16)
发表于 2024-5-9 16:33:32 | 显示全部楼层   广东省东莞市
  
.版本 2  

子程序名返回值类型公开备 注
插入文本到文件文本文件路径 作为 文本型 插入文本 作为 文本型  
.局部变量 临时文件路径 作为 文本型  
.局部变量 当前行号 作为 整数型  
.局部变量 当前行内容 作为 文本型  
.局部变量 文件1 作为 文本文件  
.局部变量 文件2 作为 文本文件  

' 创建临时文件名  
临时文件路径 = "临时文件.txt"  

' 打开原始文件和临时文件以进行读写  
文件1 = 文本文件_打开 (文本文件路径, 文本文件_只读)  
如果 (文件1 = 0) 则  
输出调试文本 ("无法打开原始文件。")  
返回  
文件2 = 文本文件_创建 (临时文件路径)  
如果 (文件2 = 0) 则  
输出调试文本 ("无法创建临时文件。")  
文本文件_关闭 (文件1)  
返回  

' 逐行读取原始文件并写入临时文件  
当前行号 = 1  
(文本文件_读取一行 (文件1, 当前行内容)) 则  
如果 (当前行号 = 插入行号) 则  
' 在当前行之前插入文本  
文本文件_写入字符串 (文件2, 插入文本)  
文本文件_写入字符串 (文件2, 换行符)  
文本文件_写入字符串 (文件2, 当前行内容)  
文本文件_写入字符串 (文件2, 换行符)  
当前行号 = 当前行号 + 1  
否则  
' 读取完毕  

' 关闭文件并替换原始文件  
文本文件_关闭 (文件1)  
文本文件_关闭 (文件2)  
文件_删除 (文本文件路径)  
文件_重命名 (临时文件路径, 文本文件路径)  

输出调试文本 ("文本已成功插入到文件。")  
.子程序结束

评分

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

查看全部评分

回复

使用道具 举报

结帖率:67% (2/3)
发表于 2024-5-9 16:51:49 | 显示全部楼层   天津市天津市
快速文本对象
回复

使用道具 举报

结帖率:100% (47/47)

签到天数: 1 天

发表于 2024-5-9 16:53:15 | 显示全部楼层   江西省赣州市
[C] 纯文本查看 复制代码
#pragma warning(disable:4996)
void foo4() {
    auto b = clock();

    //std::ifstream infile(R"(C:\Users\Administrator\Desktop\a.txt)", std::ios::binary);

    std::vector<char*> words;

    FILE* fp = fopen(R"(D:\VSproject\test_sql\data.txt)", "rb");
    fseek(fp, 0, SEEK_END);
    long size = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    char* content = (char*)malloc(size + 1);
    fread(content, 1, size, fp);
    content[size] = '\0';
    fclose(fp);

    const char* tar = "\n";
    char* line_start = content, * line_end = strstr(content, tar);

    while (line_end) {
        size_t length = line_end - line_start;

        char* p = (char*)malloc(length + 1);
        memcpy(p, line_start, length);
        p[length] = '\0';
        line_start = line_end + 1;
        line_end = strstr(line_start, tar);
        words.emplace_back(p);
    }


    free(content);
    for (const auto p : words) {
        free(p);
    }
    words.clear();

    auto e = clock();

    cout << e - b << endl;
    cout << words.size() << endl;
}


之前写的分割,自己改下,200wCPU都不热一下
回复

使用道具 举报

结帖率:71% (12/17)
 楼主| 发表于 2024-5-9 17:04:32 | 显示全部楼层   浙江省金华市

试了 没明白怎么写入到指定行
回复

使用道具 举报

结帖率:71% (12/17)
 楼主| 发表于 2024-5-9 17:05:26 | 显示全部楼层   浙江省金华市
明天自然醒 发表于 2024-5-9 16:53
[mw_shl_code=c,true]#pragma warning(disable:4996)
void foo4() {
    auto b = clock();

   啊这...需要易语言的
回复

使用道具 举报

结帖率:71% (12/17)
 楼主| 发表于 2024-5-9 17:46:37 | 显示全部楼层   浙江省金华市
  
子程序名返回值类型公开备 注
随机行加入文本文本型 
参数名类 型参考可空数组备 注
txt文本型
添加的内容文本型
变量名类 型静态数组备 注
list文本型0
k快速文本对象 
行数整数型 
随机数整数型 
k.添加 (txt)
list = k.分割文本 ( #换行符, )
置随机数种子 ()
随机数 = 取随机数 (1, 取数组成员数 (list))
k.替换子文本 (list [随机数], list [随机数]#换行符 + 添加的内容, , 1, )
返回 (k.取文本 (, ))


i支持库列表   支持库注释   
commobj通用对象支持库
回复

使用道具 举报

结帖率:88% (14/16)
发表于 2024-5-9 18:09:15 | 显示全部楼层   广东省东莞市
读取和写入到临时文件:不直接修改原始文件,而是读取到特定行的内容,将这部分内容写入新的临时文件,然后追加你的新文本,接着继续读取原始文件的剩余部分并追加到临时文件。
二进制读取和写入:如果可能,使用二进制模式读取和写入文件,这通常比文本模式更快。但请注意,二进制模式可能不适用于文本文件,除非你确切知道文本是如何编码的。
优化磁盘I/O:尽量减少磁盘I/O操作。例如,使用缓冲区来读取和写入文件,而不是一次读取或写入一个字符。
多线程或异步I/O(如果易语言支持):这可能会加速操作,但也会使代码更加复杂。
在易语言中,可能没有内置的函数或库直接支持上述所有功能。但是,你可以通过结合基本的文件操作功能来实现它们。

以下是一个简化的示例,说明如何在易语言中实现这种策略:

e
.版本 2  
  
.子程序 插入文本到文件, 文本文件路径 作为 文本型, 插入行号 作为 整数型, 插入文本 作为 文本型  
    .局部变量 临时文件路径 作为 文本型  
    .局部变量 当前行号 作为 整数型  
    .局部变量 当前行内容 作为 文本型  
    .局部变量 文件1 作为 文本文件  
    .局部变量 文件2 作为 文本文件  
      
    ' 创建临时文件名  
    临时文件路径 = "临时文件.txt"  
      
    ' 打开原始文件和临时文件以进行读写  
    文件1 = 文本文件_打开(文本文件路径, 文本文件_只读)  
    如果 (文件1 = 0) 则  
        输出调试文本("无法打开原始文件。")  
        返回  
    文件2 = 文本文件_创建(临时文件路径)  
    如果 (文件2 = 0) 则  
        输出调试文本("无法创建临时文件。")  
        文本文件_关闭(文件1)  
        返回  
      
    ' 逐行读取原始文件并写入临时文件  
    当前行号 = 1  
    当 (文本文件_读取一行(文件1, 当前行内容)) 则  
        如果 (当前行号 = 插入行号) 则  
            ' 在当前行之前插入文本  
            文本文件_写入字符串(文件2, 插入文本)  
            文本文件_写入字符串(文件2, 换行符)  
        文本文件_写入字符串(文件2, 当前行内容)  
        文本文件_写入字符串(文件2, 换行符)  
        当前行号 = 当前行号 + 1  
    否则  
        ' 读取完毕  
         
    ' 关闭文件并替换原始文件  
    文本文件_关闭(文件1)  
    文本文件_关闭(文件2)  
    文件_删除(文本文件路径)  
    文件_重命名(临时文件路径, 文本文件路径)  
      
    输出调试文本("文本已成功插入到文件。")  
.子程序结束
回复

使用道具 举报

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

本版积分规则 致发广告者

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

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

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