2

編集:問題は、ハッシュ内の配列の量を取得できないため、x = 配列の量になる可能性があります。function.each_index{|x| として使用できます。コード}

CSV ファイルから取得されるデータの量に応じて、アクションを X 回繰り返す方法として、行数のインデックスを使用しようとしています。

端末発行

=> Can't convert symbol to integer (TypeError)

完全なエラー:

=> ~/home/tests/Product.rb:30:in '[]' can't convert symbol into integer (TypeError) from ~home/tests/Product.rub:30:in 'getNumbRel'
from test.rb:36:in '<main>'

アクションを実行している関数は次のとおりです。

def getNumRel
  if defined? @releaseHashTable
     return @releaseHashTable[:releasename].length
  else
      @releaseHashTable = readReleaseCSV()
      return @releaseHashTable[:releasename].length
  end
end

csv データ プルは単なる配列のハッシュであり、派手なものではありません。

def readReleaseCSV()
   $log.info("Method "+"#{self.class.name}"+"."+"#{__method__}"+" has started")
   $log.debug("reading product csv file")
   # Create a Hash where the default is an empty Array
   result = Array.new
   csvPath = "#{File.dirname(__FILE__)}"+"/../../data/addingProdRelProjIterTestSuite/releaseCSVdata.csv"
   CSV.foreach(csvPath, :headers => true, :header_converters => :symbol) do |row|
     row.each do |column, value|
       if "#{column}" == "prodid"
         proHash = Hash.new { |h, k| h[k] = [ ] }
         proHash['relid'] << row[:relid]
         proHash['releasename'] << row[:releasename]
         proHash['inheritcomponents'] << row[:inheritcomponents]

         productId = Integer(value)
         if result[productId] == nil
            result[productId] = Array.new
         end

         result[productId][result[productId].length] = proHash
      end
    end
  end
  $log.info("Method "+"#{self.class.name}"+"."+"#{__method__}"+" has finished")
  @productReleaseArr = result
 end
4

3 に答える 3

2

先に進むことはあまりありませ@releaseHashTableんが、ハッシュではなく配列が含まれているようです。

更新:投稿した実装に基づいて、それproductIdが整数であり、の戻り値がreadReleaseCSV()配列であることがわかります。

あなたが望むものを手に入れるためにreleasename、あなたはこれをしなければなりません:

@releaseHashTable[productId][n][:releasename]

ここでproductId、およびnは整数です。それらを具体的に指定するか、(わからない場合はn)特定のすべての製品のすべてのリリース名を収集するためのループを導入する必要がありますproductId

于 2012-12-07T12:09:53.270 に答える
2

申し訳ありませんが、抵抗できませんでした。メソッドをクリーンアップしました。

# empty brackets unnecessary, no uppercase in method names
def read_release_csv
  # you don't need + here
  $log.info("Method #{self.class.name}.#{__method__} has started")
  $log.debug("reading product csv file")
  # you're returning this array. It is not a hash. [] is preferred over Array.new
  result = []
  csvPath = "#{File.dirname(__FILE__)}/../../data/addingProdRelProjIterTestSuite/releaseCSVdata.csv"
  CSV.foreach(csvPath, :headers => true, :header_converters => :symbol) do |row|
    row.each do |column, value|
      # to_s is preferred
      if column.to_s == "prodid"
        proHash = Hash.new { |h, k| h[k] = [ ] }
        proHash['relid'] << row[:relid]
        proHash['releasename'] << row[:releasename]
        proHash['inheritcomponents'] << row[:inheritcomponents]
        # to_i is preferred
        productId = value.to_i
        # this notation is preferred
        result[productId] ||= []
        # this is identical to what you did and more readable
        result[productId] << proHash
      end
    end
  end
  $log.info("Method #{self.class.name}.#{__method__} has finished")
  @productReleaseArr = result
end
于 2012-12-07T12:28:18.377 に答える
1

マーク・トーマスの意味は次のとおりです。

> a = [1,2,3] # => [1, 2, 3] 
> a[:sym]
TypeError: can't convert Symbol into Integer
# here starts the backstrace
    from (irb):2:in `[]'
    from (irb):2

配列は次のようなインデックスによってのみアクセスできるため、a[1]これは配列から 2 番目の要素をフェッチし
ます。配列を返すため、コードが失敗します。

#....
result = Array.new
#....
@productReleaseArr = result
# and then later on you call
@releaseHashTable = readReleaseCSV()
@releaseHashTable[:releasename] # which gives you TypeError: can't convert Symbol into Integer
于 2012-12-07T12:16:19.927 に答える