第一列有一些用户,第二列有他们的 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/