我有一个来自数据日志的文本文件,该文件应该是数据行,用空格填充,每行197个字符长,以LF结尾。一些LF丢失了,所以下一行与上一行相连。例如,第1行很好,第2行缺少LF,因此第3行与之相连(还有几行!(:
IO.Unit._1.BottomBoard.Iin._1.AmpsA ,Current A Pump 1 ,29,57.80 ,0001641474794.344049,0000356036
PumpControl.Pump._1.PumpReverse.Reversing ,Pump 1 Reversing ,28,2875 ,0001641474794.026816,0000356035Faults.Pump._1.ThermalOverload.Status.Active ,Pump 1 Tripped ,24,1 ,0001641474793.000000,0000356034Faults.Pump._1.NotInAuto.Status.Active ,Pump 1 Unavailable ,24,1 ,0001641474793.000000,0000356033Faults.Pump._1.Flow.LowFlowFault.Status.Active ,Pump 1 Low Flow ,24,2 ,0001641474792.000000,0000356032Faults.Pump._1.Flow.LowFlowFault.Status.Active ,Pump 1 Low Flow ,24,4 ,0001641474792.000000,0000356031Faults.Pump._1.Flow.LowFlowFault.Status.Active ,Pump 1 Low Flow ,24,3 ,0001641474734.000000,0000355950IO.Unit._1.BottomBoard.Iin._1.AmpsB ,Current B Pump 1 ,29,0.00 ,0001641474724.555403,0000355949
有没有一种简单的方法可以找到字符198何时不是LF,并插入LF?我已经在NotePad++中尝试过RegEx搜索/替换:
查找:(.{197}!\r(
替换为:$1\r\n
这不会返回任何命中。如果我没有!r
,它会查找每一行(因为它们都是197个字符长(。
我一直在手动添加LF,但我想我有几千条这样的线。。。就在这个文件里!!所以我真的很想把它自动化。
我可以使用RegEx:
查找:(.{197}(
替换为:$1\r\n
但这会附加到每一行。我可以使用NotePad++删除空行,但我想知道是否有更聪明的方法。
谢谢你的帮助!
如注释所述,使用实际的编程语言将比regex更可靠。然而,如果您不能使用编程语言,这里有一个regex应该可以工作。
(.{197})(?!(?:r|n))
演示
(.{197}) - Grab the first 197 characters of the line
(?!(?:r|n)) - negative lookahead. If the 198th character is a n or r it won't match
锚定问题
正则表达式没有锚定在行的开头,并且从开头开始计算197个字符。如果你想从行的开头锚定并捕获行中的所有记录,你需要做这样的事情:
^(?:(.{197})(?!(?:r|n))){1,}
使用这个版本的问题是重复组语法CCD_;替换";正则表达式。
只需更改您的"查找";regex到(可选(匹配尾部换行序列:
Find: (.{197})(rn)?
Replace: $1rn
这将始终与(.{197})
匹配,但只有在rn
存在的情况下才匹配。