2009-09-12 7 views
2

Comment lire la ligne précave d'un fichier. Le contraire de IO.gets.I initialement pensé à mettre IO.lineno au numéro de ligne que je voulais lire, mais cela ne fonctionne pas comme attendre. Comment lisez-vous réellement la ligne précédente?Lecture de la ligne précédente du fichier avec Ruby

+0

Je vois cette question aussi sur comp.lang.ruby - si vous obtenez une bonne réponse là-bas, s'il vous plaît être un bon citoyen et mettre à jour cette page aussi. –

Répondre

3

Il y a plusieurs façons, cela dépend de la quantité d'informations dont vous disposez. Si vous connaissez la longueur de la dernière ligne que vous lisez en vous pouvez prendre l'approche la plus simple qui serait

# assume f is the File object 
len = last_line_length 
f.seek -len, IO::SEEK_CUR 

Bien sûr, si vous n'êtes pas à condition que les choses d'information deviennent un peu moins agréable. Vous pouvez utiliser la même approche que ci-dessus pour revenir en arrière (un octet à la fois) jusqu'à ce que vous atteigniez un marqueur de nouvelle ligne ou que vous preniez lineno et que vous lisiez depuis le début. Quelque chose comme

lines = f.lineno 
f.rewind 
(lines - 1).times { f.gets } 

Cependant, pour autant que je sache, il n'y a pas de mécanisme direct à juste go back 1 NN représente une ligne. En outre, vous devez savoir que si vous pouvez écrire à File.lineno, cela n'affecte pas réellement la position dans le fichier et il ruine également la précision de la variable pour les lectures après ce point.

4

Une façon simple est de se rappeler la ligne précédente vous lisez:

prev = nil 
File.foreach('_vimrc') do |line| 
    p [line, prev] # do whatever processing here 
    prev = line 
end 
0

a vu une excellente suggestion sur comp.lang.ruby - utiliser IO.tell de garder une trace de la position de chaque ligne dans le fichier afin que vous puissiez chercher directement à lui:

File.open "foo" do |io| 
    idx = [io.tell] 
    while l = io.gets 
    p l 
    idx << io.tell 
    end 
end 
1

le joyau Elif a une méthode qui obtient est à l'opposé de IO.gets.

$ sudo gem install Elif

$ irb

require "elif" 
last_syslog = Elif.open('/var/log/syslog') { |file| file.gets } 
Questions connexes