C#提取小说中的目录

章节类

目录是由标题组成,而标题往往包括章节序号以及标题名称,而对于一个文本文件来说,如果想实现点击目录实现跳转,则又必须包含该标题在正文中出现的位置。所以,在新建目录之前,首先应该新建一个章节类。

class Section
{
    public int order;
    public int location;        //文字位置
    public string title;

    public Section(int order, string title)
    {
        this.order = order;
        this.title = title;
    }

    public Section(int order, string title, string txt, int st=0)
    {
        this.order = order;
        this.title = title;
        location = txt.IndexOf(title, st);
    }
    
    public Section(int order, string title, int location)
    {
        this.order = order;
        this.title = title;
        this.location = location;
    }

}

其中,order为章节序号;location为章节的文字位置;title为章节标题。

在构造函数中,IndexOf用于定位字符串在文本文档中出现的第一个位置,st为开始搜索的字符串位置。由于还每太想好所有的业务流程,所以重构了多种构造方式。

有了章节之后,就可以创建目录了,简单地来说,目录就是章节列表,但除此之外,还需要有生成目录的方法,其大致内容如下

class Catalog
{
    public List<Section> sections;
    public Catalog(string txt, bool withCatalog)
    {

    }
}

提取标题

一般来说,txt中并不包含目录信息,所谓生成目录,无非是从文本文档中提取标题,所以需要分析标题的特点。

此外,有一些文本文档会在正文之前列出目录,这种可以把目录提取出来之后,再从文档中查找相应的章节,相对来说会更加方便,考虑到先易后难的原则,首先实现这种目录生成逻辑,在Catalog类的构造函数中,当withCatalogtrue时,表示这种情况,下面是具体实现方法

public int maxSecLength = 30;       // 标题最长字数
public string[] ex = new string[] { "。", "." };

public bool isSection(string paragraph)
{
    if (paragraph.Length > maxSecLength)
        return false;
    foreach (var ch in ex)
        if (paragraph.Contains(ch))
            return false;
    return true;
}


public void extractCatalog(string txt)
{
    int i = 0, num = 0;     //i是章节号;num是章节位置
    foreach (var p in txt.Split("\r\n"))
    {
        num += p.Length;
        if (p.Trim().Length == 0)
            continue;

        if (!isSection(p))
            break;
        secs.Add(new Section(i++, p, txt, num));
    }
}

其中,isSection用于判断某个段落是否为目录,其判断目录的方法有两个,首先文字太长肯定不是目录,其次,如果出现了句号,也不是标题。

extracCatalog表示从txt中提取目录。由于假定文本文档以目录开头,所以当循环到某一行,当其不符合章节名称的要求时,就直接退出。

搜索标题

相应地,直接从文本中挑选目录从实现上来说更加简单,但具体识别效果可能会比较差,在接下来的开发测试工作中,将一直使用前一种方式。

public void findCatalog(string txt)
{
    int i = 0, num = 0;     //i是章节号;num是章节位置
    foreach (var p in txt.Split("\r\n"))
    {
        num += p.Length;
        if (!isSection(p))
            break;
        secs.Add(new Section(i++, p, num - p.Length));
    }
}

这两种标题搜索方案,都有其具体的适用背景,最终一定要让位于一个能够兼顾的方案,但目前来说,应付测试是完全没有问题的。

开发txt阅读器目录

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
版本历史明细: //-----------Work_Reader.exe V.3.0 第二版使用说明: 相对第二版增加了: 1)可以拖动打开text或word文档的功能[不能读word表格] 2)由于可以打开word了,所以改名叫Work_Reader. //-----------Work_TextReader.exe V.2.0 第二版使用说明:需要把Interop.Word.dll和应用文件放在一个文件目录下 此版为Work_TextReader.exe 2.0版,相对第一版: 1)添加了读word文件的功能,只显示word文本,不能显示表格等,需要把Interop.Word.dll和应用文件放在一个文件目录下 2)把隐藏老板键隐藏到图标[Ctrl+0]改成了[Ctrl+~] 3)增加了控件可随随窗口变化而同时变化的功能. 4)把添加标题栏的快捷键[Alt+A]改成了Shift+A] 5)把ABOUT的快捷键[I]改成了[Shift+I] 6)因为也可以读word了,故原名[Work_TextReader]改名成:[Work_Reader] 7)增加了当文本框为空时Set菜单不能用的判断 //-----------Work_TextReader.exe V.1.0 此程序是用C#开发的第一版,因为只是实现一些基本的简单功能,所以就不上传源码了. 如有技术方面的疑问,好的意见或建议,可以发邮件到:[email protected] 我以后会增加功能让其更完善. 此阅读器主要的功能就是可以调节透明度. 有退出老板键[Esc],隐藏老板键[Ctrl+~] .^_^.用这个在闲暇的时候[一定要在闲暇的时候哦!]看看小说就不会害怕被抓到了..^_^. 功能如下 主界面:1)文件菜单: a)打开文件 2)设置菜单: a)窗体设置: a.1)加减标题栏 a.2)是否最前端显示 a.3)最大化窗口 b)颜色设置: b.1)字体颜色设置 b.2)背景颜色设置 c)字体设置 d)是否WordWrapy显示设置 e)设置文本是否为只读[默认是只读] f)隐藏菜单栏[记得记住快捷键] 3)有关系统 4)退出系统: a)系统退出 b)隐藏到图标 5)调节透明度[可以通过选后按上下左右方向键来调节] 6)实时时间显示栏

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值