2015-02-21 3 views
1

Я создал сценарий, который позволяет мне импортировать CSV в виде многомерного массива, запускать поиск по каждой строке массива и если строка поиска соответствует любому элементу в строке возвращает всю строку в новый массив, написав:Поиск элемента массива для всех элементов другого массива

require 'csv' 
array = CSV.read('CSVlist.csv') #=> [["Name1", "8675309"],["Name2", "5557891"], ["Name3", "5557890"]] 
shifted_array = Array.new 
results_array = Array.new 

while array.empty? == false 
    shifted_array = array.shift 
    shifted_array.each do |f| 
     if f =~ /8675309/ 
      shifted_array = shifted_array.join(",") #=> ["Name1,8675309"] 
      results_array.push(shifted_array) 
     end 
    end 
end 
puts results_array #=> ["Name1,8675309"] 

Выше работает правильно. Однако вместо поиска только одной строки (/8675309/ выше) я хочу выполнить поиск по массиву и вернуть любой элемент из другого массива (который является импортированным текстовым файлом). Я создал массив сравнения, но как мне найти основной массив (array) против другого массива (numbers_array, ниже) вместо строки?

require 'csv' 
array = CSV.read('CSVlist.csv') #=> [["Name1", "8675309"],["Name2", "5557891"], ["Name3", "5557890"]] 
shifted_array = Array.new 
results_array = Array.new 
numbers_array = File.readlines("list1.txt").map &:split #=> ["5551234", "5557890", "8675309"] 

while array.empty? == false 
    shifted_array = array.shift 
    shifted_array.each do |f| 
     if f =~ ???? # want the search to compare f to any element in numbers_array 
      shifted_array = shifted_array.join(",") 
      results_array.push(shifted_array) 
     end 
    end 
end 
puts results_array #=> desired output is ["Name1,8675409", "Name3,5557890"] 
+0

Не размещайте код. Напишите то, что вы пытаетесь сделать (желательно пример ввода, вывода). – sawa

+0

@sawa код хороший, тоже !. Оба они лучше одного или другого. – Jon

ответ

0

Вы можете использовать комбинацию .select, .any?, .include? и .map, что вместе будет выглядеть примерно так:

results_array = array.select{ |row| 
    row.any?{ |e| numbers_array.include? e } 
}.map{ |row| 
    row.join(',') 
} 

Этот код первого выбирает только строки array которые включаютлюбые элементов в numbers_array, затем карты каждый с join.

С этим утверждением, весь ваш код блока может быть сокращен до:

require 'csv' 

array = CSV.read('CSVlist.csv') 
numbers_array = File.readlines('list1.txt').map(&:split) 

results_array = array.select{ |row| 
    row.any?{ |e| numbers_array.include? e } 
}.map{ |row| 
    row.join(',') 
} 

puts results_array 
Смежные вопросы