我正在尝试过滤出文本中的重复行。我使用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
它们都不起作用。我所能得到的最好的是附加到文件的内容,它只会产生更多重复。
请怜悯我。
答案 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