【问题标题】:How to remove CRLF conditionally from a text file preferably in Notepad ++如何有条件地从文本文件中删除 CRLF,最好在记事本 ++ 中
【发布时间】:2012-05-29 14:03:06
【问题描述】:

我整天都在找这个,这是我找到的最接近的useful ref

我的问题:大文件是从封闭系统导入的(不能从源头更改),需要导入。这些文件是 |分隔并在每行末尾有一个 CRLF (直到最后一个)。现在他们发现在文本中包含一个可以包含 CR 和 CRLF 文本的新类型很有趣(<br> 的 instedd)。

所以在我可以在我们的系统中处理这个文件之前,我需要做的是替换所有没有以 | 开头的 CRLF 和 CR 事件。到<br>,这样每一行都以000|之类的代码开头... 600|

我在记事本++中最接近的: 查找:(?<![\|])[\r\n]+$

替换:<br>

问题是它不会为每个 crlf 提供 <br>,在 cr 之后错过 crlf...其他选择 |crlf 的尝试也完全忘记了 CR。

任何想法都非常感谢。请记住,文件可能超过 500MB(有点复杂)

文件摘录:

000|709076|153943|11||1|CRLF 
300|709076|153943|11|4|20000729||Majo509|CRLF 
500|709076|153943|11|6|3-3BNME|20000729|||21.13|4||20120509|CRLF 
600|709076|153943|11||SBV|7103||||20120509|CRLF 
600|709076|153943|11||SBV|7105||||20120509|CRLF 
600|709076|153943|11||SBV|7607||||20120509|CRLF 
600|709076|153943|11||MC||EVALUATIEROOSTER NIET INGEVULD :CR
CRLF 
------------------------------CR
CRLF 
CRLF 
Gezien U het evaluatierooster niet heeft ingevuld, blijft CR
CRLF 
CRLF 
|||20120509|CRLF 
600|709076|153943|11||SBV|7517||||20120509|CRLF 
000|709209|154072|9||1|Dne|LA1349|3100||L|20120509|CRLF 
300|709209|154072|9|3|20HEM-AT20120509|CRLF 
500|709209|154072|9|6|3-3BNME|20000908|||15.4|3||20120509|CRLF 
600|709209|154072|9||SBV|7103||||20120509|CRLF 
600|709209|154072|9||MC||AFSCHAFFING VAN DE EVOOR HET CR
CRLF 
(DE) GEBOUW(EN) CR
CRLF 
CR
CRLF 
indien U huurder of gebruiker bent.|||20120509|CRLF 
600|709209|154072|9||MC||DIEFSTAL  CRLF 

...

要求的结果:(粗略的复制粘贴作业;))

000|709076|153943|11||1|CRLF 
300|709076|153943|11|4|20000729||Majo509|CRLF 
500|709076|153943|11|6|3-3BNME|20000729|||21.13|4||20120509|CRLF 
600|709076|153943|11||SBV|7103||||20120509|CRLF 
600|709076|153943|11||SBV|7105||||20120509|CRLF 
600|709076|153943|11||SBV|7607||||20120509|CRLF 
600|709076|153943|11||MC||EVALUATIEROOSTER NIET INGEVULD :<BR><BR>---------------------<BR><BR><BR>Gezien U het evaluatierooster niet heeft ingevuld, blijft <BR><BR>||20120509|CRLF 
600|709076|153943|11||SBV|7517||||20120509|CRLF 
000|709209|154072|9||1|Dne|LA1349|3100||L|20120509|CRLF 
300|709209|154072|9|3|20HEM-AT20120509|CRLF 
500|709209|154072|9|6|3-3BNME|20000908|||15.4|3||20120509|CRLF 
600|709209|154072|9||SBV|7103||||20120509|CRLF 
600|709209|154072|9||MC||AFSCHAFFING VAN DE EVOOR HET <BR><BR>(DE) GEBOUW(EN) <BR><BR><BR><BR>indien U huurder of gebruiker bent.|||20120509|CRLF 
600|709209|154072|9||MC||DIEFSTAL  CRLF 

【问题讨论】:

  • 自我和谷歌员工的注意事项;对于更简单的替换要求,请参阅 Notepad++ / Edit / EOL Conversion / 然后选择所需的格式,例如 unix/mac 或 windows 或 old-mac。

标签: regex text import notepad++ regex-negation


【解决方案1】:

哇,这个让我分阶段了一段时间......
一次性完成是很棘手的。

N++ 约束可能使它变得比它需要的更难,但是我想如果没有编写一些代码来做你想做的事情,这是一个很好的方法。

虽然我不确定它是否最佳,但我在这个组合上取得了成功。
查找:

([^|])\r([\r\n])*

替换:

$1

您需要在替换中使用 $1,否则您会从替换的行中丢失一个字符 - 可能不是您想要的!

理想情况下,您应该研究一些 Perl(我不是 perl 的拥护者,可以使用其他处理正则表达式的脚本语言......)或其他相关的东西。

编辑: 只是一个想法。这假设您的文件中不会有包含 |CRLF 或 |CR 或 |CRCR 的部分不是“真正的”行尾。

【讨论】:

  • thnx :) 这给了我一个可行的文件,我不知道替换中的 $1。稍微好一点的结果是每个 cr 和 crlf 替换一个
    而不是每个块一个。但我可以摆脱这个:) tnx 再次
【解决方案2】:

编辑:废弃了我最后的建议 - 没有用

正如 BunjiquoBianco 所建议的,我认为这是不可能一次性完成的。

如果你可以使用 awk 会更好。如果您使用的是 Windows,请尝试http://gnuwin32.sourceforge.net/packages/gawk.htm

如果 awk 是一个可行的选项,请重新提出问题,awk 坚果可能会建议从命令提示符使用单行来解析整个文件。

awk 也很快 - 会给您带来更快的转换,并且可以更轻松地包含在其他脚本中,从而消除任何手动 N++ 过程。

【讨论】:

  • 额外的工具并不是一个真正的选择,这里是一个非常封闭的环境。 tnx 的努力和 gawk dous 看起来很有用
  • Laar 说“额外的工具并不是一个真正的选择”所以如果你不准备使用正确的工具来完成这项工作,那么为什么首先要问这个问题呢?我也曾认为使用 awk 可以轻松解决此问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多