我有一个需要清理的CSV文件。这是一次性的事情,所以我想在Notepad ++中尽可能这样做。
CSV文件有两个字段,其中一个用引号括起来。我想从引用字段中删除任何回车。我试图使用这种模式,但不能正确...
(.*)\"(.*)\n(.*)\"(.*)
如果我错了,也要纠正我,但我认为“替换为”值将是:
\1\2\3\4
提前致谢。
我也对替代解决方案持开放态度,例如快速和脏的PERL脚本。
答案 0 :(得分:2)
在StackOverflow周围狩猎之后,我发现了一个类似问题的正则表达式模式,我只需要从单引号到双引号略微修改。我在PERL中运行它。它工作得很好!不幸的是,我无法找到原始帖子,以便在信用到期时给予信用。
无论如何,这是我最终使用的。谢谢大家的帮助!
$string123 =~ s/((?:^[^"]*"|(?!^))[^"]*?(?:"[^"]*"[^"]*?)*?)(\n{1,})/$1/g;
答案 1 :(得分:2)
如果其他人发现这一点,并希望在记事本++中找到这个问题的真正合法答案,请考虑:
使用段落符号/ show invisible characters命令显示CR和LF。
现在,请注意,每个csv记录末尾的真行提取通常(取决于创建文件的内容)只有LFs。真正的记录分隔符没有CR。现在注意到嵌入字段并用引号括起来的回车符通常是 CR / LFs(两个非打印字符并排,CR和LF)!
所以现在,它很容易。突出显示CRLF组合,拉出f& r,并且'find what:'条目应该是两个空框,用于不可打印的CRLF组合。将替换字段留空,然后运行它。
TADA!在引号内不再有嵌入式回车符,并且所有for-real换行都保持不变。
答案 2 :(得分:1)
Barry有解决方案,它似乎是我可以在任何地方找到的最佳解决方案,我看了很长时间,因为我发现,起初,这个解决方案在Perl中不起作用。
我发现对该正则表达式略有调整。我不确定这种细微差别的原因,但Perl在查找\ n时找不到回车符但是确实找到以十六进制格式/ x0D表示的回车符。
所以,而不是:
$ string123 = ~s /((?:^ [^“] ”|(?!^))[^“] ?(?:”[^“] ” [^“] )的)( \ n {1,})/ $ 1 /克;?
这对我有用:
$ string123 = ~s /((?:^ [^“] ”|(?!^))[^“] ?(?:”[ ^ “] ”[^“]的))( \ X0D {1,})/ $ 1 /克;?
谢谢巴里,大帮忙!
答案 3 :(得分:1)
我遇到过这个问题并且使用Notepad ++占了上风。 Shreyas的回答是错误的或过时的,因为现在在regexp中使用\ r \ n搜索和替换作品。那说我使用了以下内容:
[^"]"(([^"]*)\r\n([^"]*))+"
它的工作方式是匹配:
[somethin0]"[somethin1]NEWLINE[somethin2]"
其中somethin1和somethin2是\ 2和\ 3(和\ 1是整个内部部分),somethin0是分隔字符(最可能是逗号)。为了得到我们想要的东西,我们用以下代替:
[somethin0]"\2 \3"
获得预期的结果!好吧,主要是。单个替换就像删除了引号中的单个换行符。但是,这应该只是一次轻微的垃圾邮件replaceAll
按钮几次(其中“几次”是引号之间存在的最大新行数)
答案 4 :(得分:0)
Notepad ++的问题在于它不允许您使用\ n或\ t等特殊字符运行正则表达式。正则表达式必须是纯正则表达式,对于特殊字符,有扩展搜索模式。
我建议你尽可能在Eclipse上运行你的正则表达式。
如果那不可能,这是一个快速而肮脏的解决方案
将所有\ n替换为特殊字符,例如#或&否则将不会出现在您的文件中。
接下来运行你的正则表达式,在引号中查找这个特殊字符并删除它
最后用\ n
替换剩余的特殊字符答案 5 :(得分:0)
单击π按钮显示隐藏的字符。 然后选择一个回车符。 按Ctr + H并替换为空字符串
希望它适合你。
答案 6 :(得分:0)
嗯......我的RegEx非常糟糕,我无法回答你的问题。但是,这是一个很好的小JS函数,你可以使用它应该能够做你想要的。
function removeNewLines(str){
var quotedStrings = str.split(/["'](.*)?["']/g),
i = 0;
for( ; i < quotedStrings.length; i++){
str = str.replace(quotedStrings[i], quotedStrings[i].replace(/[\r\n]/g,""));
}
return str;
}
removeNewLines("\"asdf\r\nas\"asdf\'as\nd\'asdf\"asdf\r\nasf\r\n\"") === "\"asdfas\"asdf'asd'asdf\"asdfasf\"";
答案 7 :(得分:0)
以下是专门针对Notepad ++的答案
菜单:TextFX > TextFX Edit > Delete
空行
在该菜单项中还有一个删除剩余空白行选项。