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

标签 ruby csv

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

相关文章:

ruby - 如何选择要显示警告的文件?

php - Mysql 导出到 csv 组总计

python - 将嵌套列表逐列写入 CSV

ruby - 语法糖迫使我使用丑陋的语句

ruby - 为什么这个朴素的素数算法会失败?

sql - ActiveRecord 3 "IS IN"其中查询

java - 将动态 SQL 查询保存到 CSV?

ruby-on-rails - Rails 驱动器 Rest Api |使用google api客户端gem共享文件

csv - OpenCsv 读取带有转义分隔符的文件

python - 使用 Pandas 将行数据组转换为列