簡體   English   中英

使用 ruby​​ 將數組放入文件中

[英]Puts arrays in file using ruby

這是我的文件的一部分:

project(':facebook-android-sdk-3-6-0').projectDir = new File('facebook-android-sdk-3-6-0/facebook-android-sdk-3.6.0/facebook')
project(':Forecast-master').projectDir = new File('forecast-master/Forecast-master/Forecast')
project(':headerListView').projectDir = new File('headerlistview/headerListView')
project(':library-sliding-menu').projectDir = new File('library-sliding-menu/library-sliding-menu')

我需要提取庫的名稱。 這是我的紅寶石功能:

def GetArray
  out_file = File.new("./out.txt", "w")
  File.foreach("./file.txt") do |line|
    l=line.scan(/project\(\'\:(.*)\'\).projectDir/)
    File.open(out_file, "w")  do |f|
      l.each do |ch|
        f.write("#{ch}\n")
      end
    end
    puts "#{l} "
  end
end

我的函數返回這個:

[] 
[["CoverFlowLibrary"]] 
[["Android-RSS-Reader-Library-master"]] 
[["library"]] 
[["facebook-android-sdk-3-6-0"]] 
[["Forecast-master"]] 

我的問題是我在out_file什么也沒找到。 如何寫入文件? 否則,我只需要獲取文件中庫的名稱。

思考這個:

"project(':facebook-android-sdk-3-6-0').projectDir'".scan(/project\(\'\:(.*)\'\).projectDir/)
# => [["facebook-android-sdk-3-6-0"]]
  • scan看到捕獲(...) ,它會創建一個子數組。 那不是你想要的。 下意識的反應是flatten生成的數組數組,但這實際上只是代碼上的創可貼,因為您選擇了錯誤的方法。

而是考慮這個:

"project(':facebook-android-sdk-3-6-0').projectDir'"[/':([^']+)'/, 1]
# => "facebook-android-sdk-3-6-0"

這是使用 String 的[]方法來應用帶有捕獲的正則表達式並返回捕獲的文本。 不創建子陣列。

scan功能強大,絕對有它的位置,但不適用於這種“查找一件事”的解析。

關於你的代碼,我會做這樣的未經測試的代碼:

def get_array
  File.new('./out.txt', 'w') do |out_file|
    File.foreach('./file.txt') do |line|
      l = line[/':([^']+)'/, 1]
      out_file.puts l
      puts l
    end
  end
end
  • Ruby 中的方法不是camelCase,而是snake_case。 常量,就像類一樣,以大寫字母開頭,並且是駝峰式的。 不要把所有的 Java 都放在我們身上,特別是如果你想以編寫代碼為生。 所以GetArray應該是get_array 另外,不要以“get_”開始方法,也不要將其稱為array 使用to_a是慣用的。
  • 構建正則表達式時,要從簡單開始,並盡量保持簡單。 這是一個可維護性的東西,有助於減少精神錯亂。 /':([^']+)'/更容易閱讀和理解,並且與您過於復雜的模式相同。 正則表達式引擎貪婪而懶惰,希望盡可能少地工作,這有時是完全邪惡的,但是一旦您了解它們在做什么,就可以編寫非常小/簡潔的模式來完成大事。

    分解它,它基本上是說“找到第一個':然后開始捕獲文本,直到下一個' ,這就是您要查找的內容。 project(可以忽略).projectDir

而實際上,

 /':([^']+)'/

真的可以寫

/:([^']+)'/

但我覺得很慷慨,也尋找領先的'

問題是您打開文件兩次:一次在:

  out_file = File.new("./out.txt", "w")

然后每行一次:

    File.open(out_file, "w")  do |f| ...

試試這個:

def GetArray
  File.open("./out.txt", "w") do |f|
    File.foreach("./file.txt") do |line|
      l=line.scan(/project\(\'\:(.*)\'\).projectDir/)
      l.each do |ch|
        f.write("#{ch}\n")
      end  # l.each
    end    # File.foreach
  end      # File.open
end        # def GetArray

暫無
暫無

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

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