gpt4 book ai didi

arrays - 根据匹配的 id 删除数组中的重复项。导轨

转载 作者:太空宇宙 更新时间:2023-11-03 17:31:04 27 4
gpt4 key购买 nike

所以我有一个 .csv 文件,我已将其导入到一个数组中。它们都是用逗号分隔的,所以我继续为 em 制作了一个漂亮的数组。

现在我正在尝试查找具有匹配 ID 的记录,这样我就可以删除重复项并只保留最后遇到的记录。例如使用 ID

我已经导入到数组,但出于某种原因,我无法获得像 uniq 这样的工具来显示新的唯一列表,即使当我对它执行 .length 时,它会返回正确数量的行。

如有任何帮助,我们将不胜感激。

代码

    lines = []
i = 0

file = File.open("./properties.csv", "r")

elements = Array[]
element2 = Array[]
output = Array[]

while (line = file.gets)
i += 1
# use split to break array up using commas
arr = line.split(',')
elements.push({ id: arr[0], streetAddress: arr[1], town: arr[2], valuationDate: arr[3], value: arr[4] })
end

file.close

# Loop through array and sort nicely
element2 = elements.group_by { |c| c[:id] }.values.select { |elements| elements.size > 1 }


output = (element2.uniq)
puts output

puts element2.length

示例 .CSV 文件

ID,Street address,Town,Valuation date,Value
1,1 Northburn RD,WANAKA,1/1/2015,280000
2,1 Mount Ida PL,WANAKA,1/1/2015,280000
3,1 Mount Linton AVE,WANAKA,1/1/2015,780000
1,1 Northburn RD,WANAKA,1/1/2015,330000
2,1 Mount Ida PL,WANAKA,1/1/2015,330000
3,1 Mount Linton AVE,WANAKA,1/1/2015,830000
1,1 Northburn RD,WANAKA,1/1/2016,340000
2,1 Mount Ida PL,WANAKA,1/1/2016,340000
3,1 Mount Linton AVE,WANAKA,1/1/2016,840000
4,1 Kamahi ST,WANAKA,1/1/2016,215000
5,1 Kapuka LANE,WANAKA,1/1/2016,209000
6,1 Mohua MEWS,WANAKA,1/1/2016,620000
7,1 Kakapo CT,WANAKA,1/1/2016,490000
8,1 Mt Gold PL,WANAKA,1/1/2016,1320000
9,1 Penrith Park DR,WANAKA,1/1/2016,1310000

最佳答案

所以我实际上已经改变了使用哈希的方法。哪个似乎会自动删除重复项并完整保留最后遇到的记录?任何人都可以在这里阐明一下吗?

    require 'csv'

element = {}

CSV.foreach("properties.csv", :headers => true, :header_converters => :symbol) do |row|
element[row.fields[0]] = Hash[row.headers[1..-1].zip(row.fields[1..-1])]
end

puts element["1"]

element.each do |key, value|
puts key
puts value
end

puts "#{element.length} records returned"

要保留第一个而不是最后一个匹配元素,您可以在分配值之前检查键是否存在。这可以像这样完成:

CSV.foreach("properties.csv", :headers => true, :header_converters => :symbol) do |row|
key = row.fields[0]
if !element.key?(key)
element[key] = Hash[row.headers[1..-1].zip(row.fields[1..-1])]
end
end

也可以像这样更有效地编写:

CSV.foreach("properties.csv", :headers => true, :header_converters => :symbol) do |row|
element[row.fields[0]] ||= Hash[row.headers[1..-1].zip(row.fields[1..-1])]
end

请注意,这些为键保留第一个找到的记录的方法将比为键保留最后找到的记录的版本执行得更好。这是因为工作回避,主要是在生成哈希值时,这是通过此代码中的 slicezip 完成的。

关于arrays - 根据匹配的 id 删除数组中的重复项。导轨,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37176844/

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