使用ruby将数组放入文件中

时间:2015-09-05 12:17:15

标签: ruby file

这是我文件的一部分:

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')

我需要提取libs的名称。这是我的红宝石功能:

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找不到任何内容。我怎么写文件?否则,我只需要在文件中获取lib的名称。

2 个答案:

答案 0 :(得分:1)

默想:

"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中的方法是 NOT camelCase,它们是snake_case。常量,如类,以大写字母开头,是CamelCase。不要把所有Java都放在我们身上,特别是如果你想为了生活而编写代码。因此GetArray应为get_array。另外,不要使用" get _"开始方法,不要将其称为array;使用to_a是惯用的。
  • 构建正则表达式时,请从简单开始,尽力保持简单。它是一种可维护性的东西,有助于减少精神错乱。 /':([^']+)'/更易于阅读和理解,并且与您过于复杂的模式完成相同的操作。正则表达式引擎是贪婪和懒惰的,并且希望尽可能少地工作,这有时是完全邪恶的,但是一旦你理解了他们正在做什么,就可以编写非常小/简洁的模式来实现大的东西。

    打破它,它基本上说"找到第一个':然后开始捕捉文字直到下一个',这是你正在寻找的。 project(可以忽略).projectDir

实际上,

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

真的可以写

/:([^']+)'/

但我感到很慷慨,并且也在寻找领先的'

答案 1 :(得分:0)

问题是你要打开文件两次:一次进入:

  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