проблема с циклом, массивом и файлом в ruby - PullRequest
1 голос
/ 02 августа 2011

В настоящее время я изучаю 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 ]

3 голосов
/ 02 августа 2011

Удаление повторяющихся строк в файле:

no_duplicate_lines = File.readlines("filename").uniq

Не нужно так много писать код:)

2 голосов
/ 02 августа 2011

Несколько слов о первоначальном коде:

fileArray = openFile.each { |line| line.split(SEP) }

устанавливает fileArray на File объект, который, я подозреваю, не был вашим намерением. File#each (обозначение # является соглашением Ruby для описания конкретного метода объекта предоставленного класса) выполняет предоставленный блок для каждой строки (он также доступен с синонимом: each_line), где определена строка по умолчанию в качестве символа (ов) конца вашей ОС.

Если вы хотите построить массив строк, то вы могли бы просто написать

fileArray = openFile.readlines

и если вы хотите, чтобы эти строки были chomp ed (часто это хорошая идея), то этого можно достичь с помощью чего-то вроде

fileArray = openFile.readlines.collect { |line| line.chomp }

или даже (поскольку файл смешивается в Enumerable)

fileArray = openFile.collect { |line| line.chomp }

И еще одна крошечная вещь: Ruby проверяет равенство с ==, = только для присвоения, поэтому

if items = items2

установит items в items2 (и всегда будет оценивать как true)

2 голосов
/ 02 августа 2011

Измените ваш код следующим образом:

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"))}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...