使用Regex在Notepad ++中删除CSV文件中的回车符

时间:2009-06-23 18:59:39

标签: regex csv notepad++

我有一个需要清理的CSV文件。这是一次性的事情,所以我想在Notepad ++中尽可能这样做。

CSV文件有两个字段,其中一个用引号括起来。我想从引用字段中删除任何回车。我试图使用这种模式,但不能正确...

(.*)\"(.*)\n(.*)\"(.*)

如果我错了,也要纠正我,但我认为“替换为”值将是:

\1\2\3\4

提前致谢。

我也对替代解决方案持开放态度,例如快速和脏的PERL脚本。

8 个答案:

答案 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空行

在该菜单项中还有一个删除剩余空白行选项。