0

我有一个来自数据日志的文本文件,该文件应该是数据行,填充空格,使每行长度为 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

但这会将 \n 附加到每一行。我可以使用 NotePad++ 删除空白行,但我想知道是否有更聪明的方法。

谢谢你的帮助!

4

2 回答 2

1

正如评论所提到的,使用实际的编程语言会比正则表达式更可靠。但是,如果您无法使用编程语言,这里有一个应该可以工作的正则表达式。

(.{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,}

使用此版本的问题是{1,}“替换”正则表达式通常不支持重复组语法。

于 2022-01-13T20:41:41.987 回答
0

只需更改您的“查找”正则表达式以可选地匹配尾随换行符序列:

Find: (.{197})(\r\n)?
Replace: $1\r\n

这将始终匹配(.{197}),但只有\r\n在它存在时才匹配。

于 2022-01-13T22:36:27.500 回答