用Notepad++正则修复含额外竖线的13列竖线分隔文件
修复竖线分隔文件的列数异常:统一为13列的正则方案
问题场景
我们有一个以竖线(|)为分隔符的文本文件,导出时未使用文本限定符,导致部分行的文本内容中包含竖线,使得这些行的列数超出了原本固定的13列(部分行多3-4列不等)。需要实现一个适配任意超列数的正则方案,将第10个竖线之后、最后两个竖线之前的所有额外竖线替换为空格,把所有行统一修复为13列。此前尝试的正则仅对14列的行有效,无法适配更多列的情况。
示例
原异常行:
5070599047|SA|03/31/2023 00:00:00|04/03/2023 00:00:00|23121|152|65642.950000|0|0|XP-OFS-222761665|ZIB|BRH|NPAU|31-03-2023|749542|30271246.390000|342
期望修复结果:
5070599047|SA|03/31/2023 00:00:00|04/03/2023 00:00:00|23121|152|65642.950000|0|0|XP-OFS-222761665|ZIB BRH NPAU 31-03-2023 749542|30271246.390000|342
正则解决方案
通用正则(适配多数文本编辑器/命令行工具)
查找模式
\|(?<=^(?:[^|]+\|){10})(?=.*\|[^|]+\|[^|]+$)
替换内容
(输入一个空格即可)
正则逻辑解释
\|:精准匹配需要替换的竖线(?<=^(?:[^|]+\|){10}):正向回溯断言,确保当前竖线前已经有10个完整的字段(每个字段为「非竖线内容+竖线」的组合,共10组)(?=.*\|[^|]+\|[^|]+$):正向预查断言,确保当前竖线后至少还有两个完整的字段(对应原文件的最后两列)
这个正则会自动定位所有符合条件的额外竖线,不管中间多多少列,都能一次性替换为空格,最终将所有行统一为13列。
工具使用示例
- Notepad++:打开目标文件,按
Ctrl+H打开替换窗口,勾选「正则表达式」模式,输入上述查找内容和替换空格,点击「全部替换」 - VS Code:打开文件,按
Ctrl+Shift+H打开替换面板,勾选「正则表达式」选项,输入查找内容和替换空格,点击「替换全部」 - sed(Linux/macOS):执行以下命令批量处理文件:
sed -E 's/\|(?<=^(?:[^|]+\|){10})(?=.*\|[^|]+\|[^|]+$)/ /g' input.txt > output.txt
内容的提问来源于stack exchange,提问作者Emmanuel Salau
相关产品推荐
相关产品推荐

