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