2015-07-08 5 views
2

Мой текстовый файл содержит список адресов электронной почты/паролей для настройки учетных записей. Как только я использовал комманду электронной почты и паролей, я хотел бы удалить ее из текстового файла.Есть ли способ удалить строку в текстовом файле, если она соответствует определенному тексту?

Мой текстовый файл выглядит следующим образом:

email,pass 
email,pass 
etc.. 

раз я использовал е/р комбо я хотел бы, чтобы удалить его из файла:

File.open("yahoo_accounts.txt") do |email| 
    email.each do |item| 
    email, password = item.chomp.split(',') 
    emails << email 
    passwords << password 
    emails.zip(passwords) { |name, pass| 
     browser = Watir::Browser.new :ff 

     #using the email and pass 

     File.open("yahoo_accounts.txt", "w") do |out_file| 
      File.foreach("yahoo_accounts.txt","r") do |line| 
       out_file.puts line unless line == '#{name},#{pass}' 
      end 
     end 
     browser.close 
    end 
end 

Проблема возникает, когда я попробуйте удалить их из файла. Я получаю «browser.rb: 382: в` assert_exists »: браузер был закрыт (Watir :: Exception :: Error)», , но это может быть просто закрытие браузера.

Если все e/p извлечены (что означает, что вначале ничего не нужно удалить), как я могу его зацитировать, чтобы продолжить, а не заканчивать ошибку после первого цикла zip?

ответ

0

Если файл не огромный, вы можете прочитать его в массив, изменить массив, а затем записать массив в файл, перезаписать предыдущее содержимое.

Код

def remove_lines(fname, user_name, password) 
    IO.write(fname, IO.read(fname).gsub(/^#{user_name},#{password}\n/, '')) 
end 

Пример

Давайте создадим некоторые данные:

text =<<_ 
Bubba,boar 
Henrietta,vespa 
Luigi,pink 
Bubba,boar 
Luigi,mauve 
_ 
    #=> "Bubba,boar\nHenrietta,vespa\nLuigi,pink\nBubba,boar\nLuigi,mauve\n" 

и записать его в файл:

FName = "tmp" 
IO.write(FName, text) 
    #=> 61 

Мы можем подтвердить, что мы написали в файл:

IO.read(FName) 
    #=> "Bubba,boar\nHenrietta,vespa\nLuigi,pink\nBubba,boar\nLuigi,mauve\n" 

Теперь удалите строки для user_name/password #=> Bubba/boar:

remove_lines(FName, "Bubba", "boar") 
    #=> 39 

Давайте подтвердить это сработало, исследуя FName:

IO.read(FName) 
    #=> "Henrietta,vespa\nLuigi,pink\nLuigi,mauve\n" 

Постскриптум

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

+0

Я думаю, что это будет работать лучше, я собираюсь попробовать это сейчас, спасибо. – marriedjane875

0

Вы не можете писать и читать в один и тот же файл одновременно; первая строка, которую вы пишете, скроет остальную часть файла, чтобы вы больше не могли ее читать.

Вы должны записать изменения во временный файл при чтении строк, а затем переместить временный файл в исходный файл в конце. Что-то вроде:

require 'tempfile' 
require 'fileutils' 

temp_file = Tempfile.new('foo') 
begin 
    File.open("yahoo_accounts.txt", 'r') do |file| 
    file.each_line do |line| 
     temp_file.puts line unless line == '#{name},#{pass}' 
    end 
    end 
    temp_file.close 
    FileUtils.mv(temp_file.path, "yahoo_accounts.txt") 
ensure 
    temp_file.close 
    temp_file.unlink 
end 
+0

ahh, хорошо, спасибо миллион – marriedjane875