WPF开发txt阅读器15:C#合并段落

news2024/11/26 13:32:59

文章目录

    • 清理空格
    • 段落拼接
    • 去除空行
    • 按键事件

txt阅读器系列:

  • 需求分析和文件读写
  • 目录提取类💎列表控件与目录💎快捷键翻页
  • 字体控件绑定💎前景/背景颜色
  • 书籍管理系统💎用树形图管理书籍
  • 语音播放💎播放进度显示💎快进快退💎语速音量
  • 文本清理的布局💎段落合并

清理空格

接下来实现清理空格、段落拼接、去处空行这三个功能,这里的清理空格表示去除首尾空格,为了实现这个功能,需要先将字符串分割为字符串列表,然后将列表中每个字符串的首尾空格去掉,一行代码就可以实现

var ch = "\r\n";
if (fmtCheckBoxes[0].IsChecked == true)
    doc = String.Join(ch,  doc.Split(ch)
                              .Select(L => L.Trim())
                              .ToArray());

段落拼接

然后考虑段落拼接,只需找到字符串中的所有换行的位置,如果这些换行符前面,并不是允许换行的终止符号,则删除这个地方的换行。而文字中经常出现的终止符号基本都是标点符号,故其代码可写为

private List<string> mergePara(List<string> sLst, string LF="\r\n")
{
    const string TERMINATOR = ",.!?,。!?”";
    int i = 0;
    while (i < sLst.Count - 1)
    {
        if (!TERMINATOR.Contains(sLst[i].Last()))
        {
            sLst[i] = sLst[i] + sLst[i + 1];
            sLst.RemoveAt(i + 1);
            continue;
        }
        i++;
    }
    return sLst;
}

其核心代码为while循环的第一个判断语句,若第i行的最后一个字符不属于终止符,则将第i+1行合并到第i行后,删除第i+1行,然后重复执行此项操作。否则的花,跳到下一行。

去除空行

最后考虑去除空行,这一条也比较简单,无非把多余一个的\r\n替换为\r\n即可,最直观的写法是

if (fmtCheckBoxes[2].IsChecked == true)
	while (doc.Contains("\r\n\r\n"))
		doc = doc.Replace("\r\n\r\n", "\r\n");

但这么些可能会在空格较多的情况下,执行更多次的循环,并不划算,故而可以展开来写

private List<string> deleteDoubleLine(List<string> sLst)
{
    int i = 0;
    while (i < sLst.Count - 1)
    {
        if (sLst[i] == "" & sLst[i+1]=="" )
        {
            sLst.RemoveAt(i + 1);
            continue;
        }
        i++;
    }
    return sLst;
}

其含义非常简单,与mergePara的逻辑基本是相同的,只不过在判断时,要求当前行和下一行都为空行,则删除下一行。

按键事件

这些功能都实现了之后,就可以写交互逻辑了,为文本清洗中的执行按钮添加btnFMT_Click事件,其内容为

private void btnFMT_Click(object sender, RoutedEventArgs e)
{
    var ch = "\r\n";
    List<string> sLst = doc.Split(ch).ToList();
    if (fmtCheckBoxes[0].IsChecked == true)
        sLst = sLst.Select(L => L.Trim()).ToList();
    if (fmtCheckBoxes[1].IsChecked == true)
        sLst = mergePara(sLst, ch);
    if (fmtCheckBoxes[2].IsChecked == true)
        sLst = deleteDoubleLine(sLst);
    doc = string.Join(ch, sLst);
}

结合txtReader的其他功能,这个业务流程中有两个bug,都和目录有关,其一是目录结尾并没有标点符号,也就是说,上面这些文本的清洗方式,会导致目录无法识别。所以需要对目录进行保护,在mergePara刚进入while循环时加上一个判断

if (catalog.Contains(sLst[i]))
{
    i++;
    continue;
}

其二则是重新生成目录时,在清空目录时会改变ListBoxSelectedIndex,从而触发事件,但此时doc文件已经发生了变化,所以会报错。故而更改btnCatalog_Click中的内容,在Clear前后取消并重新注册事件。

