如何在EmEditor中用grep处理大型CSV文件并追加信息保留原数据
问题描述
我有一个超100万行的大型CSV文件huge_database.csv,结构如下:
name,phone,email,check_result,favourite_fruit sam,64654664,sam@example.com,, sam2,64654664,sam2@example.com,, sam3,64654664,sam3@example.com,, [...]
另外还有三个邮件列表文件:
good_emails.txt:sam@example.com sam3@example.combad_emails.txt:sam2@example.comlikes_banana.txt:sam@example.com sam2@example.com
希望通过操作得到如下格式的输出文件:
sam,64654664,sam@example.com,y,banana sam2,64654664,sam2@example.com,n,banana sam3,64654664,sam3@example.com,y,
需求说明:
- 可接受多步骤手动操作,需保证可靠性,且能处理超100万行的大型CSV文件;
- 仅约20%的行需修改,剩余80%数据需保持原样及原有顺序;
- 使用EmEditor软件而非Excel,因Excel无法处理大型CSV文件。
分步实现方案
准备工作
先把三个邮件列表里的空行清掉,避免匹配出错:
- 打开
good_emails.txt,按Ctrl+H调出替换框,切换到正则模式,查找^\s*$,替换为空,点“全部替换”后保存。 bad_emails.txt和likes_banana.txt也照此操作,保证每行只有一个邮箱。
步骤1:填充check_result列(y/n)
- 用EmEditor打开
huge_database.csv,按Ctrl+Shift+F打开高级查找,选择正则表达式模式。 - 处理合格邮箱(good_emails):
- 查找内容:
^([^,]+,[^,]+,)(sam@example.com|sam3@example.com)(,,)$ - 替换内容:
\1\2,y, - 点击“全部替换”,所有在good列表里的邮箱行,
check_result会自动设为y。
要是good列表里邮箱太多,手动写正则麻烦,就用EmEditor的“从文件载入查找字符串”功能,把
good_emails.txt内容转成(邮箱1|邮箱2|...)的格式再嵌入查找规则。 - 查找内容:
- 处理不合格邮箱(bad_emails):
- 查找内容:
^([^,]+,[^,]+,)(sam2@example.com)(,,)$ - 替换内容:
\1\2,n, - 点击“全部替换”,bad列表里的邮箱行
check_result会自动设为n。
- 查找内容:
步骤2:填充favourite_fruit列(banana或留空)
- 继续在
huge_database.csv中使用高级查找(正则模式)。 - 处理喜欢香蕉的邮箱(likes_banana):
- 精准查找内容:
^([^,]+,[^,]+,)(sam@example.com|sam2@example.com),([yn],)$ - 替换内容:
\1\2,\3banana - 点击“全部替换”,这些行的
favourite_fruit会自动填上banana。
- 精准查找内容:
- 剩下未匹配到的行,
favourite_fruit列保持空值即可,无需额外操作。
大量邮箱的批量处理技巧
要是三个列表里邮箱成百上千,手动写正则太费劲,用命令行生成匹配串:
- 比如用Git Bash或Windows cmd处理
good_emails.txt:
这会把所有邮箱拼成tr '\n' '|' < good_emails.txt | sed 's/|$//' > good_regex.txt邮箱1|邮箱2|邮箱3的格式,直接复制到EmEditor的查找规则里就行。 - 把生成的串套进之前的查找模板,比如
^([^,]+,[^,]+,)([生成的正则串])(,,)$,再执行替换。
收尾验证
- 替换完成后随机抽查若干行,确认
check_result和favourite_fruit列的内容符合要求。 - 用EmEditor的“另存为”功能保存修改后的文件(比如
updated_database.csv),避免覆盖原始数据,留好备份。
内容的提问来源于stack exchange,提问作者markothehacker
相关产品推荐
相关产品推荐

