我正在使用EmEditor,我看到有一个支持正则表达式语句的"查找并提取到新文档"函数。 我正在尝试从雷鸟邮箱文本文件中提取一些特定文本。邮箱中有客户服务聊天的副本。不幸的是,由于我们使用此聊天程序的免费版本,因此不允许导出数据。在电子邮件的正文中有很多文本,包括聊天和解码的附件。但是在每个聊天的底部是姓名,电子邮件,公司名称等。
它看起来像这样:
Name: Tan
Email: someone@domcin.com
Operator: OperatorName
Start Time: 07/01/2014 14:43:47
End Time: 07/01/2014 15:35:22
Product/Service: Delivery
Phone: 123 1234567
Company: MyCompany Inc.
我尝试提取名称,电子邮件,运营商,产品,电话和公司。更糟糕的是,并不是所有人都有公司,因为也有私人。此外,电话有时有+60或(60(或空格,因为聊天用户可以输入我们想要的内容。我可以手动执行此操作,但它有 6k 个条目。
问题是是否会有一个正则表达式语句来找到它们。然后,我可以使用EmEditor找到此块并将结果放在新文档中,并且经过一些调整,我应该能够制作一个Excel文件以导入CRM。
如果这不适用于正则表达式,那么有没有人知道一种聪明的方法可以做到这一点,所以我不必复制和粘贴所有这些?
您可以使用以下正则表达式来实现结果:
^(?:Name|Email|Operator|Start Time|End Time|Product/Service|Phone|(?:Company?)).*$
上述正则表达式的解释:
^
- 表示给定测试字符串的开头。
(?:Name|Email|Operator|Start Time|End Time|Product/Service|Phone|(?:Company?))
- 表示包含任何一个给定字段的非捕获组。注意字段Company
在匹配中可能出现 0 或 1 次。
|
- 表示交替。
.*
- 这贪婪地匹配除换行符以外的任何内容。
$
- 表示给定测试字符串的结尾。
您可以在此处找到上述正则表达式的演示。
如果我正确理解您的问题,您希望广泛地操作您的源文件,以便将其转换为某种 csv 以便在 excel 中加载等。
使用EmEditor,您可以尝试以下步骤(假设提到的示例字段(:
1( 删除空行 [可选]
2( 查找:^(.*(\r?(?!名称( 替换:\1\t
3( 查找:((名称|邮箱|操作员|开始时间|结束时间|产品/服务|电话|公司(: ?替换:[不留空 ]
4( 添加标题行
我已将其汇总到一个宏中,您可以在源文件的副本上尝试,并希望提供一个制表符分隔的输出文件:
editor.ExecuteCommandByID(3882); //Heading = 0
editor.ExecuteCommandByID(4323); //Remove existing bookmarks
document.selection.Find("^[ \t]*$x0a",eeFindNext | eeFindReplaceCase | eeFindReplaceRegExp | eeFindCount | eeFindBookmark,0); //Bookmark blank lines
editor.ExecuteCommandByID(4589); //Delete Bookmarked lines
document.selection.Replace("^(.*)\r?\n(?!Name)","\1\t",eeFindReplaceCase | eeReplaceAll | eeFindReplaceRegExp,0); //Find:^(.*)r?n(?!Name) R:^(.*)r?n(?!Name)
document.selection.Replace("((Name|Email|Operator|Start Time|End Time|Product\/Service|Phone|Company): ?)","",eeFindReplaceCase | eeReplaceAll | eeFindReplaceRegExp,0); //Find:((Name|Email|Operator|Start Time|End Time|Product/Service|Phone|Company): ?) R:[blank]
document.selection.StartOfDocument(false); //Ctrl-Home, insert blank line, and header line
document.selection.NewLine(1);
document.selection.StartOfDocument(false); //Ctrl-Home
document.write("NametEmailtOperatortStart TimetEnd TimetProduct/ServicetPhonetCompany"); editor.ExecuteCommandByID(3901); // Adjust separator visible lines only
editor.ExecuteCommandByID(3894); //Heading=1