Может ли Ruby открыть файл, найти ключевое слово или слова и написать текст после этой строки? - PullRequest
1 голос
/ 09 марта 2011

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

ДляНапример, если я попросил программу найти эту строку «Привет, как сегодня?».Что мне нужно сделать, чтобы вывести «Я отлично, как дела» в том же файле, но на следующей строке.

IE в * .txt

#Hello, how are you?

становится таким в* .txt

#Hello, how are you?
#I am great, how are you?

Исследование, которое я провел, позволило мне найти;

File.readlines("FILE_NAME").each{ |line| print line if line =~ /check_String/ }

, которое возвращает определенные ключевые слова, и это, которое заменяет слово на что-то другое.

def ChangeOnFile(file, regex_to_find, text_to_put_in_place)
  text= File.read file
  File.open(file, 'w+'){|f| f << text.gsub(regex_to_find, text_to_put_in_place)}
end

ChangeOnFile('*.txt', /hello/ , "goodbye")

Если у кого-нибудь есть ссылка на учебник, который мог бы помочь мне, или что-нибудь, что помогло бы мне понять, что нужно сделать, то я был бы очень счастливым туристом.

Спасибо, любезно

1 Ответ

5 голосов
/ 10 марта 2011

Поскольку вы, возможно, добавляете в середину файла, вам нужно будет создать новый. Использование Tempfile очень полезно для этого типа вещей, так как вы можете временно его построить, а затем заменить оригинал, используя FileUtils . У вас есть пара вариантов без использования регулярных выражений, как показано ниже. Я также включил пример регулярного выражения. Я убедился, что этот код работает на Ruby 1.9.2.

Код:

require 'tempfile'
require 'fileutils'

file_path = 'C:\Users\matt\RubymineProjects\test\sample.txt'
line_to_find = 'Hello, how are you?'
line_to_add = 'I am great, how are you?'

temp_file = Tempfile.new(file_path)

begin
  File.readlines(file_path).each do |line|
    temp_file.puts(line)
    temp_file.puts(line_to_add) if line.chomp == line_to_find

    #or... if you just want to see if a given line contains the
    #sentence you are looking for you can:
    #temp_file.puts(line_to_add) if line.include?(line_to_find)

    #or... using regular expressions:
    #temp_file.puts(line_to_add) if line =~ /Hello, how are you/
  end
  temp_file.close
  FileUtils.mv(temp_file.path,file_path)
ensure
  temp_file.delete
end

Исходный файл sample.txt (без символов #):

#This line should not be found.
#Hello, how are you?
#Inserted Line should go before this one.

После запуска скрипта (без символов #):

#This line should not be found.
#Hello, how are you?
#I am great, how are you?
#Inserted Line should go before this one.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...