web-dev-qa-db-fra.com

Comment lire les lignes d'un fichier dans Ruby

J'essayais d'utiliser le code suivant pour lire les lignes d'un fichier. Mais lors de la lecture d'un fichier , le contenu est tout à la fois:

line_num=0
File.open('xxx.txt').each do |line|
  print "#{line_num += 1} #{line}"
end

Mais ce fichier imprime chaque ligne séparément.


Je dois utiliser stdin, comme Ruby my_prog.rb < file.txt, où je ne peux pas assumer le caractère de fin de ligne utilisé par le fichier. Comment puis-je le gérer?

224
draw

Je crois que ma réponse couvre vos nouvelles préoccupations concernant la gestion de tout type de fin de ligne puisque "\r\n" et "\r" sont tous deux convertis au standard Linux "\n" avant d’analyser les lignes.

Pour prendre en charge le caractère "\r" EOL ainsi que les caractères "\n" et "\r\n" normaux de Windows, voici ce que je ferais:

line_num=0
text=File.open('xxx.txt').read
text.gsub!(/\r\n?/, "\n")
text.each_line do |line|
  print "#{line_num += 1} #{line}"
end

Bien sûr, cela pourrait être une mauvaise idée pour les très gros fichiers car cela signifie charger tout le fichier en mémoire.

144
Olivier L.

Ruby a une méthode pour cela:

File.readlines('foo').each do |line|

http://Ruby-doc.org/core-1.9.3/IO.html#method-c-readlines

496
Jonathan
File.foreach(filename).with_index do |line, line_num|
   puts "#{line_num}: #{line}"
end

Ceci exécutera le bloc donné pour chaque ligne du fichier sans mettre en mémoire le fichier entier. Voir: IO :: foreach .

362
talabes

Votre premier fichier comporte des fins de ligne Mac Classic (c’est "\r" au lieu du "\n" habituel.). Ouvrez-le avec

File.open('foo').each(sep="\r") do |line|

pour spécifier les fins de ligne.

18
Josh Lee

que diriez-vous obtient ?

myFile=File.open("paths_to_file","r")
while(line=myFile.gets)
 //do stuff with line
end
6
JBoy

Je suis partisan de l'approche suivante pour les fichiers ayant des en-têtes:

File.open(file, "r") do |fh|
    header = fh.readline
    # Process the header
    while(line = fh.gets) != nil
        #do stuff
    end
end

Cela vous permet de traiter une ligne d'en-tête (ou des lignes) différemment des lignes de contenu.

6
Ron Gejman

C'est à cause des lignes de fond dans chaque ligne. Utilisez la méthode chomp dans Ruby pour supprimer la fin de la ligne '\ n' ou 'r' à la fin.

line_num=0
File.open('xxx.txt').each do |line|
  print "#{line_num += 1} #{line.chomp}"
end
6
Sreenivasan AC

N'oubliez pas que si vous êtes préoccupé par la lecture d'un fichier pouvant contenir d'énormes lignes risquant de saturer votre RAM lors de l'exécution, vous pouvez toujours lire le fichier à la pièce. Voir " Pourquoi slurping un fichier est mauvais ".

File.open('file_path', 'rb') do |io|
  while chunk = io.read(16 * 1024) do
    something_with_the chunk
    # like stream it across a network
    # or write it to another file:
    # other_io.write chunk
  end
end
4
Nels