Est-il possible d'extraire une ligne particulière d'un fichier connaissant son numéro de ligne? Par exemple, il suffit d'obtenir le contenu de la ligne N
en tant que chaîne à partir du fichier "text.txt"?Comment obtenir une ligne particulière d'un fichier
Répondre
Essayez une de ces deux solutions:
file = File.open "file.txt"
#1 solution would eat a lot of RAM
p [*file][n-1]
#2 solution would not
n.times{ file.gets }
p $_
file.close
Vous pouvez l'obtenir par l'indice de readlines
.
line = IO.readlines("file.txt")[42]
N'utilisez ce code que s'il s'agit d'un petit fichier.
Ceci est la bonne réponse –
Ce n'est que la bonne réponse si le fichier est petit, moins de quelques MB. Sinon, cela forcera Ruby à charger le fichier entier en une fois, ce qui, dans le cas d'un fichier volumineux, est plus lent que d'utiliser une solution 'foreach' ou' gets'.Voir http://stackoverflow.com/questions/25189262/why-is-slurping-a-file-bad qui contient des repères. –
J'ai été surpris d'apprendre que cela prend autant que quelques MB! –
def get_line_from_file(path, line)
result = nil
File.open(path, "r") do |f|
while line > 0
line -= 1
result = f.gets
end
end
return result
end
get_line_from_file("/tmp/foo.txt", 20)
Ceci est une bonne solution car:
- Vous n'utilisez
File.read
, donc vous ne lisez pas le fichier en mémoire. Cela pourrait devenir un problème si le fichier a une taille de 20 Mo et que vous lisez assez souvent pour que le fichier GC ne fonctionne pas. - Vous lisez uniquement à partir du fichier jusqu'à la ligne souhaitée. Si votre fichier contient 1000 lignes, l'obtention de la ligne 20 ne lira que les 20 premières lignes dans Ruby.
Vous pouvez remplacer gets
avec readline
si vous souhaitez soulever une erreur (EOFError
) au lieu de retourner nul lors du passage d'un hors-limites ligne.
linenumber=5
open("file").each_with_index{|line,ind|
if ind+1==linenumber
save=line
# break or exit if needed.
end
}
ou
linenumber=5
f=open("file")
while line=f.gets
if $. == linenumber # $. is line number
print "#{f.lineno} #{line}" # another way
# break # break or exit if needed
end
end
f.close
Si vous voulez juste pour obtenir la ligne et ne rien faire d'autre, vous pouvez utiliser cette ligne
ruby -ne '(print $_ and exit) if $.==5' file
Nice. C'est alors que les variables $ globales deviennent utiles. – Nakilon
Cela continue à lire le fichier lorsque la ligne est déjà trouvée. – steenslag
Peu importe. Si le numéro de ligne est la dernière ligne par exemple, il doit aussi lire jusqu'à cette ligne ... – ghostdog74
fichier a une méthode lineno
agréable.
def get_line(filename, lineno)
File.open(filename,'r') do |f|
f.gets until f.lineno == lineno - 1
f.gets
end
end
Vous n'avez pas vraiment besoin de lineno(). Vous pouvez remplacer la ligne 'until' par '(lineno-1) .times {f.gets}'. –
Si vous voulez une chemise et ne se soucient pas de l'utilisation de la mémoire, utilisez (lignes en supposant sont numérotés de 1)
lineN = IO.readlines('text.txt')[n-1]
ou
lineN = f.readlines[n-1]
si vous avez déjà le fichier ouvert .
Sinon, il serait préférable de le faire comme ceci:
lineN = File.open('text.txt') do |f|
(n-1).times { f.gets } # skip lines preceeding line N
f.gets # read line N contents
end
- 1. comment sélectionner une ligne particulière?
- 2. comment supprimer une ligne particulière du fichier d'accès aléatoire
- 3. Comment obtenir une partie particulière d'une chaîne
- 4. Comment supprimer une ligne particulière dans une table SQL?
- 5. Sélectionnez une ligne particulière dans Gridview
- 6. Vous souhaitez supprimer une ligne particulière. comment chercher l'identifiant?
- 7. En SQL, comment puis-je obtenir la ligne avec la valeur maximale pour une colonne particulière?
- 8. Comment obtenir une colonne particulière distincte dans LINQ to SQL
- 9. Comment obtenir des processus appartenant à une session particulière?
- 10. Comment obtenir une URL particulière en utilisant JQuery ..?
- 11. Façon simple d'insérer une ligne à une position particulière dans le fichier
- 12. Comment puis-je extraire une image particulière d'un fichier WMV?
- 13. Comment changer une chaîne particulière dans un fichier PDF?
- 14. Comment vérifier si un fichier existe à une URL particulière?
- 15. comment exclure un fichier .js pour une page particulière
- 16. Comment sélectionner la ligne particulière dans un gridview
- 17. Supprimer une ligne particulière de la vue de table
- 18. obtenir une chaîne particulière en utilisant regex dans Java
- 19. Iphone Mouvement dans une direction particulière avec une vitesse particulière
- 20. Vérifiez si une chaîne particulière est dans un fichier bash
- 21. CSS à la ligne particulière dans JqGrid
- 22. Comment extraire une valeur particulière d'un fichier INI en utilisant une expression régulière?
- 23. ligne Obtenir une expression régulière
- 24. obtenir la valeur de colonne particulière
- 25. MySQL: Obtenir une certaine ligne
- 26. Requête pour obtenir TOUTES les correspondances pour une colonne particulière
- 27. construire une recherche pour une table particulière
- 28. Comment obtenir des produits d'une catégorie particulière dans magento ecommerce
- 29. Comment répéter une exécution particulière plusieurs fois
- 30. Comment désactiver une touche particulière dans .NET?
solution est classé n ° 2 devient la ligne n + 1? –
@ Mark Thomas, en # 1 aussi. Je supposé indexation de 0. – Nakilon
Merci pour '[* File.open ('...')]', ne savais pas que 'to_a' pour l'instance de fichier peut me donner ses lignes – tig