我目前正在学习ruby,在这里我正在尝试做什么: 打开文件,进行替换,然后将每条线相互比较以查看它是否存在多次的脚本。 所以,我尝试直接使用字符串,但我没有找到如何做,所以我把每一行放在一个数组中,并比较每一行。 但我遇到了第一个问题。 这是我的代码:
#!/usr/bin/env ruby
DOC = "test.txt"
FIND = /,,^M/
SEP = "\n"
#make substitution
puts File.read(DOC).gsub(FIND, SEP)
#open the file and put every line in an array
openFile = File.open(DOC, "r+")
fileArray = openFile.each { |line| line.split(SEP) }
#print fileArray #--> give the name of the object
#Cross the array to compare every items to every others
fileArray.each do |items|
items.chomp
fileArray.each do |items2|
items2.chomp
#Delete if the item already exist
if items = items2
fileArray.delete(items2)
end
end
end
#Save the result in a new file
File.open("test2.txt", "w") do |f|
f.puts fileArray
end
最后,我只有数组对象“fileArray”的名称。我在拆分后打印对象,我也一样,所以我想问题来自这里。需要很少的帮助(如果你知道如何在没有数组的情况下执行此操作,只需使用文件中的行,也可以回答)。 谢谢!
编辑: 所以,现在是我的代码
#!/usr/bin/env ruby
DOC = "test.txt"
FIND = /,,^M/
SEP = "\n"
#make substitution
File.read(DOC).gsub(FIND, SEP)
unique_lines = File.readlines(DOC).uniq
#Save the result in a new file
File.open('test2.txt', 'w') { |f| f.puts(unique_lines) }
无法弄清楚如何选择这个。
答案 0 :(得分:3)
删除文件中的重复行:
no_duplicate_lines = File.readlines("filename").uniq
无需编写如此多的代码:)
答案 1 :(得分:2)
像这样修改你的代码:
f.puts fileArray.join("\n")
替代方式:
unique_lines = File.readlines("filename").uniq
# puts(unique_lines.join("\n")) # Uncomment this line and see if the variable holds the result you want...
File.open('filename', 'w') {|f| f.puts(unique_lines.join("\n"))}
答案 2 :(得分:2)
关于原始代码的几点:
fileArray = openFile.each { |line| line.split(SEP) }
将fileArray
设置为File
对象,我怀疑这不是您的意图。 File#each
(#
表示法是用于描述所提供类的对象上的特定方法的Ruby约定)为每一行执行提供的块(它也可以使用同义词:each_line
) ,默认情况下将一条线定义为操作系统的终点字符。
如果你想构建一个行数组,那么你可以写一下
fileArray = openFile.readlines
如果您希望这些行被chomp
编辑(通常是一个好主意),那么可以通过
fileArray = openFile.readlines.collect { |line| line.chomp }
或甚至(因为文件混合在Enumerable
)
fileArray = openFile.collect { |line| line.chomp }
另一个小问题:Ruby测试与==
,=
的平等只是为了赋值,所以
if items = items2
会将items
设为items2
(并始终评估为true
)