我有许多 csv 文件,每行的逗号数量都不同。我想删除一行中超过 6 个的逗号,但如果只有 6 个逗号,则保留该行。
如果逗号超过 6 个,则此正则表达式会删除多余的逗号:
^([^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*),(.*)$
并替换为
\1\2
我遇到的问题是,如果我对所有文件运行此命令,如果它发现一行只有六个逗号,它就会移动并包含下一行。我如何将其限制为每一行?
感谢大家。
例子:
c1,c2,c3,c4,c5,c6,c7
asdf,asdf,asdf,asdf,asdf,asdf,asdf
asdf,asdf,asdf,asdf,asdf,asdf,asdf,,,asdf,asdf
asdf,asdf,asdf,asdf,asdf,asdf,asdf,,
我希望以此结束:
c1,c2,c3,c4,c5,c6,c7
asdf,asdf,asdf,asdf,asdf,asdf,asdf
asdf,asdf,asdf,asdf,asdf,asdf,asdfasdfasdf
asdf,asdf,asdf,asdf,asdf,asdf,asdf
答案1
问题是[^,]
匹配除 之外的所有字符,
,包括换行符。将其替换为[^,\r\n]
就可以了。
您可以使用数字重复计数来缩短正则表达式:^((?:[^,\r\n]*,){6}[^,\r\n]*),(.*)$
请注意,您的正则表达式将在字段中包含带引号的逗号的 csv 文件中失效。修复此问题非常麻烦,并且取决于您使用的确切 csv 格式。(不幸的是,没有标准。)
还要注意,用 替换正则表达式\1
将删除第七个字段之后的所有内容。如果您确实只想删除逗号并连接所有后面的字段(如示例输出所示),则应使用\1\2
作为替换并反复执行“全部替换”,直到不再找到任何匹配项。
答案2
以下是一次性完成这项工作的方法:
- Ctrl+H
- 找什么:
(?:^(?:.*?,){6}|\G(?!^)).*?\K,
- 用。。。来代替:
LEAVE EMPTY
- 查看 环绕
- 查看 正则表达式
- 取消选中
. matches newline
* - Replace all
解释:
(?: # non capture group
^ # beginning of line
(?: # non capture group
.*? # 0 or more any character, not greedy
, # a comma
){6} # end group, must appear 6 times
| # OR
\G # restart from last match position
(?!^) # negative lookahead, make sure we are not at the beginning of a line
) # end group
.*? # 0 or more any character, not greedy
\K # forget all we have seen until this position
, # a comma
屏幕截图(之前):
屏幕截图(之后):