SheepDev

文本与正则表达式

删除列表中的重复行、空行和多余空格

使用工具

邮件复制的名字、日志提取的名称、手动收集的 ID,常混有空格和重复项。行整理能为下一步处理准备列表,但变短、整齐并不意味着所需信息都保留了。

用虚构商品 ID 列表分别试验去首尾空格、删空行、去重和排序。无需真实个人信息或权限列表也能理解行为。如果原顺序或出现次数有意义,应先选择保留它们的设置。

先不排序,观察原列表

示例:第 3 行为空,第 2、5 行有首尾空格
item-10
 item-2 

item-2
 item-10
item-1

最初关闭去首尾空格、删空行、去重、排序和行号,建立对照基准。一口气清理全部,很难解释哪项设置删了哪些行。使用六行示例逐项启用。

去掉空格后,才成为重复项

只去首尾空格,会让第 2、4 行都变成 item-2,item-10 也一样,但各仍出现两次。再开启删空行和去重,保持不排序,结果是 item-10、item-2、item-1,保留首次出现的顺序。

去首尾空格、空行和重复项,不排序
item-10
item-2
item-1

工具先去首尾空格再去重。如果空格用于区分记录,就应关闭该操作。定宽数据和缩进文字里的空白也是信息。只剩清理结果时,无法从中恢复删掉的空格或原出现位置。

为什么 item-10 排在 item-2 前面

普通文本升序得到 item-1、item-10、item-2;数字排序得到 item-1、item-2、item-10。它更接近人阅读编号文件名的顺序,但并未把 ID 转为数字,只改变比较规则。

排序使用运行环境的 Intl.Collator,大小写、重音和语言顺序未必等于字节顺序。跨系统必须严格一致的机器规则,不应只以本页面排序为规范。若原顺序代表优先级,应关闭排序。

排序的大小写设置不等于去重规则

仅大小写不同的输入
Alpha
alpha
Alpha

去重仍会把 Alpha 和 alpha 保留为不同字符串。改变排序的大小写设置,不会让去重忽略大小写。混淆两者会误以为清理失败。用小例子确认设置作用于哪一步。

若业务规则忽略大小写,应先确认适用于这些记录。相似文件名或标识符可能指向不同对象。集合比较提供忽略大小写的成员匹配,但在那里匹配,不保证原系统中是同一对象。

行号最后添加,不代表原行位置

行号按清理后的输出从 1、2、3 编起,不保留原六行中的位置。启用排序时,按排序后顺序编号。它便于评审列表,但不是源文件行号。

编号前缀成为输出文字的一部分。下个工具收到的是 1. item-10,而非 item-10。机器处理 ID 时可能应使用无编号结果。要区分给人看的装饰和下一步需要的值。

去重后,就无法再统计原次数

同一错误出现一百次,去重后只剩一行。列出错误类型很方便,但频率信息消失了。订单、投票、访问记录也可能用相同字符串表示不同事件。先决定需要种类还是次数,不要把重复直接当多余。

CSV 引号字段内的换行可能不是记录边界,不能直接按文本行当一项。应先用 CSV 编辑器解析结构并选择需要的列。行整理处理换行分隔字符串,不是 CSV 记录。

交付前,确认能说明删掉了什么

按下一步用途检查:是否要保留顺序、大小写变体是否应区分、能否删空格、行号是否混入值。只看整齐结果不易发现丢失信息,应保留原文对照。

附注“去首尾空格、空行与完全重复项,保留首次出现顺序”,接收方就能理解结果。所需原本和条件应自行管理,不要假设工具保存输入历史。整理目的不是缩短,而是把正确含义传给下一步。

同样的整理操作,顺序不同结果也不同

三行分别是 alpha、前后有空格的 alpha、alpha。不去空格直接去重会留下两种,先去空格再去重只留一种。哪种正确取决于用途:ID 输入噪声可清理,测试字面字符串则可能必须保留。先判断空格是数据还是噪声。

排序也一样:名单按名称排方便,步骤或优先级列表却会改变含义。后来添加的行号表示整理后位置,不保证原文件行号。需要追溯时应先保留原文并比较差异;工具不保存原数据审计历史,不能只剩整理后的版本。

不要一开始全开选项,可依次检查空行、前后空格、重复和排序。行数异常时就容易定位最后一步。写清去空格后按完全一致合并再排序,别人才能复现。比外观整齐更重要的是把什么视为相同、丢掉了什么。

参考资料

使用工具

指南 →