使用Regex替换csv列中的 内容
本文关键字:内容 csv Regex 替换 使用 | 更新日期: 2023-09-27 18:35:07
我的问题如下:
我有一个csv文件,其中一列的数据用双引号("(括起来。
行的末尾是'r'n
(十六进制值:0D0A
(。
我的问题:一列可以包含'r'n
(它通常是一个带有回车符的书面句子(
当我想在excel中加载CSV时,这''r''n被理解为一个新行。
我的问题解决方案是:使用正则表达式执行以下逻辑:
- 以双引号开头、以双引号结尾的列
- 一个真正的新行被标识为''r''n
-
有问题的列以双引号("(开头,包含''r''n并以双引号"结束
对于找到的每个问题列(使用正则表达式(
用空格替换''r''n(十六进制值:20(
结束
使用带有c#的regex
的任何解决方案
非常感谢您的帮助
我想不出简单的方法来找到有问题的条目(并不意味着没有(,但有一种简单的方法可以找到所有用双引号括起来的条目。然后,如果它们有问题,你可以更改它们:
var result = Regex.Replace(input, @"""(?:('r'n)|[^""])+""", delegate(Match m)
{
if (string.IsNullOrEmpty(m.Groups[1].Value))
return m.Value;
return m.Value.Replace("'r'n", " ");
});
可能的问题:
如果您的文件有转义的双引号字符,这可能不起作用。你必须测试它。
我首先假设CSV文件是有效的,并且双引号"
字符不是字段的一部分。
第一个假设对于减少这里的工作量很重要。如果它不成立,您最好使用CSV解析器来解析文件,然后对每个列进行替换。
如果您知道CSV中的双引号是如何转义的,那么第二个假设可以通过一个小的修改来删除。如果""
指定了"
,则将下面代码中的[^'"]
更改为(?:[^'"]|'"'")
。如果'"
指定了"
,则将下面代码中的[^'"]
更改为(?:[^'''''"]|''''.)
。
逐行读取文件并按以下方式处理:
if (Regex.IsMatch(line, "^'"?[^'"]*'"(,'"[^'"]*'")*$")) {
// Write the current line to file with line ending
} else {
// Write the current line to file without line ending
}
为了更容易理解,让我删除字符串文字转义:
^"?[^"]*"(,"[^"]*")*$
对于一个有效的CSV,如果该行没有任何带新行的列,则上面的正则表达式将匹配整行/行,或者如果该行有一些带新行的列则匹配该行的最后一行。我用它来检测哪一行,以避免添加换行符。