Как читать строки файла в Ruby - PullRequest
220 голосов
/ 16 мая 2011

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

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

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


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

Ответы [ 8 ]

490 голосов
/ 15 августа 2012

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

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

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

357 голосов
/ 02 июля 2013
File.foreach(filename).with_index do |line, line_num|
   puts "#{line_num}: #{line}"
end

Это будет выполнять данный блок для каждой строки в файле, не сохраняя весь файл в памяти.См .: IO :: foreach .

141 голосов
/ 16 мая 2011

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

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

18 голосов
/ 16 мая 2011

Ваш первый файл имеет окончание строки Mac Classic (это "\r" вместо обычного "\n").Откройте его с помощью

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

, чтобы указать окончания строк.

6 голосов
/ 19 августа 2014

как насчет получает ?

myFile=File.open("paths_to_file","r")
while(line=myFile.gets)
 //do stuff with line
end
6 голосов
/ 30 июня 2014

Это из-за концевых линий в каждой строке.Используйте метод chomp в ruby, чтобы удалить конечную строку '\ n' или 'r' в конце.

line_num=0
File.open('xxx.txt').each do |line|
  print "#{line_num += 1} #{line.chomp}"
end
5 голосов
/ 30 мая 2014

Я неравнодушен к следующему подходу для файлов с заголовками:

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

Это позволяет обрабатывать строку заголовка (или строки) иначе, чем строки содержимого.

4 голосов
/ 10 декабря 2014

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

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
...