Ruby: Удалить последний повторяющийся элемент? - PullRequest
0 голосов
/ 08 января 2010

То, что я делаю, это: один файл для ввода, другой для вывода. Я выбрал случайную строку на входе, поместил ее в вывод и затем удалил ее.

Теперь я перебрал файл и нахожусь на нужной строке. Я скопировал его в выходной файл. Есть ли способ удалить его? Я делаю что-то вроде этого:

for i in 0..number_of_lines_to_remove
    line = rand(lines_in_file-2) + 1 #not removing the first line
    counter = 0
    IO.foreach("input.csv", "r") { |current_line|
      if counter == line
        File.open("output.csv", "a") { |output|
          output.write(current_line)
        }
      end
      counter += 1
    }
end

Итак, у меня есть current_line, но я не уверен, как удалить его из исходного файла.

Ответы [ 3 ]

1 голос
/ 08 января 2010

Вот класс случайных строк. Вы создаете новый объект randomline, передавая ему имя входного файла и имя выходного файла. Затем вы можете вызвать метод deleterandom для этого объекта и передать ему ряд строк для удаления.

Данные хранятся внутри массивов, а также помещаются в файл. В настоящее время вывод находится в режиме добавления, поэтому если вы используете тот же файл, который он просто добавит в конец, вы можете изменить a на w, если хотите каждый раз запускать файл заново.

   class Randomline
  attr_accessor :inputarray, :outputarray

def initialize(filein, fileout)
@filename = filein
@filein = File.open(filein,"r+")
@fileoutput = File.open(fileout,"a")
@inputarray = []
@outputarray = []  

readin()
end


def readin()
@filein.each do |line|
  @inputarray << line
end
end

def deleterandom(numtodelete)
  numtodelete.times do |num|
    random = rand(@inputarray.size)
    @outputarray << inputarray[random]
    @fileoutput.puts inputarray[random]
    @inputarray.delete_at(random) 
  end 

    @filein = File.open(@filename,"w")
    @inputarray.each do |line|
      @filein.puts line
    end

end

end

вот пример его использования

a = Randomline.new("testin.csv","testout.csv")

a.deleterandom(3)
1 голос
/ 08 января 2010

Array.delete_at может сделать. Имея индекс, он удаляет объект по этому индексу, возвращая объект.

input.csv:

one,1
two,2
three,3

Программа:

#!/usr/bin/ruby1.8

lines = File.readlines('/tmp/input.csv')
File.open('/tmp/output.csv', 'a') do |file|
  file.write(lines.delete_at(rand(lines.size)))
end
p lines    # ["two,2\n", "three,3\n"]

output.csv:

one,1
0 голосов
/ 08 января 2010

Вы должны переписать исходный файл после удаления строки, в противном случае изменения не будут выполняться, поскольку они выполняются для копии данных.

Помните, что любая операция, которая изменяет файл на месте, рискует усечь файл, если есть какая-либо ошибка, и операция не может быть завершена.

Было бы безопаснее использовать какую-то простую базу данных для такого рода вещей, поскольку библиотеки, такие как SQLite и BDB, имеют методы для обеспечения целостности данных, но если это не вариант, вам просто нужно быть осторожным при написании нового ввода файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...