lvCatalog.SelectionChanged -= lvCatalog_SelectionChanged;
lvCatalog.Items.Clear();
lvCatalog.SelectionChanged += lvCatalog_SelectionChanged;

其最后效果如下

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/665755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cell -- PARADIGM算法可预测药物与微生物组的关联关系

在癌症患者中&#xff0c;药物对肠道细菌群的影响很难确定。以往的研究主要关注抗生素对肠道微生物组的影响&#xff0c;而对非抗生素药物的影响在人体中了解较少&#xff0c;这是由于缺乏可靠的药物暴露数据和长期粪便样本的收集。 2023年6月8日发表于《Cell》的“High-resolu…

2023年北京/上海/深圳DAMA-CDGA/CDGP数据治理工程师认证报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

【openGauss基本概念---快速入门】

【openGauss简单使用---快速入门】 &#x1f53b; 一、基本概念&#x1f530; 1.1 openGauss&#x1f530; 1.2 数据库&#xff08;Database&#xff09;&#x1f530; 1.3 数据块&#xff08;Block&#xff09;&#x1f530; 1.4 行&#xff08;Row&#xff09;&#x1f530; …

Live800:企业如何提高服务数据可用性?

数据是现代企业的重要资源&#xff0c;蕴含着巨大的商业价值是企业运用科学管理、决策分析的基础。近几年来“大数据”一词的热度有目共睹&#xff0c;各行业根据自身特点和需求不断探索符合行业特性的大数据应用场景。那么对客服行业来说&#xff0c;大数据将对客户服务将产生…

基于C/S框架的医院LIS实验室检验系统源码

LIS系统功能 一、字典管理模块&#xff1a; 系统参数功能简介&#xff1a;集中设置系统使用过程中所需的参数值&#xff0c;一般由开发或实施人员进行设置。 标本管理功能简介&#xff1a;标本管理是对检验业务中涉及的检验标本类型进行初始化设置&#xff0c; …

详解浮点数

目录 1.什么是浮点数 2.举个例子 2.1.十进制转二进制 2.2.规范尾数位 2.3.计算指数位 2.4.拼接结果 3.精度丢失 4.JAVA中的浮点数思考 1.什么是浮点数 在计算机系统的发展过程中&#xff0c;曾经提出过多种方法表示实数&#xff0c;但是到为止使用最广泛的是浮点表示法…

sqoop导出实战

Sqoop导出实战 普通导出 在Sqoop中,使用export进行导出,指的是从HDFS中导出数据到MySql中&#xff1a; 构建MySql的表&#xff1a; CREATE TABLE u2 (id int(11) DEFAULT NULL,age int(11) DEFAULT 0 ) ENGINEInnoDB DEFAULT CHARSETutf8; 复制代码 HDFS导出到MySql 第一…

LabVIEW开发基于脑机接口的航空航天相机载体

LabVIEW开发基于脑机接口的航空航天相机载体 脑机接口是人脑与外部世界之间的直接通信渠道。脑机接口是一个全新的人机界面系统。该系统获取和分析生物电信号&#xff0c;目标是直接在大脑和外部设备之间创建一个通信通道。计算机或微处理器的发展提高了复杂的数据处理能力。生…

SolidWorks如何批量转换文件为最新版?

对于 SOLIDWORKS 的每个新版本&#xff0c;文件格式都会更新以适配最新的性能升级。当您每次打开旧版本 SOLIDWORKS 文件时&#xff0c;都会显示一条消息&#xff0c;通知您这是一个较旧的文件。保存文件时&#xff0c;必须先将文件转换为最新版本&#xff0c;然后再保存。这个…

2023年5月青少年机器人技术等级考试理论综合试卷(四级)

青少年机器人技术等级考试理论综合试卷&#xff08;四级&#xff09;2023.6 分数&#xff1a; 100 题数&#xff1a; 30 一、 单选题(共 20 题&#xff0c; 共 80 分) 1.Arduino C 语言&#xff0c; 部分程序如下&#xff0c; 串口监视器输出结果是“D”时&#xff0c; 变量 i …

