Как читать строки файла в Ruby


Я пытался использовать следующий код для чтения строки из файла. Но при чтении file, содержание все в одной строке:

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

но это file печатает каждую строку отдельно.


Я должен использовать stdin, как ruby my_prog.rb < file.txt, где я не могу предположить, какой символ окончания строки используется в файле. Как я могу с этим справиться?

8 194

8 ответов:

Я считаю, что мой ответ охватывает новые опасения по поводу обработки любых типов окончаний строк, так как "\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

конечно, это может быть плохой идеей для очень больших файлов, так как это означает загрузку всего файла в память.

у Ruby есть метод для этого:

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

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

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

Не забывайте, что если вы обеспокоены чтением в файле, который может иметь огромные строки, которые могут затопить вашу оперативную память во время выполнения, вы всегда можете прочитать файл piece-meal. Смотрите "почему прихлебывать файл плохо".

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