Игнорировать текст Lorem Ipsum в файле Ruby - PullRequest
0 голосов
/ 16 октября 2019

У меня есть файл .txt с фамилией, именем в одной строке и в каждой другой строке. У меня есть текст Lorem Ipsum. Мне нужно обнаружить Lorem Ipsum в каждой другой строке и пропустить его.

пример txt.file

Spade, Kate
Voluptatem ipsam et at.
Vuitton, Louis
Facere et necessitatibus animi.
Bucks, Star
Eveniet temporibus ducimus amet eaque.
Cage, Nicholas
Unde voluptas sit fugit.
Brown, James
Maiores ab officia sed.

ожидаемый результат:

#Spade, Kate
#Vuitton, Louis
#Bucks, Star
#Cage, Nicholas
#Brown, James

Ответы [ 4 ]

3 голосов
/ 16 октября 2019

Чтение 2 строк и игнорирование второй:

File.open("test.txt", "r") do |f|
  f.each_slice(2) do |odd, _even|
    puts odd
  end
end
3 голосов
/ 16 октября 2019

Если вы просто хотите пропустить каждую вторую строку, вы можете сделать что-то вроде этого:

File.open("text.txt", "r") do |f|
  f.each_line.with_index do |line, i|
    next unless i.even?
    puts line
  end
end

#Spade, Kate
#Vuitton, Louis
#Bucks, Star
#Cage, Nicholas
#Brown, James

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

File.open("text.txt", "r") do |f|
  f.each_line do |line|
    next unless line =~ /[A-Z][a-z]+, [A-Z][a-z]+/
    puts line
  end
end

#Spade, Kate
#Vuitton, Louis
#Bucks, Star
#Cage, Nicholas
#Brown, James

Вы также можете загрузить полный текст Lorem Ipsum из файла, подобного этому:

lorem = File.open("lorem.txt", "r").map(&:chomp).join(" ")

И затем проверьте каждую строку, содержится ли она в тексте Lorem Ipsum:

File.open("text.txt", "r") do |f|
  f.each_line do |line|
    next if lorem.include?(line[0...-1]) #removing the last character because you seem to have a dot at the end even though in the lorem text there's no dot on these positions.
    puts line
  end
end

#Spade, Kate
#Vuitton, Louis
#Bucks, Star
#Cage, Nicholas
#Brown, James

Теперь в зависимости от того, что вы хотите сделать с данными, вы можете заменить puts line линия с чем-то еще.

1 голос
/ 16 октября 2019

Ваше описание неясно. Если вы просто хотите пропустить все остальные строки, вы можете сделать что-то вроде этого:

File.foreach("test.txt").with_index(1) do |l, i|
  next if i.even?
  puts l
end
0 голосов
/ 17 октября 2019

Давайте сначала создадим файл.

FName = 'temp.txt'

IO.write(FName,
<<~END
Spade, Kate
Voluptatem ipsam et at.
Vuitton, Louis
Facere et necessitatibus animi.
Bucks, Star
Eveniet temporibus ducimus amet eaque.
Cage, Nicholas
Unde voluptas sit fugit.
Brown, James
Maiores ab officia sed.
END
)
  #=> 211 

Вот один из способов возврата каждой второй строки.

IO.foreach(FName).each_slice(2).map(&:first)
  #=> ["Spade, Kate\n", "Vuitton, Louis\n", "Bucks, Star\n",
  #    "Cage, Nicholas\n", "Brown, James\n"]

См. IO :: write , IO :: foreach , Enumerable # each_slice и Array # map .

Обратите внимание, что foreach, each_slice и map все возвращают перечислители, когда им не дан блок. Поэтому мы получаем следующее:

enum0 = IO.foreach(FName)
  #=> #<Enumerator: IO:foreach("temp.txt")> 
enum1 = enum0.each_slice(2)
  #=> #<Enumerator: #<Enumerator: IO:foreach("temp.txt")>:each_slice(2)> 
enum2 = enum1.map
  #=> #<Enumerator: #<Enumerator: #<Enumerator: IO:foreach("temp.txt")>
  #     :each_slice(2)>:map> 
enum2.each(&:first)
  #=> ["Spade, Kate\n", "Vuitton, Louis\n", "Bucks, Star\n",
  #    "Cage, Nicholas\n", "Brown, James\n"] 

Изучите возвращаемые значения для расчета enum1 и enum2. Может быть полезно думать о них как о. Они могут рассматриваться как составные счетчики.

Два других способа:

enum = [true, false].cycle
  #=> #<Enumerator: [true, false]:cycle> 
IO.foreach(FName).select { enum.next }
  #=> <as above>

keep = false
IO.foreach(FName).select { keep = !keep }
  #=> <as above>
...