有没有办法在文本文件中删除与特定文本匹配的行?

时间:2015-07-08 21:47:46

标签: ruby loops text-files duplicate-removal

我的文本文件包含用于设置帐户的电子邮件/密码列表。一旦我使用了电子邮件和密码组合,我想将其从文本文件中删除。

我的文本文件如下所示:

email,pass
email,pass
etc..

一旦我使用了e / p组合,我想从文件中删除它:

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循环后结束错误?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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"

<强>后记

如果在将数组写入文件时出现问题,则可能会丢失旧文件和新文件。因此,将数组写入临时文件,然后删除原始文件,然后将临时文件重命名为原始文件的名称通常是一种好习惯。