Как читать строки файла в Ruby
Я пытался использовать следующий код для чтения строк из файла. Но при чтении файла содержимое находится в одной строке:
line_num=0
File.open('xxx.txt').each do |line|
print "#{line_num += 1} #{line}"
end
Но этот файл печатает каждую строку отдельно.
Мне нужно использовать stdin, например ruby my_prog.rb < file.txt
, где я не могу предположить, какой символ окончания строки используется файлом. Как я могу справиться с этим?
Ответы
Ответ 1
Я полагаю, что мой ответ охватывает ваши новые проблемы в отношении обработки любых типов окончаний строк, так как "\r\n"
и "\r"
преобразуются в стандарт Linux "\n"
перед разбором строк.
Чтобы поддерживать символ "\r"
EOL вместе с регулярными "\n"
и "\r\n"
из Windows, вот что я сделал бы:
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
Конечно, это может быть плохой идеей в очень больших файлах, поскольку это означает загрузку всего файла в память.
Ответ 2
У Ruby есть метод для этого:
File.readlines('foo').each do |line|
http://ruby-doc.org/core-1.9.3/IO.html#method-c-readlines
Ответ 3
File.foreach(filename).with_index do |line, line_num|
puts "#{line_num}: #{line}"
end
Это будет выполнять данный блок для каждой строки в файле, не опуская весь файл в память. См. IO:: foreach.
Ответ 4
В вашем первом файле есть окончания строк Mac Classic (thats "\r"
вместо обычного "\n"
). Откройте его с помощью
File.open('foo').each(sep="\r") do |line|
чтобы указать окончания строки.
Ответ 5
Я частично отношусь к следующему подходу для файлов с заголовками:
File.open(file, "r") do |fh|
header = fh.readline
# Process the header
while(line = fh.gets) != nil
#do stuff
end
end
Это позволяет обрабатывать строку заголовка (или строки) иначе, чем строки содержимого.
Ответ 6
Это из-за конечных линий в каждой строке.
Используйте метод chomp в ruby, чтобы удалить конечную строку '\n' или 'r' в конце.
line_num=0
File.open('xxx.txt').each do |line|
print "#{line_num += 1} #{line.chomp}"
end
Ответ 7
как насчет gets?
myFile=File.open("paths_to_file","r")
while(line=myFile.gets)
//do stuff with line
end
Ответ 8
Не забывайте, что если вы беспокоитесь о чтении в файле, который может иметь огромные линии, которые могли бы загружать вашу оперативную память во время выполнения, вы всегда можете прочитать файл "штучная еда". См. "Почему повреждение файла плохое".
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