过滤文本文件中与数组中任何元素不匹配的行

时间:2018-01-25 12:48:17

标签: ruby

我有一个如下文本文件,

Joe is in London,    
Sathish in Newyork,   
Pandu in Sydney

其行主要与数组的元素匹配:

Array = [London, Newyork]

文本文件和数组在内容和大小方面都是动态的。

如何过滤与给定数组中的任何元素不匹配的行?如何从文本文件中过滤行"Pandu in Sydney"行?

2 个答案:

答案 0 :(得分:1)

require 'set'

首先让我们创建文件。

arr =<<_
Joe is in London, England,    
Sathish in Newyork,   
Pandu in Sydney
_

FName = 'test'
File.write(FName, arr)
  #=> 70

我们获得了targets

targets = ["London", "Newyork"].to_set
  #=> #<Set: {"London", "Newyork"}>

我们现在可以逐行阅读文件,选择至少包含targets中的一个词的行:

File.foreach(FName).select { |line|
  line.strip.tr(',', '').split.any? { |word| targets.include? word } }
  #=> ["Joe is in London, England,\n", "Sathish in Newyork,\n"]

我本可以使targets成为一个数组,而不是一个集合,但使用集合时单词查找要快得多,尤其是targets很大时。

如果知道城市总是每行的最后一个字,我们可以简化。

str =<<_
Joe is in London,
Sathish in Newyork,
Pandu in Sydney,
_

File.write(FName, str)

File.foreach(FName).select { |line|
  targets.include?(line.rstrip.tr(',', '')[/\b\p{L}+\z/]) }
  #=> ["Joe is in London,\n", "Sathish in Newyork,\n"]

答案 1 :(得分:0)

假设数组包含字符串,那么这样的工作会起作用吗?

text.each_line.reject {|line| cities.any?{|city| line.match?(/\w+\s+in\s+#{city}/)}}

我不知道您是否要直接从文本或程序逻辑中删除行。这会让你回到一系列“未知城市”的路线。