【问题标题】:Using Regex to remove Carriage Returns in a CSV file in Notepad++在 Notepad++ 中使用正则表达式删除 CSV 文件中的回车
【发布时间】:2009-06-23 18:59:38
【问题描述】:

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

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

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

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

\1\2\3\4

提前致谢。

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

【问题讨论】:

    标签: regex csv notepad++


    【解决方案1】:

    在对 StackOverflow 进行大量搜索后,我发现了一个针对类似问题提出的正则表达式模式,我只需将单引号稍微修改为双引号即可。我在 PERL 中运行它。效果很好!不幸的是,我找不到原始帖子来给予应得的功劳。

    不管怎样,这是我最后用的。感谢大家的帮助!

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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


        所以,而不是:

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


        这对我有用:

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

        谢谢巴里,帮了大忙!

        【讨论】:

          【解决方案4】:

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

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

          它的工作方式,就是它匹配:

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

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

          [somethin0]"\2 \3"
          

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

          【讨论】:

            【解决方案5】:

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

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

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

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

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

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

            【讨论】:

            • 快速和肮脏是在正确的轨道上。 >用特殊字符替换所有 \n 说 # 或 & 否则不会出现在您的文件中 这使 CSV 文件成为单行,因为所有新行都被替换为特殊字符。到现在为止还挺好。 >接下来运行您的正则表达式以在引号中查找此特殊字符并将其删除这删除了文件中的所有内容。不好。我猜我的正则表达式现在需要修改以处理单行输入字符串...
            【解决方案6】:

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

            希望它对你有用。

            【讨论】:

            • 我只想替换引号内的回车,这将替换所有。
            【解决方案7】:

            嗯...我的正则表达式很糟糕,我无法回答您的问题。但是,这里有一个不错的 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\"";
            

            【讨论】:

              【解决方案8】:

              这里是专门针对 Notepad++ 的答案

              菜单:TextFX &gt; TextFX Edit &gt; Delete 空行

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

              【讨论】:

                猜你喜欢
                • 2023-03-25
                • 1970-01-01
                • 2021-10-13
                • 1970-01-01
                • 2019-05-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-10-03
                相关资源
                最近更新 更多