如何在Ruby中读取文件行

ggazkfy8  于 12个月前  发布在  Ruby
关注(0)|答案(8)|浏览(140)

我尝试使用下面的代码从文件中读取行。但是当阅读一个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,在这里我不能假设文件使用的行尾字符是什么。我该怎么办?

t40tm48m

t40tm48m1#

Ruby有一个方法可以做到这一点:

File.readlines('foo', chomp: true).each do |line|
    puts(line)
end

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

eiee3dmh

eiee3dmh2#

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

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

mctunoxg

mctunoxg3#

我相信我的回答涵盖了您对处理任何类型的行尾的新关注,因为在解析行之前,"\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

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

jm81lzqq

jm81lzqq4#

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

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

以指定行尾。

fxnxkyjh

fxnxkyjh5#

对于有头的文件,我倾向于使用以下方法:

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

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

r7knjye2

r7knjye26#

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

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

mm9b1k5b7#

怎么样?

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

d4so4syb8#

不要忘记,如果你担心阅读一个文件,它可能有大量的行,在运行时可能会淹没你的RAM,你总是可以读文件零碎。参见“Why slurping a file is bad“。

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

相关问题