[英]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
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.