0

次の形式のカンマ区切りの CSV ファイルがあるとします。

Day,User,Requests,Page Views,Browse Time,Total Bytes,Bytes Received,Bytes Sent
"Jul 25, 2012","abc123",3,0,0,13855,3287,10568
"Jul 25, 2012","abc230",1,0,0,1192,331,861
"Jul 25, 2012",,7,0,0,10990,2288,8702
"Jul 24, 2012","123456",3,0,0,3530,770,2760
"Jul 24, 2012","abc123",19,1,30,85879,67791,18088

キー 1 が重複キー、キー 2 が重複キーである可能性があるが、キー 1 と 2 が一緒に一意になるように、データセット全体 (30 日間で 1000 ユーザー = 30,000 レコード) をハッシュにドロップしたかったのです。

上記の 1 行目を使用した例:

report_hash = "2012 年 7 月 25 日" => "abc123" => {"PageRequest" => 3、"PageViews" => 0、"BrowseTime" => 0、"TotalBytes" => 13855、"BytesReceived" => 3287 、「BytesSent」=> 10568}

def hashing(file)
  #read the CSV file into an Array
  report_arr = CSV.read(file)
  #drop the header row
  report_arr.drop(1)
  #Create an empty hash to save the data to
  report_hash = {}
  #for each row in the array,
  #if the first element in the array is not a key in the hash, make one
  report_arr.each{|row|
    if report_hash[row[0]].nil?
      report_hash[row[0]] = Hash.new
    #If the key exists, does the 2nd key exist?  if not, make one
    elsif report_hash[row[0]][row[1]].nil?
      report_hash[row[0]][row[1]] = Hash.new
    end
    #throw all the other data into the 2-key hash
    report_hash[row[0]][row[1]] = {"PageRequest" => row[2].to_i, "PageViews" => row[3].to_i, "BrowseTime" => row[4].to_i, "TotalBytes" => row[5].to_i, "BytesReceived" => row[6].to_i, "BytesSent" => row[7].to_i}
  }
  return report_hash
end

ここまで到達するために、ハッシュと関連コンテンツの学習に数時間を費やしましたが、これを行うためのはるかに効率的な方法があるように感じます。最初の 2 つのキーが配列の最初の 2 つの要素であるネストされたハッシュを作成して、「複合」一意キーを作成する適切な/より効率的な方法に関する提案はありますか?

4

1 に答える 1

2

配列[day, user]をハッシュキーとして使用できます。

report_hash = {
  ["Jul 25, 2012","abc123"] =>
    {
      "PageRequest" => 3,
      "PageViews" => 0,
      "BrowseTime" => 0,
      "TotalBytes" => 13855,
      "BytesReceived" => 3287,
      "BytesSent" => 10568
    }
}

日付とユーザーが常に同じように表示されるようにする必要があります。たとえば、日付が時々異なる形式で表示される場合は、それを使用してハッシュを読み書きする前に、それを正規化する必要があります。

同様の方法は、日 + ユーザーを区切り文字を使用して文字列に変換することです。ただし、区切り文字が日またはユーザーに表示されないように、より注意する必要があります。

編集:

また、ハッシュ キーを変更しないようにしてください。配列をキーとして使用すると、これは非常に簡単な間違いになります。本当にやりたい場合は、次dupのようにを使用してコピーを変更できます。

new_key = report_hash.keys.first.dup
new_key[1] = 'another_user'
于 2012-07-31T20:52:54.840 に答える