我试图使用以下代码从文件中读取行。但是当读取文件时,内容都在一行中:

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

但是这个文件分别打印每一行。


我必须使用stdin,如ruby my_prog。rb < file.txt,这里我不能假设文件使用的行结束字符是什么。我该怎么处理呢?


当前回答

不要忘记,如果您担心读取一个文件时可能会有大量的行,这会在运行时淹没您的RAM,那么您总是可以逐条读取文件。参见“为什么吮吸文件是不好的”。

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

其他回答

不要忘记,如果您担心读取一个文件时可能会有大量的行,这会在运行时淹没您的RAM,那么您总是可以逐条读取文件。参见“为什么吮吸文件是不好的”。

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

那么gets呢?

myFile=File.open("paths_to_file","r")
while(line=myFile.gets)
 //do stuff with line
end

这是因为每一行的端点。 使用ruby中的chomp方法删除末尾的“\n”或“r”。

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

Ruby确实有一个方法:

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

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

我相信我的回答涵盖了您关于处理任何类型的行结束符的新问题,因为“\r\n”和“\r”在解析行之前都被转换为Linux标准的“\n”。

为了在Windows中支持“\r”EOL字符以及常规的“\n”和“\r\n”,下面是我要做的:

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

当然,对于非常大的文件,这可能是一个坏主意,因为这意味着将整个文件加载到内存中。