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?
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.
Ruby a une méthode pour cela:
File.readlines('foo').each do |line|
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 .
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.
que diriez-vous obtient ?
myFile=File.open("paths_to_file","r")
while(line=myFile.gets)
//do stuff with line
end
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.
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
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