ruby中的循环,数组和文件问题

时间:2011-08-02 13:55:11

标签: ruby arrays loops file-io

我目前正在学习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) }

无法弄清楚如何选择这个。

3 个答案:

答案 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