簡體   English   中英

從文件中讀取某些行

[英]Read Certain Lines from File

嗨剛剛進入Ruby,我正在嘗試學習一些基本的文件讀取命令,我還沒有找到任何可靠的來源。

我試圖通過該文件中的某些行,直到文件的末尾。

所以在文件里面寫着FILE_SOURCES我想讀取文件末尾的所有來源,並將它們放在一個文件中。

我發現打印整個文件,並替換文件中的單詞,但我只是想讀取文件中的某些部分。

如果你試圖從某個以某種方式分隔的文件中提取一個部分,通常你會遵循這樣的模式:

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

您可以根據您所在文件的哪個部分從一種狀態更改為另一種狀態。

我會這樣做(假設你可以將整個文件讀入內存):

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

相關方法:

  • IO.readlines將行讀入數組
  • Array#index用於查找與正則表達式匹配的第一行的索引
  • File.open在磁盤上創建一個新文件(完成后自動關閉)
  • Array#[]獲取從索引到結尾的行子集

如果你無法將整個文件讀入內存,那么我會對@ tadman的基於狀態的文件做一個更簡單的變化:

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

歡迎來到Ruby!

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 
}

IO函數不知道文件中的“行”是什么。 沒有簡單的方法可以跳到文件中的某一行,您必須全部閱讀並忽略您不需要的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM