我正在尝试遍历文件夹,选择以.bowtie.txt结尾的所有文件,计算行数,然后将带有文件名的行数写入散列(甚至是哈希)更好的外部csv但哈希现在会做的)。我得到了这个解决方案
Dir['/Volumes/.../*.bowtie.txt'].inject({}) do |memo, file|
memo[file] = File.readlines(file).select do |line|
line =~ /^[0-9]+\s*(\+|\-)/ # only those, matching
end.count
puts memo
end
然而,这必须选择一个文件,然后在失败之前给我一个哈希,如下所示:
Me:~ me$ ruby /Users/me/Desktop/SequencingScripts/Plots/GeneralScripts/DistinctPositions.rb
{"/Volumes/SeagateBackupPlusDriv/SequencingRawFiles/TumourOesophagealOCCAMS/SequencingScripts/3finalcounts/SLX-9279.GoodDysplasia.FSeqA_BEST2_NEW_0204_LessThan10PCent_HGD_.fq.gz.bowtie.txt"=>31312}
/Users/me/Desktop/SequencingScripts/Plots/GeneralScripts/DistinctPositions.rb:5:in `block in <main>': undefined method `[]=' for nil:NilClass (NoMethodError)
from /Users/me/Desktop/SequencingScripts/Plots/GeneralScripts/DistinctPositions.rb:4:in `each'
from /Users/me/Desktop/SequencingScripts/Plots/GeneralScripts/DistinctPositions.rb:4:in `inject'
from /Users/me/Desktop/SequencingScripts/Plots/GeneralScripts/DistinctPositions.rb:4:in `<main>'
当我不使用puts memo
时,我没有收到错误但我也没有收到任何输出到终端。我如何得到我想要的东西?
答案 0 :(得分:3)
为了在此上下文中使用inject,您需要在结尾处返回memo对象。所以在你的例子中,这看起来像是:
Dir['/Volumes/.../*.bowtie.txt'].inject({}) do |memo, file|
memo[file] = File.readlines(file).select do |line|
line =~ /^[0-9]+\s*(\+|\-)/ # only those, matching
end.count
puts memo
memo
end
这是一个人为的例子来说明同样的错误&amp;分辨率:
[1] pry(main)> [1, 2, 3].inject({}) { |hash, num| hash[num] = 1 }
NoMethodError: undefined method []= for 1:Fixnum
[2] pry(main)> [1, 2, 3].inject({}) { |hash, num| hash[num] = 1; hash }
=> {1=>1, 2=>1, 3=>1}
答案 1 :(得分:1)
如果你使用org.hibernate:hibernate-entitymanager:4.3.10.Final
你的块应该总是在最后一行返回更新的inject
。在你的情况下,在第二次迭代期间,备忘录等于最后一行,因此对于put memo
memo