2016-10-25 2 views
-1

J'ai cette boucle:Ruby - Comment sauter 2 lignes après avoir lu une ligne vierge de fichier

File.open(path_to_file, "r") do |infile| 
    infile.each_line do |line| 
    #do things with line 
    end 
end 

Et ce que je veux faire: Si la ligne actuelle est vide «/^ [\ s] * $ \ n/"sauter les 2 lignes suivantes et continuer à lire à partir de là.

+1

Nous aimerions que vous essayiez de résoudre le problème plutôt que d'écrire du code pour remplir les blancs. Veuillez lire "[mcve]" et "[Quel effort de recherche est attendu des utilisateurs de Stack Overflow?] (Http://meta.stackoverflow.com/q/261592)". Quelle est la taille du fichier? Quel est l'exemple minimal du fichier qui montrera le problème? –

Répondre

0

Pour cette situation, je ferais quelque chose comme ceci:

file = File.open(path_to_file, "r") 

while !file.eof? 
    line = file.gets 
    if line.match(/^[\s]*$\n/) 
    2.times{ file.gets if !file.eof? } 
    else 
    # do something with line 
    end 
end 
+0

Il vaut la peine de noter ici que '\ A' et' \ z' sont préférables à '^' et '$' puisque ces derniers sont ancrés aux lignes, la première étant la chaîne entière. – tadman

+0

Je vais essayer! –

0

Voyons d'abord créer un fichier de test.

str = 
" \nNow is \nthe time \n \nfor all \ngood \npeople \n\nto \nsupport\na nasty\n \nperson\n" 
puts str 
    # 
    # Now is 
    # the time 
    # 
    # for all 
    # good 
    # people 
    # 
    # to 
    # support 
    # a nasty 
    # 
    # person 
    #=> nil 

FName = "almost_over" 

IO.write(FName, str) 
    #=> 75 

Nous allons confirmer que le fichier a été écrit correctement.

IO.read(FName) == str 
    #=> true 

Nous pouvons ignorer les lignes non désirées comme suit.

count = 0 
IO.foreach(FName) do |line| 
    if count > 0 
    count -=1 
    elsif line.strip.empty? 
    count = 2 
    else 
    puts "My code using the line '#{line.strip}' goes here" 
    end 
end 
    # My code using the line 'people' goes here 
    # My code using the line 'a nasty' goes here 
    #=> nil 

Comme File est une sous-classe de IO (File < IO #=> true), vous verrez souvent des expressions en utilisant des méthodes IO avec File comme le récepteur (par exemple, File.read(FName)).

+0

Merci de l'essayer! :) –