如何在Ruby中读取文件的行

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

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

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


我必须使用标准input,像ruby my_prog.rb < file.txt ,我不能假设文件使用的行尾字符。 我该如何处理?

我相信我的回答涵盖了处理任何types的行尾的新问题,因为在parsing行之前, "\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 

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

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 

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

您的第一个文件有Mac经典行结尾(这是"\r"而不是通常的"\n" )。 打开它

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

指定行结束。

这是因为每条线的末端。 在ruby中使用chomp方法删除末尾的'\ 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 

不要忘了,如果你关心的是在一个文件中读取文件,这个文件可能在运行时会占用很大的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 
Interesting Posts