迭代在Ruby中搜索两个文件之间的多个字符串

时间:2014-09-09 14:01:59

标签: ruby

我觉得这应该很容易,但我没有经验并且不知所措。基本上,我有两个文件具有相似的数据,但格式不同。我想阅读文件1并找到每行中的关键数据。然后我想获取关键数据,看它是否存在于文件2的任何行中。

例如,File01包含如下所示的行:

- September 08, 2014 at 06:03PM - Task 1  @done 

- September 08, 2014 at 06:21PM - Task 2  @done 

- September 09, 2014 at 08:04AM - Task 3  @done 

- September 09, 2014 at 08:28AM - Task 4  @done 

File02包含如下所示的行:

2014-09-08,18:03,Entry,Tag,Completed: Task 1,Location,10001,City,ST,United States,99.999999,-99.99999
2014-09-09,08:04,Entry,Tag,Completed: Task 3,Location,10001,City,ST,United States,99.999999,-99.99999
2014-09-09,08:28,Entry,Tag,Completed: Task 4,Location,10001,City,ST,United States,99.999999,-99.99999

在此示例中,缺少任务2。所以我试图找到任务项,看它是否存在于第二个文件中,如果没有,则打印缺少的任务 - 在本例中为“任务2”。

以下是我找到任务名称的方法:

f1 = File.readlines('/Users/path/to/File01.txt')
f1.each do |line|
    /-\s(?<t>.*)\s-\s(?<data>.*)(?<end>@done)/ =~ line
    if data != nil
    puts data
    end
end

grep搜索很好并且产生了我需要的结果,但我无法弄清楚如何获取这些数据然后在第二个文件中搜索它。

1 个答案:

答案 0 :(得分:1)

根据您的语料库,您可以将逻辑分解为要搜索的任务,以及要搜索的日志文件。例如:

tasks = File.read('File01.txt').scan /Task \d+/
log   = File.read 'File02.txt'
tasks.each { |t| puts "Task missing: #{t}" if log !~ /#{t}(?=,)/ }

这会扫描您的输入文件以查找任务列表,然后使用正向前瞻扫描日志文件以查找每个任务的匹配项,以确保您匹配正确的任务编号(例如,任务1没有&#39; t也匹配任务11)。例如,您的语料库会产生以下结果:

  

任务缺失:任务2