Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 从文件中读取某些行_Ruby - Fatal编程技术网

Ruby 从文件中读取某些行

Ruby 从文件中读取某些行,ruby,Ruby,大家好,我刚刚开始学习Ruby,我正在尝试学习一些基本的文件读取命令,但我还没有找到任何可靠的源代码 我试图通过该文件的某些行,直到文件结束 所以,在文件中,它说file_SOURCES,我想读取所有的源,直到文件结束,并将它们放在一个文件中 我发现打印整个文件并替换文件中的单词,但我只想读取文件中的某些部分。IO函数不知道文件中的“行”是什么。没有直接的方法可以跳到文件中的某一行,您必须全部阅读并忽略不需要的行。如果您试图从以某种方式分隔的文件中提取节,通常会遵循这样的模式: open(fil

大家好,我刚刚开始学习Ruby,我正在尝试学习一些基本的文件读取命令,但我还没有找到任何可靠的源代码

我试图通过该文件的某些行,直到文件结束

所以,在文件中,它说file_SOURCES,我想读取所有的源,直到文件结束,并将它们放在一个文件中


我发现打印整个文件并替换文件中的单词,但我只想读取文件中的某些部分。

IO函数不知道文件中的“行”是什么。没有直接的方法可以跳到文件中的某一行,您必须全部阅读并忽略不需要的行。

如果您试图从以某种方式分隔的文件中提取节,通常会遵循这样的模式:

open(filename) do |f|
  state = nil

  while (line = f.gets)
    case (state)
    when nil
      # Look for the line beginning with "FILE_SOURCES"
      if (line.match(/^FILE_SOURCES/))
        state = :sources
      end
    when :sources
      # Stop printing if you hit something starting with "END"
      if (line.match(/^END/))
        state = nil
      else
        print line
      end
    end
  end
end
您可以根据文件的哪个部分从一种状态更改为另一种状态。

我会这样做(假设您可以将整个文件读入内存):

File.open("file_to_read.txt", "r") {|f|
  line = f.gets
  until line.include?("FILE_SOURCES")
    line = f.gets
  end
  File.open("file_to_write.txt", "w") {|new_file|
    f.each_line {|line|
      new_file.puts(line) 
    }
   new_file.close
  }
  f.close 
}

欢迎来到Ruby

看看这里,你可能正在重新发明一个以前发明的轮子。根据OS,您可能需要考虑使用<代码> GRP或<代码>查找< /代码>来定位这些行,然后将它们传递给露比。
%x{}
操作符或使用反勾号包装命令将是一个很好的起点。在Ruby中,使用
文件的块形式被认为更为惯用。打开
,我将再次使用它,而不是使用
文件。新建
(这样您就可以使用块形式)。感谢您的提示。改变它以反映这一点。我还认为,我误解了最初的问题(想在文件源之后拾取行,而不仅仅是包含它的任何行)。作为Phrogz评论“假设您可以将整个文件读入内存”的补充。。。Slurping文件可能会导致可伸缩性问题,并且由于内存分配和重新分配,实际上可能比逐行读取文件慢。在StackOverflow的某个地方,我想我有一个显示读取时间和如何获得最快“slurp”的基准测试。以下是基准测试和示例:最好使用
line.match(…)
而不是
line=~…
,因为后者是从Perl继承的,Perl是一种不一定以可读性著称的语言。
source_lines = IO.readlines('source_file.txt')
start_line   = source_lines.index{ |line| line =~ /SOURCE_LINE/ } + 1
File.open( 'other_file.txt', 'w' ) do |f|
  f << source_lines[ start_line..-1 ].join( "\n" )
end
started = false
File.open( 'other_file.txt', 'w' ) do |output|
  IO.foreach( 'source_file.txt' ) do |line|
    if started then
      output << line
    elsif line =~ /FILE_SOURCES/
      started = true
    end
  end
end