【发布时间】:2018-03-08 12:08:05
【问题描述】:
我得到了这个项目,我想检查一个电子邮件地址是否存在于两个或多个 csv 文件中。文件的数量可能会有所不同,它们的前缀也会有所不同,但它们将始终存储在同一目录中。
我需要以下帮助
- 一种在两个或多个文件中查找匹配项的方法。
- 一次搜索整个目录
- 将存在匹配地址的所有行写入新文件。
- 指出我可以将它用于脚本的方向,我可以将它与“if”语句一起使用,并与 webb 应用程序一起使用。
我看过
extracting rows from CSV file based on specific keywords
但这需要我知道我正在寻找的电子邮件地址,而我不知道。
对于有大量时间的人,在下面的文章中,您可以找到我到目前为止“实现”的内容以及原始文件和所需输出的示例。
将被检查的原始文件示例。行数可以变化。电子邮件地址有时也可以在第 1 列以外的其他列中找到。因此也许建议使用关键字方法?这是我还没有完成的事情。
example.csv
IP ADDRESS, FIRST TIME LOGGED IN, LAST TIME LOGGED IN, USERNAME
192.168.1.1 , 2018-03-07 11:33:22, 2018-03-07 11:33:28, Federov
E-MAIL ADDRESS, FIRST TIME LOGGED IN, LAST TIME LOGGED IN, USERNAME,
schultz@mail.com, 2018-03-07 09:33:22, 2018-03-07 11:33:28, Boris Becker
对于保存的文件和 webb 应用程序,期望的结果类似于以下内容。
Result.csv
Match
E-MAIL ADDRESS, FIRST TIME LOGGED IN, LAST TIME LOGGED IN, USERNAME
schultz@mail.com, 2018-03-07 09:33:22, 2018-03-07 11:33:28, Boris Becker
schultz@mail.com, 2017-01-07 14:56:12, 2018-01-18 18:44:03, McEnroe
这是我目前得到的:
我尝试将我的“逐步”方法放入一个字符串中。我在一个文件夹中运行了这个字符串,其中有两个具有一个匹配地址的 .csv 文件。但是我收到零,什么都没有,nada ..没有错误消息,文件中也没有任何内容。字符串如下所示:
awk '/E-MAIL/{y=1;next}y' *.csv | awk '{print $1}' FS="," | awk 'FNR==NR{arr[$1];next}$1 in arr{print $1,"match"}' > results.csv
一步一步它可以工作,但对每个文件都这样做是一项艰巨的工作。我还必须创建新文件才能使其正常工作。
awk '/E-MAIL/{y=1;next}y' file-0A.csv > /test/file-0B.csv`
awk '{print $1}' FS="," file-0B.csv > /test/file-1A.csv
awk 'FNR==NR{arr[$1];next}$1 in arr{print $1,"match"}' file-1A.csv file-1B.csv > /test/results.csv
除了荒谬乏味而且可能很愚蠢之外,这种方法或至少在它的当前状态下,只允许在两个文件之间进行匹配,添加第三个将使它看起来需要找到匹配在所有三个文件中,而不是在任何两个所需的文件中......
此外,当前方法(如果您甚至可以称其为方法)在执行匹配步骤时不允许将附加信息与电子邮件地址一起提供,因为这将匹配例如日期或时间。 .我也不知道将此输出用于“if”语句..
操作系统是具有 root 权限的 Raspian Stretch。
如果我没有包含任何重要信息、拼写错误或以错误的方式提出此问题,我深表歉意。
非常感谢任何帮助!
【问题讨论】:
-
一些快速 cmets:
awk '/E-MAIL/{y=1;next}y'将打印第一行之后的每一行/E-MAIL/,您永远不会将y重置为0。其次,您提到电子邮件可能出现在任何列中,那么您如何使标题正确? -
好点,列会有所不同,但 csv 文件将始终有一个标题为“E-MAIL ADDRESS”的列
-
其他问题:您是否要检查
file0中的电子邮件是否在file1..filen。或者您是否要检查file0...filen是否有重复的电子邮件。最重要的是,您的示例Result.csv有一个清晰的标题,如果电子邮件位于另一个字段中,则该标题可能不匹配。关键是,您的要求有点不清楚。 -
好的,很抱歉,如果不清楚我的要求。把它煮沸;无论 csv 文件名如何(filen、file0 等),检查电子邮件是否存在于多个 csv 文件中。如果发现我不止一个文件,将电子邮件写入一个新文件。最好是电子邮件所在的整行。
标签: python csv if-statement awk match