помещает совпадения из в файлы - PullRequest
0 голосов
/ 23 февраля 2011

У меня есть mac адреса в mac1.txt и mac2.txt, и я хотел сделать что-то вроде этого:

v = File.open("/RubyDev/sort/mac1.txt",'r').each_line do |a|
      w = File.open("/RubyDev/sort/mac2.txt",'r').each_line do |b|
            if w in v
                puts w
            end
      end
end

Заранее спасибо за вашу помощь!

Ответы [ 4 ]

1 голос
/ 23 февраля 2011

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

lines = Hash.new

File.open( "mac1.txt", 'r' ).each_line do |l|
    lines[l] = true
end

File.open( "mac2.txt", 'r' ).each_line do |l|
    if ( lines[l] == true )
        puts l
    end
end

Редактировать Для полноты, вот очень краткая версия, предложенная в комментариях Марка Томаса с удалением пробелов, предложенная Гэвином Андереггом. Руби - сладкий язык.

lines = Hash.new
File.open( "mac1.txt", 'r' ).each_line {|l| lines[l.strip!] = true}
File.open( "mac2.txt", 'r' ).each_line {|l| puts l if lines[l.strip!]}
1 голос
/ 23 февраля 2011

Чтобы получить все общие строки между двумя файлами, вы можете использовать File#readlines для доступа ко всем строкам в файле в виде массива.Имейте в виду, что к ним по-прежнему будут добавлены символы новой строки ("\ n"), поэтому вам нужно удалить их с помощью String#chomp.Самый простой способ сделать это - map массив, который readlines дает вам, например:

common_macs = File.open("mac1.txt").readlines.map(&:chomp) & 
  File.open("mac2.txt").readlines.map(&:chomp)
1 голос
/ 23 февраля 2011

РЕДАКТИРОВАТЬ: Эта первая версия ниже на самом деле довольно ужасно. Вот лучшая версия:

lines = []

File.open("mac1.txt",'r').each_line do |a|
  lines.push(a.rstrip!)
end

File.open("mac2.txt",'r').each_line do |b|
  if lines.include?(b.rstrip!)
    puts b
  end
end

Я думаю, что вы ищете что-то вроде этого:

File.open("mac1.txt",'r').each_line do |a|
  File.open("mac2.txt",'r').each_line do |b|
    if a == b
      puts b
    end
  end
end

Это правильно? Если нет, не могли бы вы подробнее рассказать об этой проблеме и о том, чего вы пытаетесь достичь?

0 голосов
/ 23 февраля 2011
lines = {}
File.open("mac1.txt").each_line {|l| lines[l.chomp] = true}
File.open("mac2.txt").each_line {|l| puts l if lines[l.chomp]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...