如何在Ruby中读取文件的行

How to read lines of a file in Ruby

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

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

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

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


Ruby确实有一个方法:

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

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


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

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


我相信我的答案涵盖了处理任何类型的行结尾的新问题,因为在解析行之前"

"和"
"
都转换为Linux标准"
"

要支持"
"
EOL字符以及来自Windows的常规"
"
"

",以下是我要做的事情:

1
2
3
4
5
6
7
8
9
line_num=0
text=File.open('xxx.txt').read
text.gsub!(/

?/,"
"
)
text.each_line do |line|
  print"#{line_num += 1} #{line}"
end

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


您的第一个文件具有Mac Classic行结尾(即"
"
而不是通常的"
"
)。打开它

1
2
File.open('foo').each(sep="
"
) do |line|

指定行结尾。


怎么样?

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

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

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


对于具有标题的文件,我对以下方法不满意:

1
2
3
4
5
6
7
File.open(file,"r") do |fh|
    header = fh.readline
    # Process the header
    while(line = fh.gets) != nil
        #do stuff
    end
end

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


不要忘记,如果您担心在文件中读取可能会在运行期间淹没RAM的大行,您可以随时读取文件。请参阅"为什么啜饮文件很糟糕"。

1
2
3
4
5
6
7
8
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