第一列有一些用户,第二列有他们的 friend 。一些用户出现在两个列中,一些用户只出现在一个列中。

我想散列整个数据集以将所有条目转换为数字以便于处理。我的代码是这样的:

require 'csv'

udids = {}
unique_count = 1

output_csv = CSV.open("Processed.csv", "w")

CSV.foreach("Original.csv").with_index do |row, i|

  val = row[0]
  if udids[val.to_sym]
    row[0] = udids[val.to_sym]
  else
    udids[val.to_sym] = unique_count
    row[0] = unique_count
    unique_count += 1
  end

  val = row[1]
  if udids[val.to_sym]
    row[1] = udids[val.to_sym]
  else
    udids[val.to_sym] = unique_count
    row[1] = unique_count
    unique_count += 1
  end

  output_csv << row
end

output_csv.close

但这产生了我认为可能不是正确转换的结果。这是一个示例输出:
1   2
1   3
1   4
1   5
1   51
1   52
1   53
54  55
54  56
54  57
54  58
54  59
54  90
54  91
54  92
93  94
93  95
93  96
...

在这里,两列不共享任何单个值,而这种情况极不可能发生。另外,即使这是正确的,我也希望它将其作为相应的示例输出生成:
1   2
1   3
1   4
1   5
1   51
1   52
1   53
2   55
2   56
2   57
2   58
2   59
2   90
2   91
2   92
3   94
3   95
3   96
...

那么,有人可以帮助我吗?谢谢。

最佳答案

在没有看到您的输入的情况下很难调试您的程序。我猜你的代码的一个问题是 CSV 文件中有空格。由于您没有去除空格,因此名称“大卫”将与名称“大卫”不同,并获得不同的 ID。

这是一些对我来说很好用的代码,而且也更短:

require 'csv'

udids = {}
unique_count = Enumerator.new do |y|
  c = 0
  loop { y << (c += 1) }
end

output_csv = CSV.open('output.csv', 'w')

CSV.foreach('students.csv') do |row|
  row[0] = (udids[row[0].strip] ||= unique_count.next)
  row[1] = (udids[row[1].strip] ||= unique_count.next)
  output_csv << row
end

output_csv.close

关于ruby - 在 Ruby 中,散列共享某些值的两列的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33069018/

10-13 04:45