我有一个 CSV 文件需要清理。这是一次性的事情,所以如果可能的话,我想在 Notepad++ 中完成。
CSV 文件有两个字段,其中一个用引号括起来。我想从引用的字段中删除任何回车。我试图使用这种模式,但不能完全正确......
(.*)\"(.*)\n(.*)\"(.*)
如果我错了,也请纠正我,但我认为“替换为”值将类似于:
\1\2\3\4
提前致谢。
我也愿意接受替代解决方案,例如快速而肮脏的 PERL 脚本。
After much hunting around StackOverflow I found a regex pattern suggested for a similar problem that I only had to modify slightly from single quote to double quote. I ran it in PERL. It worked great! Unfortunately I can't find the original post to give credit where credit is due.
Anyway, this is what I finally used. Thanks everyone for your help!
$string123 =~ s/((?:^[^"]*"|(?!^))[^"]*?(?:"[^"]*"[^"]*?)*?)(\n{1,})/$1/g;
如果其他人发现这一点,并希望在 notepad++ 中为这个问题提供真正合法的答案,请考虑:
使用段落符号/显示不可见字符命令来显示 CR 和 LF。
现在,请注意,每个 csv 记录末尾的真正换行符通常(取决于创建文件的内容)只有 LF。真正的记录分隔符没有 CR。现在请注意,嵌入在字段中并用引号括起来的回车通常是CR/LF(并排的两个非打印字符,一个 CR 和一个 LF)!
所以现在,这很容易。突出显示 CRLF 组合,拉起 f&r,您的“查找内容:”条目应该是不可打印的 CRLF 组合的两个空框。将替换字段留空,然后运行它。
多田!引号内不再有嵌入的回车,并且所有真实的换行符都保持不变。
Barry 有解决方案,它似乎是我在任何地方都能找到的最佳解决方案,我仔细研究了一番,因为起初我发现这个解决方案在 Perl 中不适合我。
我发现对该正则表达式进行轻微调整是有效的。我不确定这种细微差别的原因,但是 Perl 在查找 \n 时无法找到回车,但确实找到了以十六进制形式 /x0D 表示的回车。
所以,而不是:
$string123 =~ s/((?:^[^"] "|(?!^))[^"] ?(?:"[^"] "[^"] ?) ?)( \n {1 ,})/$1/g;
这对我有用:
$string123 =~ s/((?:^[^"] "|(?!^))[^"] ?(?:"[^"] "[^"] ?) ?)( \x0D {1 ,})/$1/g;
谢谢巴里,很大的帮助!
我遇到了这个问题,并且使用 Notepad++ 占了上风。Shreyas 的回答要么是错误的,要么是过时的,因为现在在正则表达式搜索和替换中使用 \r\n 是可行的。也就是说,我使用了以下内容:
[^"]"(([^"]*)\r\n([^"]*))+"
它的工作方式是匹配:
[somethin0]"[somethin1]NEWLINE[somethin2]"
其中 somethin1 和 somethin2 是 \2 和 \3 (并且 \1 是整个内部部分)并且 somethin0 是分隔符(很可能是逗号)。为了得到我们想要的,我们替换为:
[somethin0]"\2 \3"
并得到预期的结果!嗯,大部分。像这样的单个替换会删除引号内的单个换行符。但是,这应该只是几次发送垃圾邮件replaceAll
按钮的轻微不便(其中“几次”是引号之间存在的最大换行数)
嗯......我的正则表达式很糟糕,我无法回答你的问题。但是,这是一个不错的小 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\"";
这是专门针对记事本++的答案
菜单:TextFX > TextFX Edit > Delete
空行
在该菜单项中还有一个删除剩余空白行选项。
Notepad++ 的问题在于它不允许您运行带有特殊字符(如 \n 或 \t)的正则表达式。正则表达式必须是纯正则表达式,对于特殊字符,有扩展搜索模式。
如果可能的话,我建议你在 Eclipse 上运行你的正则表达式。
如果那不可能,这是一个快速而肮脏的解决方案
将所有 \n 替换为特殊字符,例如 # 或 & 否则不会出现在您的文件中。
接下来运行您的正则表达式以在引号中查找此特殊字符并将其删除
最后用 \n 替换剩余的特殊字符
单击 π 按钮以显示隐藏的字符。然后选择一个回车符。按 Ctr+H 并替换为空字符串
希望对你有效。