您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iProcess 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
  
每天15篇文章
不仅获得谋生技能
更可以追随信仰
 
 
     
   
 订阅
  捐助
文档切割器在matlab上的实现
 
火龙果软件    发布于 2014-11-13
    评价:      
 

大学时候喜欢看电子书,为了更好的规划自己看书的进度我喜欢把电子书进行分割。通常是把一本书分割成若干个txt格式的小块儿,每个小块儿的大小是10KB左右。

最初的时候我选择的是手动复制粘贴,在word中先查看一下字数,看一下大致需要多少也word文档,然后进行复制粘贴。再到后来,从网络上下载了别人的txt切割器。算法各异,但是有的工具效率明显很低。但是我依然佩服别人,因为那个时候我啥都不会。直到现在我依然佩服,因为我仍然不会做一个那样的软件,因为从来就没有尝试过。

慢慢地,接触了C语言,接触了关于文件的操作。突然间有了自己去写一个程序完成这个功能的想法。当初笨的可以,花了不知道多少天才完成这个玩意儿。算法是最简单的,谁都能够想到的算法,一如今天的M程序代码。

工作之后,从事了软件集成的工作,有时候批处理、脚本等各种东西都得上阵。近几个月经常跟matlab打交道,又是各种文件处理代码。工作之中猛然间有种想法,回味一下大学时候的生活,把这个切割器的小功能再实现一次。只不过,这次不是用C语言,而是在matlab上通过M脚本。

这次比较顺利,脚本用了不到一小时的时间写完并简单测试成功。算法依然是老掉牙的笨蛋式算法,后面会附上代码。现在先说一下这个脚本怎么用。

1.把脚本cutter.m跟要切割的电子书放到matlab的工作路径之下;

2.运行脚本,OK。

需要注意的是这个路径之中只能有一个txt文档,不然会出现错误。

实际演示一下:

我的工作路径是F:\My Baby\cutter,切割的电子书为随遇而安。我在淘宝的淘宝读书上买过这本书,现在是从网上下载了一个txt格式书,传说中的盗版?或许吧!看图:

运行脚本cutter.m,选择Run File

发现文件夹中多了切割的字文件,这就是我们要的结果,在左侧路径下可以看到。

好啦,以下是我的代码,代码比较简单,不添加注释了。

clear;
clc;
files_cell = ls;
size_files = size(files_cell);
long = size_files(2);
wide = size_files(1);
word_number_block = 5000;
file_name = '';
text_block = '';
k = 0;
for i = 1:wide
    for j = 1:long
        if long ~= j
            file_name = strcat(file_name,files_cell(i,j));
        else
            book_name_test = file_name;
            file_name = '';
            txt_match = regexp(book_name_test,'.txt','match');
            if ~isempty(txt_match)
                book_name_txt = regexp(book_name_test,'.txt','split');
                book_name = char(book_name_txt{1,1});
                break;
            end
        end
    end   
end
book_name_read = strcat(book_name,'.txt');
text = fileread(book_name_read);
number_word = length(text);
blocks_number_cal = number_word/word_number_block;
blocks_number_test = fix(number_word/word_number_block);
if blocks_number_test == blocks_number_cal
    blocks_number_real = blocks_number_test;
elseif blocks_number_test < blocks_number_cal
    blocks_number_real = blocks_number_test + 1;
end
for i = 1:blocks_number_real
    block_name = strcat(book_name,int2str(i));
    block_name_write = strcat(block_name,'.txt');
    fid = fopen(block_name_write,'w');
    for j = (word_number_block*(i-1)+1):(word_number_block*(i-1)+5001)
        k = k+1;
        if k <= number_word
            fprintf(fid,'%s',text(k));
        else
            break;
        end
        if word_number_block*(i-1)+5001 == j
            fclose(fid);
        end
    end
end

fclose('all');


至于切割其他格式的文档,把代码中匹配.txt格式语句中的txt改成相应格式的扩展名就行了。word_number_block数值的修改可以用于调整每个分割块儿的字数。

   
 评价: 差  订阅 捐助
 
相关文章

UML建模之时序图
UML状态图
区分UML类图中的几种关系
UML建模之活动图介绍
 
相关文档

UML统一建模语言参考手册
网上商城UML图
UML建模示例:JPetStor
UML序列图编写规范
 
相关课程

UML与面向对象分析设计
UML + 嵌入式系统分析设计
业务建模与业务分析
基于UML和EA进行系统分析设计
 

如何向妻子解释OOD
OOAD与UML笔记
UML类图与类的关系详解
UML统一建模语言初学
总结一下领域模型的验证
基于 UML 的业务建模


面向对象的分析设计
基于UML的面向对象分析设计
UML + 嵌入式系统分析设计
关系数据库面向OOAD设计
业务建模与业务架构
使用用例进行需求管理


某航空IT部门 业务分析与业务建模
联想 业务需求分析与建模
北京航管科技 EA工具与架构设计
使用EA和UML进行嵌入式系统分析
全球最大的茶业集团 UML系统分析
华为 基于EA的嵌入式系统建模
水资源服务商 基于EA进行UML建模
更多...