我有一个如下文本文件,
Joe is in London,
Sathish in Newyork,
Pandu in Sydney
其行主要与数组的元素匹配:
Array = [London, Newyork]
文本文件和数组在内容和大小方面都是动态的。
如何过滤与给定数组中的任何元素不匹配的行?如何从文本文件中过滤行"Pandu in Sydney"
行?
答案 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}/)}}
我不知道您是否要直接从文本或程序逻辑中删除行。这会让你回到一系列“未知城市”的路线。