在 x 个章程后添加新行(修复损坏的文件)
Add new line after x charters (repair corrupted file)
我有一个来自数据记录的文本文件,该文件应该是数据行,space 填充以便每行长 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 search/replace:
Find: (.{197}!\r)
Replace with: \r\n
这个returns没有命中。如果我没有 !\r
,它会找到每一行(因为它们都是 197 个字符长)。
我一直在手动添加 LF,但我想我有几千行这样的行......仅在这个文件中......!所以我真的很想自动化这个。
我可以使用 RegEx 来:
Find: (.{197})
Replace with: \r\n
但这会将 \n 附加到每一行。我只能用NotePad++去掉空行,但我想知道有没有更聪明的方法
感谢您的帮助!
如评论所述,使用实际的编程语言比正则表达式更可靠。但是,如果您无法使用编程语言,这里有一个正则表达式应该可以使用。
(.{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,}
在“替换”正则表达式中通常不受支持。
只需将您的“查找”正则表达式更改为可选匹配尾随换行符序列:
Find: (.{197})(\r\n)?
Replace: \r\n
这将始终匹配 (.{197})
,但仅匹配存在的 \r\n
。
我有一个来自数据记录的文本文件,该文件应该是数据行,space 填充以便每行长 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 search/replace:
Find: (.{197}!\r)
Replace with: \r\n
这个returns没有命中。如果我没有 !\r
,它会找到每一行(因为它们都是 197 个字符长)。
我一直在手动添加 LF,但我想我有几千行这样的行......仅在这个文件中......!所以我真的很想自动化这个。
我可以使用 RegEx 来:
Find: (.{197})
Replace with: \r\n
但这会将 \n 附加到每一行。我只能用NotePad++去掉空行,但我想知道有没有更聪明的方法
感谢您的帮助!
如评论所述,使用实际的编程语言比正则表达式更可靠。但是,如果您无法使用编程语言,这里有一个正则表达式应该可以使用。
(.{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,}
在“替换”正则表达式中通常不受支持。
只需将您的“查找”正则表达式更改为可选匹配尾随换行符序列:
Find: (.{197})(\r\n)?
Replace: \r\n
这将始终匹配 (.{197})
,但仅匹配存在的 \r\n
。