gpt4 book ai didi

ruby - 在 Ruby 中,散列共享某些值的两列的最佳方法是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 08:03:24 27 4
gpt4 key购买 nike

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

在这里,2 列不共享任何单个值,而这种情况极不可能发生。另外,即使那是正确的,我也希望它会产生相应的示例输出:

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 文件中有空格。由于您没有去除空格,名称“David”将不同于名称“David”,并获得不同的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com