WPF开发txt阅读器实现目录提取功能

 更新时间:2023年06月06日 09:27:37   作者:微小冷  
这篇文章主要为大家详细介绍了WPF开发txt阅读器时如何实现目录提取功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

目录类

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

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;
    }

}

其中,IndexOf用于定位字符串在文本文档中出现的第一个位置,st为开始搜索的字符串位置。

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

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

提取标题

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

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

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));
    }
}

到此这篇关于WPF开发txt阅读器实现目录提取功能的文章就介绍到这了,更多相关WPF阅读器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用C#来编写一个异步的Socket服务器

    使用C#来编写一个异步的Socket服务器

    这篇文章主要介绍了使用C#来编写一个异步的Socket服务器,通过无阻塞机制来获取更高的处理效率,需要的朋友可以参考下
    2015-07-07
  • C#中Hashtable和Dictionary的区别与用法示例

    C#中Hashtable和Dictionary的区别与用法示例

    由于 Hashtable 和 Dictionary 同时存在, 在使用场景上必然存在选择性, 并不任何时刻都能相互替代。所以这篇文章主要给大家介绍了关于C#中Hashtable和Dictionary区别的相关资料,需要的朋友可以参考下
    2021-05-05
  • C#表达式树基础教程

    C#表达式树基础教程

    这篇文章介绍了C#表达式树的基础教程,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • 深入解析C#中的交错数组与隐式类型的数组

    深入解析C#中的交错数组与隐式类型的数组

    这篇文章主要介绍了深入解析C#中的交错数组与隐式类型的数组,隐式类型的数组通常与匿名类型以及对象初始值设定项和集合初始值设定项一起使用,需要的朋友可以参考下
    2016-01-01
  • C#自定义Attribute值的获取与优化技巧

    C#自定义Attribute值的获取与优化技巧

    C#自定义Attribute值的获取是开发中会经常用到的,大家通常使用反射进行获取的,代码也很简单,今天通过本文给大家讲解C# Attribute值获取方法,感兴趣的朋友跟随小编一起看看吧
    2023-07-07
  • c# 面试必备线程基础知识点

    c# 面试必备线程基础知识点

    这篇文章主要介绍了c# 面试必备线程基础知识点,帮助大家更好的巩固,掌握线程的基础知识,感兴趣的朋友可以了解下
    2020-11-11
  • Winform控件Picture实现图片拖拽显示效果

    Winform控件Picture实现图片拖拽显示效果

    这篇文章主要为大家详细介绍了Winform控件Picture实现图片拖拽显示效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • C# 本地函数与 Lambda 表达式详细介绍

    C# 本地函数与 Lambda 表达式详细介绍

    这篇文章主要介绍了C 语言本地函数与 Lambda 表达式,,由于 C# 长期以来一直使用 lambda,因此从差异和相似之处来看本地函数确实是有意义的,感兴趣的小伙伴可以参考下面文章内容
    2021-09-09
  • C#正则表达式转义字符介绍

    C#正则表达式转义字符介绍

    正则表达式,又称正规表示法、常规表示法。这篇文章主要介绍了C#正则表达式转义字符介绍的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • winfrom 打印表格 字符串的封装实现代码 附源码下载

    winfrom 打印表格 字符串的封装实现代码 附源码下载

    以前写打印都是根据打印机的型号,找开发类库。然后在此基础上开发。写的多了自然就想到了封装。这是还是想到了微软,微软封装了PrintDocument的打印类。但这只是在低层对串口的封装
    2013-02-02

最新评论