如何在Ruby中同时读取和覆盖文本文件

时间:2019-02-28 12:25:18

标签: ruby

我正在尝试过滤出文本中的重复行。我使用ruby -i进行就地编辑,但结果仅输出到stdout。所以我试图用手写。

ARGV.each do |filename|
    File.open(filename, 'r+') do |file|
        ret = file.readlines.uniq.join()
        # file.rewind
        # file.truncate(???)
        # file.seek(0)
        # file.write ret
        file.puts ret
    end
end

它们都不起作用。我所能得到的最好的是附加到文件的内容,它只会产生更多重复。

请怜悯我。

2 个答案:

答案 0 :(得分:3)

require 'set'

这会将整个文件读取为单独的行,删除重复的行(忽略换行符),将这些行连接起来以创建新文件的内容为一个字符串,并从其末尾删除空格。最后,我们将新内容写入文件,以覆盖现有内容。

请注意,文件的新版本末尾没有换行符。如果您想在文件末尾添加换行符,可以在调用ARGV.each do |filename| new_content = File.readlines(filename).uniq(&:rstrip).join.rstrip File.write(filename, new_content) end 之前将其附加到new_content上。


如果要使用相同的句柄进行读写,请执行以下操作:

File::write

尽管我看不到该版本相对于第一个版本的任何真正优势。代码变得更加混乱,我们被迫使用File#truncate,它被描述为“并非在所有平台上都可用。”。

答案 1 :(得分:0)

首先,您必须逐行读取文件并将其压入数组并使其唯一。然后打印行

ARGV.each do |filename|      
  text=File.open(filename).read
  text.gsub!(/\r\n?/, "\n")
  lines=[]
  text.each_line do |line|
    lines << line unless lines.include? line
  end
  File.open(filename, 'w+') do |f|
    f.puts(lines)
  end
end