携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
将大文本分割成多页的实践.
例如将一篇小说的内容按照章节分割成多个txt文档
先分析文本结构:
- 每篇文章开头都是
Chapter 1: Crimson这样格式的一行
所以初步思路是读取每行, 如果正则匹配到这样的格式, 就新建一个文件, 文件名以chapter之后的章名命名. 所有的新文件我们都放在lord文件夹下.
很合理, 开干吧!
public class Processor {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new FileReader("Lord.txt"));
BufferedWriter bufferedWriter = null;
int count = 0;
String line = null;
while ((line = bufferedReader.readLine()) != null) {
if (line.startsWith("Chapter")) {
count++;
if (count != 1) {
bufferedWriter.close();
}
String fileName = line.replace(":", "");
fileName = fileName + ".txt";
bufferedWriter = new BufferedWriter(new FileWriter("lord/" + fileName));
}
bufferedWriter.write(line + System.lineSeparator());
}
bufferedReader.close();
bufferedWriter.close();
}
}
这里之所以使用缓冲流作为io流, 主要是可以用readline()这个方法, 一次获取一行数据, 方便我们验证是否以Chapter开头.
但是在写的时候发现出现了一点问题, 主要是filename起的有问题, 我们设置的是chapter之后作为文件名, 可以有时候会出现这样的情况:
Chapter 240: Trying Your Luck?
这里的?是特殊字符, 于是需要把所有的特殊字符都替换掉. 在上述代码中添加几句:
String fileName = line.replace(":", "");
fileName = fileName.length() >= 41 ? fileName.substring(0, 41) : fileName;
fileName = fileName.replace("?", "");
fileName = fileName.replace("!", "");
fileName = fileName.replace(">", "");
fileName = fileName + ".txt";
这里还限制了filename不能太长, 原因是越长的句子, 后面越有可能出现特殊字符, 而且一个文件名也没必要太长, 这里的长度限制在40个字符以内.
再次运行, 成功得到了所有分割的文件, bingo!
