我试图使用以下代码从文件中读取行。但是当读取文件时,内容都在一行中:
line_num=0 File.open('xxx.txt').each do |line| print "#{line_num += 1} #{line}" end
但是文件会分别打印每一行。
我必须使用stdin,比如ruby my_prog.rb < file.txt,在这里我不能假设文件使用的行结束字符是什么。我该怎么处理呢?
ruby my_prog.rb < file.txt
你的第一个文件有Mac Classic的行结束符(这是"\r"而不是通常的"\n")。打开它
"\r"
"\n"
File.open('foo').each(sep="\r") do |line|
指定行结束符。
我相信我的回答涵盖了你对处理任何类型的行结束符的新担忧,因为"\r\n"和"\r"在解析行之前都转换为Linux标准"\n"。
"\r\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| puts(line) end
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
这将为文件中的每一行执行给定的块,而不会将整个文件吸进内存。看到:IO:: foreach。
对于有头文件的文件,我倾向于以下方法:
File.open(file, "r") do |fh| header = fh.readline # Process the header while(line = fh.gets) != nil #do stuff end end
这允许您以不同于内容行的方式处理标题行(或多个行)。
这是因为每一行的结束线。 使用ruby中的chomp方法删除末尾的'\n'或'r'
line_num=0 File.open('xxx.txt').each do |line| print "#{line_num += 1} #{line.chomp}" 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