如何在Ruby中读取文件的行

dra*_*raw 226 ruby line-endings

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

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

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


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

Jon*_*han 504

Ruby确实有一个方法:

File.readlines('foo').each do |line|
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为@Barry指的是接受的答案 - 而不是这个答案 (12认同)
  • 那个过早的优化怎么样?它读得更好,如果我没有弄错,它不会优化.最佳方法是这里讨论的方法,因为它不需要首先将整个文件读入内存.http://www.ruby-doc.org/core-2.0/IO.html#method-c-foreach (8认同)
  • 这看起来是正确的答案. (3认同)
  • 是的,你可以,例如`File.readlines(filename).each_with_index { |line, i| puts "#{i}: #{line}" }` (2认同)

tal*_*bes 380

File.foreach(filename).with_index do |line, line_num|
   puts "#{line_num}: #{line}"
end
Run Code Online (Sandbox Code Playgroud)

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

  • 我不敢相信这不是正确的答案. (44认同)
  • 这就是答案 - 惯用的Ruby并没有玷污文件.另请参见http://stackoverflow.com/a/5546681/165673 (9认同)
  • 所有人都欢呼红宝石众神! (3认同)
  • @Smeterlink `filename` 是一个包含字符串的变量,例如 `'xxx.txt'`。 (2认同)

Oli*_* L. 142

我相信我的回答涵盖了你关于处理任何类型的线路的结局,因为这两个新的关注点"\r\n",并"\r"转换为Linux的标准"\n"解析行之前.

为了支持"\r"EOL角色以及常规角色"\n","\r\n"从Windows,这就是我要做的:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 这会将整个文件读入内存,这可能是不可能的,具体取决于文件的大小. (12认同)
  • 正确的正则表达式应该是```/\r?\n /```这将涵盖\ r \n和\n而不组合空行,因为Pod的注释会做 (3认同)

Jos*_*Lee 18

你的第一个文件有Mac Classic行结尾(这"\r"不是通常的"\n").打开它

File.open('foo').each(sep="\r") do |line|
Run Code Online (Sandbox Code Playgroud)

指定行结尾.


Ron*_*man 6

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

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

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


小智 6

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

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

  • @SreenivisanAC +1 为 chomp! (2认同)

JBo*_*Boy 6

怎么样得到

myFile=File.open("paths_to_file","r")
while(line=myFile.gets)
 //do stuff with line
end
Run Code Online (Sandbox Code Playgroud)