大学时候喜欢看电子书,为了更好的规划自己看书的进度我喜欢把电子书进行分割。通常是把一本书分割成若干个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数值的修改可以用于调整每个分割块儿的字数。
|