2020-07-03 删除Oracle导出的文本文件中的多余换行符

同事说经常遇到导出的文本文件,用excel打开后有些地方自动换行了,导致错列,要手动逐行在excel中调整后才能透视,很不方便。今天这个文件比较大,里面有问题的行比较多,问我有没有办法处理。
我看了下,23M多的文本文件,初步怀疑是有手动换行符出现在不该出现的地方,即 LF,ASCII码0x0A。把文件放我电脑上,winhex打开是乱码,用notepad++打开不方便确认到底是不是换行符,视图->显示符号->显示所有字符,看到是LF,基本确定了,用UltraEdit看了下,确实是0A,确定了就想办法处理。
观察了下,每行是数据库中的一条记录,以 | 竖线分隔字段,行以 LF 结尾。有问题的行,在描述列或其它某列出现了 LF ,那就要把这些不应该出现的去掉,也就是选择性替换一些 | 为 空。肯定用正则替换啦,看上去不难,以前写过简单的正则。
查找里写 ([^|])\n ,替换里写 \1 ,so easy,替换(文件大,Notepad++花了约1分钟才替换完,真的慢),另存,搞定,导入excel看看。
咦,怎么还报错,对A列筛选下,发现有1行有问题。仔细对照原来的内容,发现是有一行没替换,这行是 | 后面跟了LF然后跟了 20位条码,这种情况也要替换掉,咋整?
再观察,发现正常的是 | 后跟 LF 再跟 7位数字的请求号,那就这样,凡是不满足 LF后面跟7位数字的,统统把 LF 干掉!
继续写正则:
\n[^(\d{7})]
先查找一下看看写的对不对,试了下,咦,不对啊,明明刚才有问题的那行就在眼前,总是提示找不到指定的字符?看来正则表达式写的不对,继续百度找资料,看了几篇,有一篇讲到了,(hello) 可以匹配 hello这个单词,但 ^(hello) 不能匹配不等于 hello的单词,原来如此。继续看,要想匹配除 hello 以外的内容,要用到

(?!pattern) 零宽负向先行断言

/^((?!hello).)+$/