4

我有一个 CSV 文件需要清理。这是一次性的事情,所以如果可能的话,我想在 Notepad++ 中完成。

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

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

如果我错了,也请纠正我,但我认为“替换为”值将类似于:

\1\2\3\4

提前致谢。

我也愿意接受替代解决方案,例如快速而肮脏的 PERL 脚本。

4

8 回答 8

2

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; 
于 2009-06-24T17:49:40.290 回答
2

如果其他人发现这一点,并希望在 notepad++ 中为这个问题提供真正合法的答案,请考虑:

使用段落符号/显示不可见字符命令来显示 CR 和 LF。

现在,请注意,每个 csv 记录末尾的真正换行符通常(取决于创建文件的内容)只有 LF。真正的记录分隔符没有 CR。现在请注意,嵌入在字段中并用引号括起来的回车通常是CR/LF(并排的两个非打印字符,一个 CR 和一个 LF)!

所以现在,这很容易。突出显示 CRLF 组合,拉起 f&r,您的“查找内容:”条目应该是不可打印的 CRLF 组合的两个空框。将替换字段留空,然后运行它。

多田!引号内不再有嵌入的回车,并且所有真实的换行符都保持不变。

于 2012-04-12T18:33:42.710 回答
1

Barry 有解决方案,它似乎是我在任何地方都能找到的最佳解决方案,我仔细研究了一番,因为起初我发现这个解决方案在 Perl 中不适合我。

我发现对该正则表达式进行轻微调整是有效的。我不确定这种细微差别的原因,但是 Perl 在查找 \n 时无法找到回车,但确实找到了以十六进制形式 /x0D 表示的回车。


所以,而不是:

$string123 =~ s/((?:^[^"] "|(?!^))[^"] ?(?:"[^"] "[^"] ?) ?)( \n {1 ,})/$1/g;


这对我有用:

$string123 =~ s/((?:^[^"] "|(?!^))[^"] ?(?:"[^"] "[^"] ?) ?)( \x0D {1 ,})/$1/g;

谢谢巴里,很大的帮助!

于 2011-08-03T19:54:30.257 回答
1

我遇到了这个问题,并且使用 Notepad++ 占了上风。Shreyas 的回答要么是错误的,要么是过时的,因为现在在正则表达式搜索和替换中使用 \r\n 是可行的。也就是说,我使用了以下内容:

[^"]"(([^"]*)\r\n([^"]*))+"

它的工作方式是匹配:

[somethin0]"[somethin1]NEWLINE[somethin2]"

其中 somethin1 和 somethin2 是 \2 和 \3 (并且 \1 是整个内部部分)并且 somethin0 是分隔符(很可能是逗号)。为了得到我们想要的,我们替换为:

[somethin0]"\2 \3"

并得到预期的结果!嗯,大部分。像这样的单个替换会删除引号内的单个换行符。但是,这应该只是几次发送垃圾邮件replaceAll按钮的轻微不便(其中“几次”是引号之间存在的最大换行数)

于 2014-08-20T08:33:47.013 回答
0

嗯......我的正则表达式很糟糕,我无法回答你的问题。但是,这是一个不错的小 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\"";
于 2009-06-23T20:23:03.573 回答
0

这是专门针对记事本++的答案

菜单:TextFX > TextFX Edit > Delete空行

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

于 2010-05-14T14:01:55.723 回答
0

Notepad++ 的问题在于它不允许您运行带有特殊字符(如 \n 或 \t)的正则表达式。正则表达式必须是纯正则表达式,对于特殊字符,有扩展搜索模式。

如果可能的话,我建议你在 Eclipse 上运行你的正则表达式。

如果那不可能,这是一个快速而肮脏的解决方案

将所有 \n 替换为特殊字符,例如 # 或 & 否则不会出现在您的文件中。

接下来运行您的正则表达式以在引号中查找此特殊字符并将其删除

最后用 \n 替换剩余的特殊字符

于 2009-06-23T19:10:23.487 回答
0

单击 π 按钮以显示隐藏的字符。然后选择一个回车符。按 Ctr+H 并替换为空字符串

希望对你有效。

于 2009-06-23T19:29:23.307 回答