如何在Ruby中读取文件的行

时间:2011-05-16 03:29:34

标签: ruby line-endings

我试图使用以下代码从文件中读取行。但是在阅读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 个答案:

答案 0 :(得分:479)

Ruby确实有一个方法:

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

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

答案 1 :(得分:350)

File.foreach(filename).with_index do |line, line_num|
   puts "#{line_num}: #{line}"
end

这将为文件中的每一行执行给定的块,而不会将整个文件压入内存。请参阅:IO::foreach

答案 2 :(得分:139)

我相信我的答案涵盖了处理任何类型的行结尾的新问题,因为在解析行之前"\r\n""\r"都转换为Linux标准"\n"

要支持"\r" EOL字符以及来自Windows的常规"\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

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

答案 3 :(得分:17)

您的第一个文件包含Mac Classic行结尾("\r"而不是通常的"\n")。用

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

指定行结尾。

答案 4 :(得分:6)

这是因为每行的结束。 使用ruby中的chomp方法删除末尾的'\ n'或'r'。

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

答案 5 :(得分:6)

gets怎么样?

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

答案 6 :(得分:5)

对于包含标题的文件,我对以下方法不感兴趣:

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

这允许您以不同于内容行的方式处理标题行(或多行)。

答案 7 :(得分:4)

不要忘记,如果您担心在运行期间读取可能会占用大量行的文件,您可以随时阅读文件。请参阅&#34; Why slurping a file is bad&#34;。

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