青少年和成人错误监测神经源的多模态研究

导读 儿童和成人对目标导向行为的监控能力不同&#xff0c;这可以通过几种任务和技术来测量。此外&#xff0c;最近的研究表明&#xff0c;错误监测的个体差异在调节焦虑情绪的倾向方面具有重要作用&#xff0c;而且这种调节作用会随着年龄的增长而变化。本研究使用多模态方法…

BLIP2原理解读——大模型论文阅读笔记二

一. 论文与代码 论文&#xff1a;https://arxiv.org/abs/2301.12597 代码&#xff1a;https://github.com/salesforce/LAVIS/tree/main/projects/blip2 二. 解决问题 端到端训练视觉语言模型需要大尺度模型及大规模数据&#xff0c;该过程成本大&#xff0c;本文提出方法基于…

多模态网络

目录 多模态网络概念未来网络体系研究网络管控 多模态网络概念 将多种网络技术通过可编程技术以网络模态的形式融合到多模态网络之中&#xff0c;力求整合多种网络优势&#xff0c;提升网络对多元业务的承载能力。 多模态网络中存在多种标识体系&#xff0c;如内容标识、身份标…

FPGA XDMA 中断模式实现 PCIE X8 OV5640摄像头视频采集 提供工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案视频采集和缓存XDMA简介XDMA中断模式QT上位机及其源码 5、vivado工程详解6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Express&#xff09;采用了目前业内流行的点对点串…

ACE中TASK架构简介及简单应用

首先配置ACE环境&#xff1a; #include <iostream> #include "ace/Synch.h" #include "ace/Task.h" #include "ace/Message_Block.h" #ifdef _DEBUG #pragma comment(lib,"aced.lib") //#pragma comment(lib,"mysqlcppcon…

Python实现逻辑回归(Logistic Regression)

&#x1f4a5; 项目专栏&#xff1a;【Python实现经典机器学习算法】附代码原理介绍 文章目录 前言一、基于原生Python实现逻辑回归算法二、逻辑回归模型的算法原理三、算法实现3.1 导包3.2 定义随机数种子3.3 定义逻辑回归模型3.3.1 模型训练3.3.1.1 初始化参数3.3.1.2 正向传…

电力通信实用小技巧,一看就懂!

随着电力通信技术的快速发展&#xff0c;电力通信机房扮演着至关重要的角色&#xff0c;确保电力系统的正常运行和通信网络的稳定连接。 然而&#xff0c;电力通信机房的环境和设备面临着各种潜在的风险和挑战&#xff0c;如温度过高、湿度异常、电力故障等。为了有效监控和管理…

Canonical:我们对探索完全容器化、不可改变的Ubuntu桌面的想法感到兴奋

导读Canonical的Oliver Smith近日在一篇博文中写道&#xff0c;这个最受欢迎的GNU/Linux发行版之一背后的公司很高兴在不久的将来使用Ubuntu Core和Snaps探索完全容器化和不可变的Ubuntu桌面的想法。 在今年早些时候宣布从Ubuntu 23.04&#xff08;Lunar Lobster&#xff09;开…

计算机网络——物理层

物理层 物理层是计算机网络体系结构中的底层层级&#xff0c;负责处理计算机与物理传输媒介之间的接口和通信细节。它主要关注如何在物理媒介上传输原始比特流&#xff0c;并确保数据能够可靠地从发送方传输到接收方。 物理层的主要任务包括&#xff1a; 传输介质&#xff1a…

基于springboot的阅读系统-计算机毕设 附源码86095

基于springboot的阅读系统 摘 要 从古至今&#xff0c;阅读都是人们学习新技能&#xff0c;新知识的一种方式。随着互联网时代的到来&#xff0c;传统的纸质阅读早已满足不了人们对于阅读的渴望。在这样的大背景下&#xff0c;电子阅读便快速崛起。越来越多的人们喜欢愿意通过这…