gpt4 book ai didi

ruby - 在 Ruby 中,对于包含大量行的 CSV 列,将字母数字条目转换为整数的最佳方法是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 09:02:10 25 4
gpt4 key购买 nike

我的 CSV 包含大约 6000 万行。第 10 列包含一些字母数字条目,其中一些重复,我想通过一对一映射将其转换为整数。也就是说,我不希望 Original.csv 中的相同条目在 Processed.csv 中具有多个对应的整数值。因此,最初,我编写了以下代码:

require 'csv'
udids = []
CSV.open('Original.csv', "wb") do |csv|
CSV.foreach('Processed.csv', :headers=>true) do |row|
unless udids.include?(row[9])
udids << row[9]
end
udid = udids.index(row[9]) + 1
array = [udid]
csv<<array
end
end

但是,这个程序花了很多时间,我很快意识到这是因为它必须检查所有以前的行以确保只有新值被分配一个新的整数值,而现有的没有被分配任何新值(value)。

所以,我想到了对它们进行哈希处理,因为在网上探索这个问题时,我了解到哈希比顺序比较更快,不知何故(我没有阅读有关如何进行的详细信息,但无论如何......)所以,我写了下面的代码来散列它们:

arrayUDID=[]
arrayUser=[]
arrayHash=[]
array1=[]

f = File.open("Original.csv", "r")
f.each_line { |line|
row = line.split(",");
arrayUDID<<row[9]
arrayUser<<row[9]
}

arrayUser = arrayUser.uniq
arrayHash = []

for i in 0..arrayUser.size-1
arrayHash<<arrayUser[i]
arrayHash<<i
end

hash = Hash[arrayHash.each_slice(2).to_a]

array1=hash.values_at *arrayUDID

logfile = File.new("Processed.csv","w")
for i in 0..array1.size-1
logfile.print("#{array1[i]}\n")
end
logfile.close

但在这里,我再次观察到程序花费了大量时间,我意识到这一定是由于哈希数组(或哈希表)内存不足所致。

那么,您能否建议在合理的时间内对我的大文件起作用的任何方法?合理的数量,我的意思是在 10 小时内,因为我意识到这至少需要几个小时,因为从更大的数据集中提取该数据集需要大约 5 个小时。因此,对于我前面提到的代码,即使在运行程序 2 天后也没有完成。因此,如果您能提出一种可以通过让计算机整夜开机来完成任务的方法,那就太好了。谢谢。

最佳答案

我认为这应该可行:

udids = {}
unique_count = 1

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

CSV.foreach("Original.csv").with_index do |row, i|
output_csv << row and next if i == 0 # skip first row (header info)
val = row[9]
if udids[val.to_sym]
row[9] = udids[val.to_sym]
else
udids[val.to_sym] = unique_count
row[9] = unique_count
unique_count += 1
end
output_csv << row
end

output_csv.close

性能在很大程度上取决于有多少重复项(越多越好),但基本上它会跟踪每个值作为散列中的键,并检查它是否遇到了该值。如果是,它使用相应的值,如果不是,它增加一个计数器,将计数存储为该键的新值并继续。

我能够在大约 3 分钟内处理一个 1000 万行的测试 CSV 文件。

关于ruby - 在 Ruby 中,对于包含大量行的 CSV 列,将字母数字条目转换为整数的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32877631/

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